Этот запрос PDO :: FETCH_ASSOC` пропускает первый результат, который возвращается

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

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

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 />"; } 

Related of "Этот запрос PDO :: FETCH_ASSOC` пропускает первый результат, который возвращается"

Вы уже выбрали первую строку перед циклом 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 />"; } } 

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