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

时间:2011-04-30 14:25:40

标签: php pass-by-reference str-replace

我创建了一个函数,根据我在其他StackOverflow 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行,它可以正常工作。

知道为什么吗?

3 个答案:

答案 0 :(得分:35)

最后一个参数count通过引用传递。您可以在http://us.php.net/str_replace的说明中看到此信息,其中变量前面有&

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

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

现在,您将在屏幕上显示已更换的实例数。

答案 1 :(得分:2)

查看preg_replacestr_replace的文档,您将看到原因。 str_replace的第四个参数必须通过引用传递,但preg_replace不是这种情况。

答案 2 :(得分: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);