我创建了一个函数,根据我在其他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行,它可以正常工作。
知道为什么吗?
答案 0 :(得分:35)
最后一个参数count通过引用传递。您可以在http://us.php.net/str_replace的说明中看到此信息,其中变量前面有&
。
这意味着你不能在那里使用文字1
。你必须这样做:
$sql = str_replace('?', "'" . $param . "'", $sql, $count);
echo $count;
现在,您将在屏幕上显示已更换的实例数。
答案 1 :(得分:2)
查看preg_replace
和str_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);