我根据我在其他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行,它工作正常。
知道为什么吗?
最后一个参数count通过引用传递。您可以在http://us.php.net/str_replace的描述中看到这一点,其中变量前面有一个&
。
这意味着你不能在那里使用文字1
。你必须这样做:
$sql = str_replace('?', "'" . $param . "'", $sql, $count);
echo $count;
您现在将在屏幕上显示已更换的实例数。
看看preg_replace
和str_replace
的文档,你会明白为什么。 str_replace
的第四个论点必须通过引用传递,但preg_replace
不是这种情况。
我从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);