2013-03-18 3 views
3

Я перехожу к подготовленным инструкциям PDO, и у меня возникают проблемы с синтаксисом для базового запроса SELECT с оператором WHILE.Этот запрос PDO :: FETCH_ASSOC` пропускает первый результат, возвращаемый

Оператор foreach содержит правильные результаты, но запрос PDO::FETCH_ASSOC пропускает 1-й результат, который возвращается (так что всегда эхо один результат меньше, чем он должен).

PDO :: FETCH_ASSOC

$stmt = $conn->prepare("SELECT * FROM products"); 
$stmt->execute(); 
$row = $stmt->fetch(); 
while($row = $stmt->fetch(PDO::FETCH_ASSOC)) { 
    echo $row['product_name'].' '.$row['price'].' '.$row['color'], "<br />"; 
} 

Еогеасп

foreach($conn->query('SELECT * FROM products') as $row) { 
    echo $row['product_name'].' '.$row['price'].' '.$row['color'], "<br />"; 
} 
+2

Вы называете выборки до времени. – shapeshifter

ответ

9

Вы уже выбрали первую строку перед циклом while $row = $stmt->fetch();. Если вы удалите эту строку, она будет работать, как ожидалось.

Поскольку цикл while перезаписывает $row на каждой итерации, похоже, что вы начинаете со второй строки, но что происходит, это значение $row на первом этапе, когда итерация цикла перезаписана.

Чтобы петля работать так, как вы написали, что вам нужно будет использовать do-while конструкцию:

$row = $stmt->fetch(); 
do { 
    echo $row['product_name'].' '.$row['price'].' '.$row['color'], "<br />"; 
} while($row = $stmt->fetch(PDO::FETCH_ASSOC)); 

Здесь значение $row будет печататься первым, прежде чем он будет перезаписан условием while.

В данном конкретном случае я не хочу повторить что-либо, когда нет никаких результатов

Если это так, то проверьте, чтобы увидеть, если ваш запрос возвращал результатов первого. Здесь я четко указываю на проверку, потому что, если вы удалили внешний if, ваш цикл while по-прежнему будет следовать вашим намерениям - то есть он не будет эхом ничего, если результатов нет.

Однако, это всегда хорошо, чтобы иметь ясное намерение в вашем коде:

if ($stmt->columnCount()) { 
    while($row = $stmt->fetch(PDO::FETCH_ASSOC)) { 
     echo $row['product_name'].' '.$row['price'].' '.$row['color'], "<br />"; 
    } 
} 
+0

OMG! Я так рад, что спросил :-D –

+0

Из любопытства, есть ли преимущество использования инструкции do-while, в отличие от удаления '$ row = $ stmt-> fetch();'? –

+0

Не совсем, разные штрихи для разных людей. Единственное отличие _real_ заключается в том, что do-while всегда будет запускать тело (часть между {}), так как «проверка правды» будет выполнена позже. –

5

Не делайте $row = $stmt->fetch() до того цикла.

Смежные вопросы