所以,我传递的值数组会随着使用而变化,然后将它们插入到数据库中。我的问题是参数绑定的方式。
public function insertValues($table, $cols, $values)
{
$mysqli = new mysqli(DBHOST, DBUSER, DBPASSWORD, DBDATABASE);
$colString = implode(', ', $cols); // x, x, x
$valString = implode(', ', array_fill(0, count($values), '?')); // ?, ?, ?
$sql = "INSERT INTO $table ($colString) VALUES($valString)";
if (!$stmt = $mysqli->prepare($sql))
echo "Prepare failed: (" . $mysqli->errno . ") " . $mysqli->error;
// THIS IS THE PROBLEM AREA
foreach ($values as $v)
if (!$stmt->bind_param('s', $v))
echo "Binding parameters failed: (" . $stmt->errno . ") " . $stmt->error;
if (!$stmt->execute())
echo "Execute failed: (" . $stmt->errno . ") " . $stmt->error;
$stmt->close();
$mysqli->close();
}
我需要一种方法来一次绑定所有参数,而不是一次绑定所有参数,但我无法找到一种有用的方法来实现这一点。任何帮助将不胜感激。
答案 0 :(得分:3)
我在PHP.net(http://php.net/manual/en/mysqli-stmt.bind-param.php)找到了您正在寻找的问题的答案。为了方便起见,我把它贴在这里,所有的功劳都归功于一个男人用电子邮件发送电子邮件Nick9v ^ät^ hotmail -remove- -dot- com
在准备时处理动态数量的字段值 声明我觉得这个课很有用。
[编者注:改变BindParam :: add()以通过引用接受$ value 从而防止在较新版本的PHP中发出警告。]
<?php
class BindParam{
private $values = array(), $types = '';
public function add( $type, &$value ){
$this->values[] = $value;
$this->types .= $type;
}
public function get(){
return array_merge(array($this->types), $this->values);
}
}
?>
用法非常简单。创建一个实例并使用add方法填充。当您准备好执行时,只需使用get方法即可。
<?php
$bindParam = new BindParam();
$qArray = array();
$use_part_1 = 1;
$use_part_2 = 1;
$use_part_3 = 1;
$query = 'SELECT * FROM users WHERE ';
if($use_part_1){
$qArray[] = 'hair_color = ?';
$bindParam->add('s', 'red');
}
if($use_part_2){
$qArray[] = 'age = ?';
$bindParam->add('i', 25);
}
if($use_part_3){
$qArray[] = 'balance = ?';
$bindParam->add('d', 50.00);
}
$query .= implode(' OR ', $qArray);
//call_user_func_array( array($stm, 'bind_param'), $bindParam->get());
echo $query . '<br/>';
var_dump($bindParam->get());
?>
这会让你得到如下结果:
SELECT * FROM users WHERE hair_color =?或者年龄=?或平衡=? array(4){[0] =&gt; string(3)“sid”1 =&gt; string(3)“red”[2] =&gt; int(25)[3] =&gt; float(50)}
答案 1 :(得分:0)
代码不起作用,因为bind_param必须在函数的单个调用中包含所有查询参数,而不是每个参数的多个调用,也需要通过引用传递的变量,所以在foreach调用中它总是是与循环的最后一次迭代中的值相同的变量。
最简单的方法是使用类型和参数组合数组,然后通过调用call_user_func_array将其传递给bind_param,例如:
$params = array();
$types = '';
foreach ($values as $k => $v)
{
$types .= 's';
$params[] = &$values[$k];
}
$bind_params = array_merge(array($types), $params);
if (!call_user_func_array(array($stmt, 'bind_param'), $bind_params))
// ...
请注意,bind_param期望变量通过引用而不是值传递,否则它将是几行构造带有值的数组,而不是foreach循环。