当我尝试使用预准备语句将多个值插入到mysql数据库中时出错。
我一直收到此错误
Warning: mysqli_stmt::bind_param(): Number of elements in type definition string doesn't match number of bind variables.
我认为它将$ data视为单一价值,我不知道该怎么做
$keys = (?, ?, ?);
$types = "iii";
$data = "1, 3, 500";
if ($stmt2 = $conn->prepare("INSERT INTO tranx (user, type, amount) VALUES (?, ?, ?),$keys")) {
$ortype = 1;
$stmt2->bind_param("iii".$types, $userid, $ortype, $amount, $data);
$stmt2->execute();
$stmt2->close();
}
答案 0 :(得分:0)
您尝试使用变量绑定,但手动分配它们。除此之外,您的参数数量也不匹配。
您有3个占位符,3个类型定义,但有4个值。它们是一对一的关系,因此类型定义的数量(您的iii
)需要与占位符?
的数量和绑定的值的数量相匹配(按占位符的顺序排列) )。
// $keys = (?, ?, ?); // Removed this, syntax error and you bind it manually anyway later
// $types = "iii"; // You bind it manually later
$data = "1, 3, 500";
// Removed ',$keys' from your query, you manually put the placeholders
if ($stmt2 = $conn->prepare("INSERT INTO tranx (user, type, amount) VALUES (?, ?, ?)")) {
$ortype = 1;
// removed '.$types' - you bind it manually
// Also removed $data - you have 3 values, 3 columns, not 4
$stmt2->bind_param("iii", $userid, $ortype, $amount);
$stmt2->execute();
$stmt2->close();
}
是的,您的$data
是单个值,而不是参数列表。
文档也有很好的例子。
<强>参考强>
答案 1 :(得分:0)
尝试这个逻辑,看看是否有效:)
$data = array(array(1,3,5), array(2,4,6));
$sql = 'INSERT INTO tranx (user, type, amount) VALUES (?, ?, ?)';
if($stmt = $conn->prepare($sql)){
$stmt->bind_param("iii", $usr, $type, $amt);
foreach ($data as $v) {
$usr = $v[0];
$type = $v[1];
$amt = $v[2];
$stmt->execute();
if($stmt->insert_id <= 0){
trigger_error('Insert fail. Error: ' . $stmt->error);
break;
}
}
$stmt->close();
$conn->close();
}
else{
trigger_error('Prepare fail.');
}
答案 2 :(得分:-2)
我认为它将$ data视为单一值
是的,当然。如果以任何方式 单个值,为什么会这样做?
我不知道该怎么做
嗯,你能做的最好的事情就是提出一个问题。这不是你在这里问过的存根,而是一个真实的问题,解释你想做什么以及为什么。由于没有这样的问题,我们只能猜测你需要做多次插入,但有一些特殊的方法。
为此,请创建一个包含所有数据的单个数组。
$data = [];
$data[] = $userid;
$data[] = $ortype;
$data[] = $amount;
$data[] = 1;
$data[] = 3;
$data[] = 500;
$count = count($data);
然后创建一个包含占位符的字符串
$values = implode(',', array_fill(0, $count, '(?, ?, ?)'));
然后创建一个类型为
的字符串$types = str_repeat("iii", $count);
最后创建您的查询并执行它
$stmt = $conn->prepare("INSERT INTO tranx (user, type, amount) VALUES $values");
$stmt->bind_param($types, ...$data);
$stmt->execute();