我有一个脚本,可以将一个行数组插入到数据库中,其中每一行都由一个子数组表示。最近,我意识到我在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
的第一个子数组中。我在这做错了什么?有没有办法保留预处理语句的性能提升,而不必先将子数组的值手动分配到标准变量中?
编辑:尝试删除重复的标记
答案 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();