pdo подготовленный оператор многократного выполнения?

Я только собираюсь реализовать 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

person hellomello    schedule 22.01.2012    source источник


Ответы (2)


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

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-запросе без необходимости зацикливаться на нем, как это.

person Mike    schedule 22.01.2012

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

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

person Brad    schedule 22.01.2012
comment
Как мне сделать, чтобы получить базу данных? Я не уверен, раньше я работал со старыми методами mysql_query(SELECT... - person hellomello; 22.01.2012
comment
@andrewliu, непонятно, о чем вы спрашиваете. Почему бы не выбрать один раз и не просмотреть полученные данные? Зачем вам SELECT снова и снова? - person Brad; 22.01.2012