PHP mysqli 重用预准备语句 - 数组



我有一个脚本,可以将行数组插入数据库,其中每一行由一个子数组表示。最近,我意识到我在 PHP/MySQLi 中错误地使用了准备好的语句,因为我在迭代大数组时重新准备了相同的语句。然后,我将代码转换为以下内容:

$t = reset($data);
$stmt = $con->prepare("INSERT INTO tlist VALUES (?,?,?)");
$stmt->bind_param('isi',$t['id'],$t['flag'],$t['cost']);
foreach ($data as $t) {
    $stmt->execute();
}
$stmt->close();
$con->close();

但是,这现在尝试在循环的每次迭代$t的第一个子数组中插入值。我在这里做错了什么?有没有办法保留预准备语句的增强性能,而不必先手动将子数组的值分配给标准变量?

编辑:尝试删除重复的标签

> 你在 foreach 循环之前声明绑定变量。如果您将自动提交设置为 false,您确实可以从中获取潜力。

$t = reset($data);
$stmt = $con->prepare("INSERT INTO tlist VALUES (?,?,?)");
$stmt->bind_param('isi', $id, $flag, $cost);
$con->autocommit(false);
foreach ($data as $t):
    $id   = $t['id'];
    $flag = $t['flag'];
    $cost = $t['cost'];
    $stmt->execute();
endforeach;
$stmt->close();
$con->commit();
$con->close();
$question_marks = '';
$types = '';
$values = array();
foreach ($data as $t) {
  if(!empty($question_marks)){
    $question_marks.= ',';
  }
  $question_marks.= "(?,?,?)";
  $types.= 'isi';
  $values[] = $t['id'];
  $values[] = $t['flag'];
  $values[] = $t['cost'];
}
array_unshift($values,$types);
$query = "INSERT INTO `tlist` (`id`,`cost`,`flag`) VALUES ".$question_marks;
$statement = $con->prepare($query);
$ref = new ReflectionClass('mysqli_stmt');
$method = $ref->getMethod("bind_param");
$method->invokeArgs($statement,$values);
$statement->execute();
$statement->close();

类似
的东西编辑:在我的示例中,连接变量被$db ->更改为您的 -> $con

最新更新