【问题标题】:How to pass an array of parameters to the bind_param?如何将参数数组传递给 bind_param?
【发布时间】:2013-09-07 08:58:23
【问题描述】:

我收到以下错误:

Warning: Wrong parameter count for mysqli_stmt::bind_param()

我相信这是因为我以错误的方式将参数分配给 bind_param 方法。问题是如何将参数数组传递给bind_param?

这是我的功能:

function read($sql, $params)
{
   $parameters = array();
   $results = array();

   // connect
   $mysql = new mysqli('localhost', 'root', 'root', 'db') or die('There was a problem connecting to the database. Please try again later.');

   // prepare
   $stmt = $mysql->prepare($sql) or die('Error preparing the query');

   // bind param ????????????
   call_user_func_array(array($stmt, 'bind_param'), $params);

   // execute
   $stmt->execute();

   // bind result
   $meta = $stmt->result_metadata();

   while ( $field = $meta->fetch_field() ) {
      $parameters[] = &$row[$field->name]; 
   }

   call_user_func_array(array($stmt, 'bind_result'), $parameters);

   // fetch
   while( $stmt->fetch() ) {
     $x = array();

     foreach( $row as $key => $val ) {
        $x[$key] = $val;
     }

     $results[] = $x;
  }

  return $results;
}

我是这样称呼它的:

$params = array('i'=>$get_release, 'i'=>$status);
$result_set = read('SELECT release_id, release_group_id, status_id, name, subname, description, released_day, released_month, released_year, country_id, note, is_master_release, seo_url, meta_description, is_purchased FROM `release` WHERE release_id = ? AND status_id = ?', $params);

【问题讨论】:

  • 您是在尝试执行多个查询还是尝试将多个参数绑定到单个查询?
  • 我试图将许多参数绑定到单个查询。我虽然使用关联数组将类型和值传递给 bind_param
  • 您使用 MySQLi 的原因有哪些?我认为 PDO 的离散 PDOStatement::bindParam 会更合适
  • @Phil 也许在未来的更新中我会使用 pdo

标签: php mysql prepared-statement


【解决方案1】:

这看起来不对:

$params = array('i'=>$get_release, 'i'=>$status);

来自the docs

注意,当定义了两个相同的索引时,最后一个会覆盖第一个。

您正在传递一个包含一个元素的数组,而您的语句有两个占位符。

【讨论】:

  • 数组有 2 个元素(占位符),不是吗? $get_release 的类型 i 和 $status 的类型 i
  • @Marco - array() 的语法是索引(整数或字符串)位于 => 的左侧,值位于右侧。您对$get_release$status 使用相同的索引。第二个打败了第一个,所以你的数组只有一个长。根据the docs,对于两个占位符位置,您应该将三个参数传递给bind_param,因此数组应该是:array('ii', $get_release, $status)
  • 我不知道你可以像这样在一个数组中传递所有内容
  • 我不确定在我的函数中下一步该做什么,一旦我以这种方式声明数组
  • @Marco - 有关解决方案,请参阅 this thread。它非常接近你想要做的事情。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-04-03
  • 2021-12-10
  • 1970-01-01
  • 2018-07-07
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多