PHP:“......变量可以通过引用传递”在str_replace()?

Posted

技术标签:

【中文标题】PHP:“......变量可以通过引用传递”在str_replace()?【英文标题】:PHP: "... variables can be passed by reference" in str_replace()? 【发布时间】:2011-08-16 02:07:54 【问题描述】:

根据我在另一个*** question 中找到的内容,我创建了一个函数来打印一个包含变量的prepared-statement-sql-string。

这是我的代码:

foreach($params as $idx => $param) 
    if ($idx == 0) continue;
    $sql = str_replace('?', "'" . $param . "'", $sql, 1);

printError($sql);

当我运行它时,我得到:Fatal error: Only variables can be passed by reference 第 3 行。但是当我使用时

$sql = preg_replace('/\?/', "'" . $param . "'", $sql, 1);

对于第 3 行,它工作正常。

知道为什么吗?

【问题讨论】:

【参考方案1】:

最后一个参数 count 是通过引用传递的。您可以在http://us.php.net/str_replace 的描述中看到这一点,其中变量前面有一个&

这意味着你不能在那里使用文字1。你必须这样做:

$sql = str_replace('?', "'" . $param . "'", $sql, $count);
echo $count;

您现在将在屏幕上显示替换了多少实例。

【讨论】:

确实,OP 误解了 $count 参数的实际作用。这是一个“out”参数,而不是“in”参数。 非常正确;更改了我的示例以说明这一点并添加了解释。 哦,我明白了。所以没有办法限制使用 str_replace() 发生的替换量? 不。 str_replace() 没有该选项。正如您已经注意到的,preg_replace() 确实如此。【参考方案2】:

查看preg_replacestr_replace 的文档,您就会明白为什么。 str_replace 的第四个参数必须通过引用传递,但 preg_replace 不是这种情况。

【讨论】:

$countpreg_replace 也是这种情况,但preg_replace$count 参数是第五个,而不是第四个。 OP 将$limitpreg_replace 一起使用,这会做其他事情。【参考方案3】:

我从 VoteyDisciple 重写

$sqlLogin = "SELECT * FROM users inner join role on users.roleId = role.id WHERE email=?1 and password=?2";
function makeSql() 
    $args = func_get_args();
    if(isset($args[1])) 
        $len = sizeof($args);
        //var_dump($args);
        $sql = $args[0];
        for ($index = 1; $index < $len; $index++) 
            $sql = str_replace('?'.strval($index), "'" . $args[$index] . "'", $sql);
        
        return $sql;
    
    return $args[0];

$sql = makeSql($sqlLogin, $myusername1, $mypassword);
$result = mysqli_query($con, $sql);

【讨论】:

以上是关于PHP:“......变量可以通过引用传递”在str_replace()?的主要内容,如果未能解决你的问题,请参考以下文章

PHP 添加st,nd,rd,th到天:D

PHP st,nd,rd,th to Number

关于php的参数传递问题

PHP 将(th,st,nd,rd,th)添加到数字的末尾

在 PHP 中从数组键创建新变量

数据结构常见算法代码实现1-PHP