使用php在预准备语句中插入多个值时出错

时间:2016-11-26 08:22:42

标签: php mysql mysqli prepared-statement

当我尝试使用预准备语句将多个值插入到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();

   } 

3 个答案:

答案 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();