【问题标题】:How can I pass an array to $stmt->execute()?如何将数组传递给 $stmt->execute()?
【发布时间】:2016-08-30 04:27:24
【问题描述】:

我正在尝试重写一些代码以消除call_user_func_array 调用,并且到目前为止有以下代码:

if($stmt = $this->_db->prepare($sql)) {
    $bind_arguments = $this->params;

    // remove first element (eg. 'ssiss')
    $bind_arguments = array_shift($bind_arguments);

    // execute query passing values
    $res = $stmt->execute($bind_arguments);

}

这是var_export 中的$this->params

array ( 0 => 's', 1 => 'admin', )

$res 在尝试上述方法时总是评估为null。根据this comment,看来一切都是正确的,除了我的数组有整数键,并且在最后一个元素之后还有一个额外的,

我需要做什么来格式化这个数组(删除第一个元素),传递给$stmt->execute方法作为包含数组元素的变量(这不是一个静态数组。其中的元素被其他修改类中添加或删除元素的方法)。

【问题讨论】:

  • 这在 mysqli 中是出了名的困难,但在 PDO 中却微不足道。考虑切换
  • mysqli::execute(oo 接口)在php.net/manual/en/mysqli-stmt.execute.php中不需要数组
  • 仅供参考,comment you linked to 是在谈论 PDO,而不是 MySQLi
  • $bind_arguments = array_shift($bind_arguments); 将移位参数分配给 $bind_arguments... 您没有传递数组。你传递了它的第一个元素。
  • @SamuelJackson 返回移位值,如果数组为空或不是数组,则返回NULL。 php.net/manual/en/function.array-shift.php

标签: php arrays mysqli prepared-statement


【解决方案1】:

首先,直截了当:您不能将数组传递给 mysqli_execute(),因为此函数根本不接受任何参数。你真正需要的是将一个数组传递给 mysqli_bind_param()

但是,调用 call_user_func_array 的唯一方法是使用 splat 运算符,自 PHP 5.6 起就可以使用

function query($query, $params = NULL, $types = NULL)
{
    $statement = $this->mysqli->prepare($select);
    $types = $types ?: str_repeat('s', count($params));
    $statement->bind_param($types, ...$params);
    $statement->execute();
    return $statement;
}

然而,首选且防弹的解决方案显然是切换到 PDO,它确实能够将带有参数的数组直接发送到 execute()。

【讨论】:

  • ... 一个术语,还是只是表示“其他东西”?
  • @SamuelJackson 它是 PHP 中一个 [相对] 新的运算符,请检查 php.net/manual/ru/migration56.new-features.php 的“参数解包”
  • 不错。 "..." php operator 的东西:)
  • 将其标记为正确阅读该运算符(5.6)非常酷,但由于某种原因,它似乎对我不起作用。除了拥有 php 5.6 之外,我还需要启用对它的支持吗?我没有收到任何错误,但我尝试了$bind_arguments = $this->params; $types = array_shift($bind_arguments); $stmt->bind_param( $types, ...$bind_arguments );$stmt->bind_param( ...$this->params );。两者都不会给出错误,但它们会产生相同的结果,在 $stmt->execute() 之后我无法从中获得任何结果。
  • 您不能对 bind_param 进行两次调用。它应该只有一个。在您的情况下,您应该摆脱数组移位并制作类似$stmt->bind_param(...$this->params)
【解决方案2】:

数组应该是关联数组,键名应该是表的列名,数据应该是键的值。像下面这样:

$arr = [ 'column1' => 'value1', 'column2' => 'value2' ];

比使用$res = $stmt->execute($arr);

【讨论】:

  • 从我在文档中看到的,这是一种方式,但另一种方式只是值本身
  • 插入表 (column1,column2) 值 (?,?),(?,?) 并在 execute($arr) 中传递数组,无需使用关联数组。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-04-30
  • 1970-01-01
  • 1970-01-01
  • 2021-06-15
  • 2014-03-18
相关资源
最近更新 更多