PHP mysqli重用预编译语句 - 数组

时间:2016-07-09 21:10:26

标签: 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的第一个子数组中。我在这做错了什么?有没有办法保留预处理语句的性能提升,而不必先将子数组的值手动分配到标准变量中?

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

2 个答案:

答案 0 :(得分:1)

$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

答案 1 :(得分:0)

您在foreach循环之前声明绑定变量。 如果你将auto commit设置为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();