Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/57.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PHP PDO从数组绑定值的正确方法_Php_Mysql_Arrays_Pdo - Fatal编程技术网

PHP PDO从数组绑定值的正确方法

PHP PDO从数组绑定值的正确方法,php,mysql,arrays,pdo,Php,Mysql,Arrays,Pdo,我正在尝试更好地使用PDO,我有以下代码: $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++) { $sav

我正在尝试更好地使用PDO,我有以下代码:

 $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();
 }
$answers\u count=count($answers);
$save_answers=$conn->prepare(“插入答案(答案,是否正确,问题id)值(:答案,:是否正确,:问题id)”);
对于($i=0;$i<$answers\u 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();
}
这段代码对我来说很好,但我已经读到我应该只调用一次
execute()
方法,如果我理解正确,我必须准备一次sql语句,并在绑定参数后执行它?如果我使用
execute()
方法一次插入一条新记录,它就会工作,但是如果place
$save\u answers->execute()语句将只执行一个INSERT查询

如果我在这里做错了什么,有没有其他更简单的方法来绑定数组中的值,因为每次数组元素的数量可能不同

提前感谢您提供给我的信息

但是如果place$save_回答->execute();for循环外的语句将只执行一个INSERT查询

这是因为如果将execute语句放在循环之外,它只会对for循环最后一次迭代中绑定的值执行一次查询。因此,您当前的代码是正确的,重新绑定并重新执行查询应该是正确的

查询需要绑定每个迭代的值(每个答案都有不同的值,因此每个插入都有不同的插入值)。显然,您需要重新绑定每个答案中的值,因此执行一次不会为您带来任何好处

如果不想通过for循环执行,可以尝试批量插入:


这将允许您在对数据库的一个请求中插入多行,这可能就是您正在寻找的

先准备查询,然后执行

$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);
$answers\u count=count($answers);
$writeArguments=array();
$writeQuery=“插入$tableName(答案,是否正确,问题id)值”;
对于($i=0;$i<$answers\u count;$i++){
如果(i>0){
$writeQuery.=',';
}
$writeQuery.='(?,?,?)';
数组\u推送($writeArguments、$answers[$i]、$answers\u state[$i]、$last\u insert\u id);
}
$save_answers=$conn->prepare($writeQuery);
$save_answers->execute($writearagments);

只需准备一次查询,然后根据需要多次执行该查询,并将新值放入查询中。正如您正在为快速响应进行测试一样,起初我不知何故误解了一次准备查询并根据需要使用不同参数多次执行查询的想法。所以,如果我理解正确,我不需要把$conn->query(..'SQL语句…);内部为循环。感谢您尝试使用批插入方法作为替代方法。@Erasus这是正确的,
$conn->query
调用可以位于
for
循环之外,因为插入SQL语句不会更改,您只需更改绑定到查询的参数。因此,这种方式将工作得很好。