PHP 5.3.1通过引用传递问题

2021/01/30 22:41 · php ·  · 0评论

好的,这是一个奇怪的问题,所以请按我的解释忍受。

我们将开发服务器从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声明中引用传入的var,但这是(相对)本机方法(mysqli)。

有人经历过吗?我该如何解决?

谢谢。

您正在传递元素数组($ passArray)。传递的数组第二个项目必须是一个引用,因为这实际上是您要传递给该函数的项目的列表。

我只是遇到了同样的问题,通过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;

}

实际上,请注意,PHP 5.3.1中存在一个与引用和所有call功能族有关的错误

PHP错误#50394:引用参数转换为__call中的值

您看到的行为可能是此错误导致的,从长远来看,任何以代码方式修复它的尝试都可能导致问题。

此问题已在PHP的SVN版本中修复。在5.3.2发行之前,您可以编译新版本以使用,或降级到较早版本。

这段代码遇到了同样的问题:

call_user_func(array($strCartHandler, 'CartPurchaseEvent'), $strCartEvent, $objToUser, null, $this);

我的解决方案是call_user_func完全跳过并执行以下操作:

$strCartHandler::CartPurchaseEvent($strCartEvent, $objToUser, null, $this);

我认为不推荐使用的是通过函数传递引用。在函数定义中,您可以执行以下操作:

function(&$arg) {

}

这对您没有多大帮助,但是您可能仍然不需要通过引用。我想您可以尝试包装函数。

function wrapper($stmt, &$passArray) {
    call_user_func_array($stmt, $passArray);
}

我认为mysqli_bind_param()mysqli_bind_result()函数很难使用。我遇到了与您描述的结合使用时遇到的相同困难call_user_func_array()

我的解决方法是停止使用mysqli,而是使用PDO_mysql。它的用法要简单得多:

$pdoStmt->execute( $passArray );

这将有助于:

<?php
call_user_func_array(Array($stmt, 'bind_param'), array(&$passArray));

function bind_param ($val)
{
    $val = (is_array($val)) ? $val[0] : $val;

    // operations...
}

?>

我有一个类似的问题,当前代码不起作用:

$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);
...

它说:“ mysqli_stmt :: bind_param()的参数2应该是一个引用,给定值”

然后,在绝望中,我试图将$ from_var和$ to_var放在引号中。而且有效!

$params=Array('ii');
array_push($params,"$from_var");
array_push($params,"$to_var");

希望它会帮助某人,祝你好运:)

第二个参数必须是数组。显然,这仅在5.3中执行

本文地址:http://php.askforanswer.com/php-5-3-1tongguoyinyongchuandiwenti.html
文章标签: ,   ,  
版权声明:本文为原创文章,版权归 admin 所有,欢迎分享本文,转载请保留出处!

文件下载

老薛主机终身7折优惠码boke112

上一篇:
下一篇:

评论已关闭!