PHP中的str_replace()函数中的“...变量可以通过引用传递”是什么意思?

24

我创建了一个函数,用于打印包含变量的准备好的语句SQL字符串,基于我在这个StackOverflow问题中找到的内容。

这是我的代码:

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行就可以正常工作。

有什么想法吗?

3个回答

43
最后一个参数 count 是按引用传递的。你可以在描述中看到这一点,网址是 http://us.php.net/str_replace,其中变量前面有一个 & 符号。
这意味着你不能在那里使用文字 1。你必须这样做:
$sql = str_replace('?', "'" . $param . "'", $sql, $count);
echo $count;

现在屏幕上会显示替换了多少个实例。


19
确实,OP误解了$count参数的实际作用。它是一个“输出”参数,而不是一个“输入”参数。 - Lightness Races in Orbit
1
非常正确;我改变了我的例子来说明这一点,并添加了解释。 - VoteyDisciple
哦,我明白了。所以没有办法限制使用str_replace()函数进行替换的次数? - Dexter
2
不行。str_replace() 没有那个选项。正如你已经注意到的,preg_replace() 有。 - VoteyDisciple

2

看一下 preg_replacestr_replace 的文档,你就会明白为什么了。在使用 str_replace 时,第四个参数必须通过引用传递,但这对于 preg_replace 并非如此。


2
这也适用于preg_replace中的$count,但是preg_replace$count 参数是第五个,而不是第四个。 OP 在 preg_replace 中使用了 $limit,它会执行其他操作。 - Lightness Races in Orbit

0

我从 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);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接