pdo подготовил оператор множественного выполнения? - PullRequest
1 голос
/ 22 января 2012

Я только собираюсь реализовать PDO на своем сайте, но мне было интересно, можно ли выполнить подготовленный оператор несколько раз?

$SQL = $dbh->prepare("SELECT * FROM user WHERE id=? AND users=?");
$SQL -> execute(array($id,$userid));
while($check = $SQL -> fetchObject()){

, а затем я использовал бы цикл while для этого SQL

Могу ли я использовать тот же $ SQL для другого выполнения в цикле while?Так что мне не нужно снова вводить подготовленное утверждение?

$SQL -> execute(array($id2,$userid2));
while($check2 = $SQL ->fetchObject(){
//while loops for second execution, but I'm not sure how it works cause 
//its using the same $SQL?
    }
    }//this end bracket is for the first while loop

Ответы [ 2 ]

3 голосов
/ 22 января 2012

Да, вы можете повторно использовать то же самое подготовленное утверждение, но не так, как оно есть в вопросе. То, что вы пытаетесь сделать, по сути то же самое, что делать это:

for ($i=0; $i<$some_number; $i++) {
    echo $i."\n";
    for ($i=0; $i<$some_number; $i++) {
        // do something
    }
}

Второй цикл for перемещает тот же указатель, что и исходный, поэтому на выходе из вышеприведенного будет просто "0", означающий, что исходный цикл for произошел только один раз.

Итак, чтобы обойти это, вам нужно будет сохранить результаты первого execute в массиве, а затем выполнить итерацию по нему. Таким образом, вам не придется беспокоиться о каких-либо указателях

$SQL = $dbh->prepare("SELECT * FROM user WHERE id=? AND users=?");
$SQL->execute(array($id,$userid));
$checks = $SQL->fetchAll();
foreach ($checks as $check) {
    $SQL->execute(array($id2,$userid2));
    while ($check2 = $SQL->fetchObject(){
        //while loops for second execution
    }
}

Таким образом, вы используете точно такой же подготовленный оператор (что хорошо), и исходная переменная $check доступна для использования в цикле while.

Однако, учитывая все вышесказанное, у меня есть сильное предчувствие, что вы, вероятно, можете получить все в одном SQL-запросе без необходимости циклически повторять его следующим образом.

3 голосов
/ 22 января 2012

Да, это возможно. Подготовьтесь один раз, выполните столько раз, сколько вам нужно.

Конечно, я не уверен, почему вы делаете SELECT в цикле ... это обычно не имеет особого смысла.

...