我正在努力改善使用PDO,我有这个代码:
sed -n "/$(date +%Y-%m-%d)/p" en.html
这段代码对我很有用,但我读过我应该只调用一次 $answers_count = count($answers);
$save_answers = $conn->prepare("INSERT INTO answers (answer, is_correct, question_id) VALUES (:answer, :is_correct, :question_id)");
for($i = 0; $i < $answers_count; $i++) {
$save_answers->bindParam(':answer', $answers[$i]);
$save_answers->bindParam(':is_correct', $answers_state[$i]);
$save_answers->bindParam(':question_id', $last_insert_id);
$save_answers->execute();
}
方法,如果我理解正确,我必须准备一次sql语句并在绑定params后执行它?如果我使用execute()
方法一次插入一条新记录,但如果将execute()
语句放在for循环之外,则只执行一个INSERT查询。
我在这里做错了吗,是否有其他更简单的方法来绑定数组中的值,每次数组元素的数量都可以不同。
提前感谢您提供给我的信息。
答案 0 :(得分:1)
但是如果放置$ save_answers-&gt; execute();在for循环之外的语句只会执行一个INSERT查询。
这是因为如果将execute语句放在循环之外,它只会对for循环的最后一次迭代绑定的值执行一次查询。因此,您当前的代码是正确的,重新绑定和重新执行查询应该是要走的路。
查询需要绑定每次迭代的值(每个答案都有不同的值,因此每个插入都有不同的插入值)。显然你需要重新绑定每个答案的值,所以这样做一次不会为你削减它。
如果您不想通过for循环执行它,可以尝试批量插入:
这将允许您在对数据库的一个请求中插入多行,这可能是您正在寻找的。
答案 1 :(得分:1)
首先准备查询然后执行
$answers_count = count($answers);
$writeArguments = array();
$writeQuery="insert into $tableName (answer, is_correct, question_id) values ";
for($i = 0; $i < $answers_count; $i++) {
if (i > 0) {
$writeQuery .= ',';
}
$writeQuery .= '(?,?,?)';
array_push($writeArguments, $answers[$i], $answers_state[$i], $last_insert_id);
}
$save_answers = $conn->prepare($writeQuery);
$save_answers->execute($writeArguments);