Мой код PHP PDO fetchAll() возвращает одну строку вместо всех результатов в таблице столбцов MySql

Я пытаюсь заполнить все результаты из одного столбца таблицы MySql через PHP и PDO FetchAll() с помощью подготовленных операторов, но мой код просто возвращает одну строку вместо всех результатов. Я видел этот вопрос здесь ( PHP PDO, возвращающий одну строку), который похож на мою проблему, но мне не удалось улучшить мой код с этим вопросом.

Я следовал примеру на странице руководства PHP ( http://php.net/manual/en/pdostatement.fetchall.php), чтобы попытаться структурировать / адаптировать мой код для получения результатов fetchAll() одного столбца в таблице MySql:

Страница руководства PHP - пример FetchAll с печатью:

<?php
$sth = $dbh->prepare("SELECT name, colour FROM fruit");
$sth->execute();

/* Fetch all of the remaining rows in the result set */
print("Fetch all of the remaining rows in the result set:\n");
$result = $sth->fetchAll();
print_r($result);
?>

И я адаптировал свой код на основе приведенного выше примера, используя HTML-тег select:

<select name="category" class="form-control" required>
   <option value="0" selected="selected" disabled="disabled" style="display: none">Select one category</option>
   <?php
      require_once 'pdo_connection.php';
      $sth = $dbh-> prepare( 'SELECT * FROM categories' );
      $sth-> execute();
      $result = $sth-> fetchAll(); ?>
   <?php foreach( $result as $row ) ?>
   <option value="<?php echo $row['category_id'];?>"><?php echo $row['category'];?></option>
</select>

И это мое соединение с базой данных PDO:

<?php

$dbh = new PDO('mysql:host=localhost;dbname=system_vip;charset=utf8', 'root', '');

?>

Что я могу сделать, чтобы улучшить мой код, чтобы заполнить все результаты из одного столбца таблицы MySql, используя подготовленные операторы и соединение PDO?

1 ответ

Решение

fetchAll() Это хорошо. если ты var_dump($result) вы увидите, что все строки там.

Это проблема:

<?php foreach( $result as $row ) ?>
<option value="<?php echo $row['category_id'];?>"><?php echo $row['category'];?>

Без использования фигурных скобок или альтернативного синтаксиса для группировки операторов после foreach будет повторяться только первое утверждение после foreach. В этом случае первое утверждение после foreach - ничто. Закрывающий тег PHP подразумевает разделитель инструкций, так что вы фактически говорите:

foreach( $result as $row );

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

Вот пример альтернативного синтаксиса для включения двух операторов:

<?php foreach( $result as $row ): ?>
<option value="<?php echo $row['category_id'];?>"><?php echo $row['category'];?></option>
<?php endforeach; ?>
Другие вопросы по тегам