好的,这是一个奇怪的问题,所以请在我解释时请耐心等待。
我们将开发服务器从PHP 5.2.5升级到5.3.1。
切换后加载我们的代码,我们开始收到如下错误:
Warning: Parameter 2 to mysqli_stmt::bind_param() expected to be a reference, value given in /home/spot/trunk/system/core/Database.class.php on line 105
上述(105)的行如下:
call_user_func_array(Array($stmt, 'bind_param'), $passArray);
我们将该行更改为以下内容:
call_user_func_array(Array($stmt, 'bind_param'), &$passArray);
此时(因为allow_call_time_pass_reference
)被关闭,php会抛出这个:
Deprecated: Call-time pass-by-reference has been deprecated in /home/spot/trunk/system/core/Database.class.php on line 105
尝试解决此问题一段时间后,我发生故障并将allow_call_time_pass_reference
设置为开启。
摆脱了Deprecated
警告,但现在每次都发出Warning: Parameter 2 to mysqli_stmt::bind_param() expected to be a reference
警告,有或没有引用。
我不知道如何解决这个问题。如果目标方法是我自己的,我只会在func声明中引用传入的变量,但它是一个(相对)本机方法(mysqli)。
有没有人经历过这个?我怎么能绕过它?
谢谢。
答案 0 :(得分:45)
我刚遇到同样的问题,通过call_user_func_array调用bind_param并传递一组参数。解决方案是修改要引用的数组中的值。它不优雅,但它的工作原理。
call_user_func_array(array($stmt, 'bind_param'), makeValuesReferenced($passArray));
function makeValuesReferenced($arr){
$refs = array();
foreach($arr as $key => $value)
$refs[$key] = &$arr[$key];
return $refs;
}
答案 1 :(得分:16)
您正在传递一个元素数组($ passArray)。传递的数组中的第二项 需要作为引用,因为这实际上是您传递给函数的项目列表。
答案 2 :(得分:6)
实际上,请注意PHP 5.3.1中存在有关引用和所有call
函数系列的错误:
PHP Bugs #50394: Reference argument converted to value in __call
您看到的行为可能是此错误的结果,任何尝试以代码方式修复它的行为都可能导致长期问题。
问题已在PHP的SVN版本中修复。在5.3.2发布之前,您可以编译新版本以供使用,或降级到早期版本。
答案 3 :(得分:3)
我们遇到了与此代码相同的问题:
call_user_func(array($strCartHandler, 'CartPurchaseEvent'), $strCartEvent, $objToUser, null, $this);
我的解决方案是完全跳过call_user_func
并执行此操作:
$strCartHandler::CartPurchaseEvent($strCartEvent, $objToUser, null, $this);
答案 4 :(得分:2)
我认为不推荐使用的是通过函数传递引用。在函数定义中,您可以执行以下操作:
function(&$arg) {
}
这对你没有多大帮助,但你可能无论如何都不需要传递参考。我想你可以尝试一个包装函数。
function wrapper($stmt, &$passArray) {
call_user_func_array($stmt, $passArray);
}
答案 5 :(得分:0)
我认为mysqli_bind_param()
和mysqli_bind_result()
函数使用起来非常笨拙。我遇到了与您在call_user_func_array()
我的解决方法是停止使用mysqli而是使用PDO_mysql。它更容易使用:
$pdoStmt->execute( $passArray );
答案 6 :(得分:0)
这会有所帮助:
<?php
call_user_func_array(Array($stmt, 'bind_param'), array(&$passArray));
function bind_param ($val)
{
$val = (is_array($val)) ? $val[0] : $val;
// operations...
}
?>
答案 7 :(得分:0)
我遇到了类似的问题,目前的代码没有用:
$query="Select id,name FROM mytable LIMIT ?,?";
$params=Array('ii');
array_push($params,$from_var);
array_push($params,$to_var);
...
$stmt=$link->prepare("$query");
$ref=new ReflectionClass('mysqli_stmt');
$method=$ref->getMethod("bind_param");
$method->invokeArgs($stmt,$params);
...
它告诉“参数2到mysqli_stmt :: bind_param()应该是一个参考,给定值”
然后,在绝望中,我试图用引号中的$ from_var和$ to_var。它有效!
$params=Array('ii');
array_push($params,"$from_var");
array_push($params,"$to_var");
希望,它会帮助别人,祝你好运:)。
答案 8 :(得分:-1)
第二个参数必须是数组。显然这只是在5.3
中执行