2015-12-23 72 views
0

我试图让在使用PDO更好的绑定值正确的方法,我有这样的代码:PHP 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(); 
} 

此代码的工作对我很好,但我已阅读,我应该叫​​方法只是一次,如果我理解正确,我必须准备一次sql语句并在绑定params后执行它?如果我使用​​方法一次插入一条新记录,它将起作用,但如果在for循环之外放置$save_answers->execute();语句,则只会执行一条INSERT查询。

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

预先感谢您提供给我的信息。

+3

您准备一次查询,然后执行一个查询多次,只要你喜欢,把新的值到查询。 __Just就像你在做什么_ – RiggsFolly

回答

1

但如果放置$ save_answers-> execute(); for循环之外的语句只会执行一个INSERT查询。

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

查询需要绑定来自每个迭代的值(每个答案具有不同的值,因此每个插入具有不同的插入值)。显然你需要重新绑定每个答案的值,所以一次不会为你削减。

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

PDO Prepared Inserts multiple rows in single query

这将允许你做多行的插入在一个请求数据库,这可能是你正在寻找的。

+0

感谢您的快速响应,起初我以某种方式误解了准备查询一次并根据需要用不同的参数执行多次的想法。所以如果我理解正确,我不需要把$ conn-> query(..'SQL STATEMENT ..');内部for循环。并感谢尝试批量插入方法作为替代方法。 – Erasus

+1

@Erasus这是正确的,'$ conn-> query'调用可以停留在'for'循环之外,因为插入SQL语句不会更改,您只需更改绑定到查询的参数即可。所以这样它就可以正常工作。 –

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);