MySQLi“bind_param”在循环中

时间:2013-08-10 16:10:25

标签: php mysqli

为什么我不能像这样使用“bind_param”?有没有其他方法可以在循环中使用Binding?

$insert = $this->db->prepare('INSERT INTO '.$tableName.' ('.implode($colum, ', ').') VALUES ('.implode($placeholder, ', ').'); ');

for ($i=0;$i<$count;$i++) { 
    $insert->bind_param($query[$i]['type'], $query[$i]['value']); 
}

1 个答案:

答案 0 :(得分:1)

嗯,您的错误非常清楚:您的$placeholder数组不包含与$query数组中的参数相同数量的占位符。

检查构建$placeholder$query数组的代码。如果找不到问题,请在问题中添加该段代码。


好的,抱歉,我不习惯mysqli。显然你必须在一次调用中将所有参数传递给bind_param。这很烦人,但有一个解决方法。

call_user_func_array函数允许您将参数作为数组传递给函数。

所以你可以:

  • 通过循环参数构造类型字符串;
  • 使用索引0处的字符串创建数组$params,并在后续索引处创建参数值;
  • 致电call_user_func_array(array($insert, 'bind_param'), $params);

看起来像这样:

$insert = $this->db->prepare('INSERT INTO '.$tableName.' ('.implode($colum, ', ').') VALUES ('.implode($placeholder, ', ').'); ');

$values = array();
for ($i=0 ; $i<$count ; $i++) { 
    $types .= $query[$i]['type']; // this needs to be one single character from [idsb]
    $values[] = $query[$i]['value'];
}

$params = array_merge(array($types), $values);
call_user_func_array(array($insert, 'bind_param'), $params);