【问题标题】:mysqli_stmt_bind_param - expects references [duplicate]mysqli_stmt_bind_param - 期望引用
【发布时间】:2017-06-17 19:22:00
【问题描述】:

我知道我们必须将引用传递给mysqli_stmt_bind_param。我正在做以下事情

    $ref = refValues($data);
    function refValues($arr){
        $refs = array();
        foreach($arr as $key => $value)
            $refs[$key] = &$arr[$key];
            var_dump(implode(",", $refs));
            return $refs;
    return $arr;
}

我将所有值都放在一个数组中。我正在使用上述函数来获取参考。 Got the above answer from SO

我的 PHP 版本是 5.6

我正在通过以下方式绑定参数。

mysqli_stmt_bind_param($stmt, $types, $ref);

$stmt 是通过mysqli_prepare 创建的语句。它返回错误号 0。

$types 只不过是$types = str_pad('',count($data),'s');

我也验证了$types 数据。它返回预期的类型数量。即ssssssss

如果我执行,我会收到以下错误。

 Only variables should be passed by reference in test.php

我在 SO 中找到了this 解决方案。我不能分配 100 个变量。我不认为这是可行的。

我发现另一种选择是call_user_func_arrary

$values =  refValues($data);
call_user_func_array(array($stmt, 'bind_param'), $values);

它返回number of bind type doesn't match number of values。这对我来说很奇怪。我已经验证了数组和值。两个计数是匹配的。我不知道 call_user_func_array 的内部实现。

请告诉我有什么方法可以有效地解决这个问题。

【问题讨论】:

  • 嗯,首先,function refValues($arr){ 创建了$data 的副本
  • @Xorifelse 请查看更新后的链接。 34 票赞成答案。它不会创建引用吗?
  • 在您的代码中$ref 是一个包含引用的数组(值)。
  • bind_param 第一个参数是字符串类型。
  • @u_mulder 是的。我明白那个。谢谢。请让我知道当引用已经存在时,为什么该 func 期望引用?我做错什么了吗?

标签: php mysqli


【解决方案1】:

这一行

mysqli_stmt_bind_param($stmt, $types, $ref);

表示您有 一个 引用来绑定。

为什么?让我们看看:

  • 第一个参数是一个语句
  • 第二个参数是一个带类型的字符串
  • 以下参数是对应该绑定的值的引用。

当您传递一个参数时(它是$ref) - 您正在尝试仅绑定 一个 值。 $ref 不是引用,它是引用的值数组。看到不同?引用数组与引用。

所以,你采取了第二种方法,而且是正确的:

$values =  refValues($data);
call_user_func_array(array($stmt, 'bind_param'), $values);

这里有什么错误?你没有传递类型$types

// do not assign anything to a variable
// pass results of `refValues` directly to `call_user_func_array`
call_user_func_array(array($stmt, 'bind_param'), array_merge(array($types), refValues($data)));

我们在这里做什么:我们试图调用$stmt->bind_param并将参数作为数组传递给这个函数。

$stmt->bind_param的参数是什么?

  • 第一个参数是类型 ($types)
  • 以下参数是对值的引用 ($values)

现在应该可以了。

【讨论】:

  • 我收到`警告:mysqli_stmt::bind_param() 的参数 2 应作为参考,值已给定`有帮助吗?
  • @GopsAB 使用 PDO
【解决方案2】:

有两种方法可以避免这种麻烦:

  1. 使用 PDO。您当前的问题只是 mysqli 将遇到的许多 WTF 中的第一个。在这种特殊情况下,它会像

    一样简单和自然
    $stmt = $db->prepare($sql);
    $stmt->execute($data);
    
  2. 好吧,你有这样一个使用 mysqli 的心血来潮。那么,只要你使用的是受支持的 PHP 版本,you can use a splat or a three dot operator:

    $stmt = $db->prepare($sql);
    $types = str_repeat('s', count($data));
    $statement->bind_param($types, ...$data);
    $statement->execute();
    

【讨论】:

  • 谢谢。我会考虑升级到 PDO。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-03-18
  • 1970-01-01
  • 2019-01-04
  • 2020-06-09
  • 1970-01-01
相关资源
最近更新 更多