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_replace
和str_replace
的文档,您就会明白为什么。 str_replace
的第四个参数必须通过引用传递,但 preg_replace
不是这种情况。
【讨论】:
这$count
和preg_replace
也是这种情况,但preg_replace
的$count
参数是第五个,而不是第四个。 OP 将$limit
与preg_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()?的主要内容,如果未能解决你的问题,请参考以下文章