【问题标题】:How to call mysqli_stmt with call_user_func_array?如何用 call_user_func_array 调用 mysqli_stmt?
【发布时间】:2012-11-26 18:31:47
【问题描述】:

我正在尝试将可变数量的参数传递给类的方法。这是我试图调用的类的函数:

class DbHelper{
....
    public function Execute($query, $params){
        $this->open();
        $stmt = $this->mysqli->prepare($query) or die($this->mysqli->error);
        call_user_func_array(array($stmt, 'bind_param'), $params);  // 1
        return $stmt->execute() ? $stmt->num_rows : 'ERROR';
    }
....
}

这是我用来调用函数的代码:

....
$conn = new DbHelper();
$params = array('ss', $ID, $i);
$conn->Execute('INSERT INTO some_table (ID, `Index`) VALUES (?,?)', $params);
....

这给出了一个错误:

警告:mysqli_stmt::bind_param() 的参数 2 应为参考,在 ..mypath..\dbhelper.php 行中给出的值

几个月前我在同一问题上的另一篇帖子(点击here)中,有人建议我使用以下代码:

call_user_func_array(array($stmt, 'bind_param'), refValues($params));

function refValues($arr){
    if (strnatcmp(phpversion(),'5.3') >= 0){ //Reference is required for PHP 5.3+
        $refs = array();
        foreach($arr as $key => $value)
            $refs[$key] = &$arr[$key];
        return $refs;
    }
    return $arr;
}

再次使用它会产生同样的错误。如果我像这样调用函数(在 $params 之前添加 &):

$conn->Execute('INSERT INTO some_table (ID, `Index`) VALUES (?,?)', &$params); // 2

我收到此错误:

已弃用:调用时传递引用已在 ..mypath..\save.php 行中弃用

或者,我已经尝试过函数DbHelper::Execute的这个定义:

public function Execute($query, $params){
    $this->open();
    $stmt = $this->mysqli->prepare($query) or die($this->mysqli->error);
    $stmt->{'bind_param'}($params); // 3
    return $stmt->execute() ? $stmt->num_rows : 'ERROR';
}

调用它会显示错误:

警告:mysqli_stmt::bind_param() 的参数计数错误 ..mypath..\dbhelper.php 上线

其中,如果函数调用正确,则参数计数对 bind_param 是正确的。

PHP的版本是5.3.8。

有什么帮助吗?

【问题讨论】:

  • 你为什么要围绕 mysqli 做一个包装器?如果您准备好继续前进,请查看 PDO,它提供了更多的 OOP API。
  • 几个月前我也尝试过 PDO,但很多事情都无法正常工作。在谷歌搜索错误时,发现 PDO 是“相当”的错误。否则,我承认 PDO 可能是 PHP 最好的数据库访问 API。
  • '相当'越野车?我想知道你在哪里听到的。 PDO 目前是 MySQL(以及一般的 SQL)API 中发展最快、最稳定的 API。命名占位符和 PDOExceptions。这就是我要说的。
  • 我并没有不同意你的观点。正如我所说,几个月前我使用过 PDO,当时它可能是“不稳定的”。我什至在 StackOverflow 上发布了一些问题。你甚至可以谷歌“pdo bugs”。您会在第一页找到许多搜索。无论如何,这些错误现在可能已经修复了。从那以后我没有使用过 PDO。如果现在稳定了,我会很乐意再次使用它。
  • 这些错误是在 2005 年到 2008 年期间提交的。所有这些错误都在很久以前就已修复。我不知道你遇到过什么样的错误,但是我使用 PDO 已经超过几个月了,并且从 PHP 5.0/5.1.x 开始就没有遇到过问题

标签: php mysqli


【解决方案1】:

建议给您的函数也需要通过引用接受$params。这是一个稍微更新的版本:

function refValues(&$arr)
{
    //Reference is required for PHP 5.3+
    if (strnatcmp(phpversion(),'5.3') >= 0)
    {
        $refs = array();
        foreach(array_keys($arr) as $key)
        {
            $refs[$key] = &$arr[$key];
        }
        return $refs;
    }

    return $arr;
}

【讨论】:

  • 好吧,纳尔夫!你救了我免于刮掉我的头发。谢谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-04-27
  • 1970-01-01
  • 1970-01-01
  • 2022-01-11
  • 2014-12-23
相关资源
最近更新 更多