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