我的 PHP PDO fetchAll() 代码 returns 一行而不是 MySql 列 table 上的所有结果

My PHP PDO fetchAll() code returns one row instead of all results on MySql column table

我正在尝试通过 PHP 和 PDO FetchAll() 填充 MySql table 一列的所有结果,但我的代码只是 return一行而不是所有结果。我在这里看到了这个问题 (PHP PDO returning single row),它与我的问题类似,但我没有通过这个问题改进我的代码。

我按照 PHP 手册页 (http://php.net/manual/en/pdostatement.fetchall.php) 中的示例尝试 structure/adapt 我的代码以获取 MySql 中一列的 fetchAll() 结果 table:

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', '');

?>

我可以做些什么来改进我的代码,以使用准备好的语句和 PDO 连接从 MySql table 上的一列中填充所有结果?

fetchAll()没问题。如果你 var_dump($result) 你会看到所有的行都在那里。

这是问题所在:

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

如果不使用大括号或替代语法对foreach 之后的语句进行分组,则只会重复foreach 之后的第一条语句。在这种情况下,foreach 之后的第一条语句什么也不是。结束的 PHP 标签暗示了一个 instruction separator,所以你实际上是在说:

foreach( $result as $row );

即对于每一行,什么都不做。 $row 仍然在循环后定义为数组的最后一行,这是您最终得到的一个选项。

下面是包含两个语句的替代语法示例:

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