我的PHP PDO fetchAll()代码返回一行,而不是MySql列表上的所有结果

时间:2019-02-14 22:43:58

标签: php mysql pdo fetchall

我正尝试通过PHP和PDO FetchAll()使用Prepared Statements填充MySql表的一列中的所有结果,但是我的代码仅返回一行而不是所有结果。我在这里(PHP PDO returning single row)看到了与我的问题类似的问题,但是我没有对此问题进行改进。

我按照一个PHP手册页(http://php.net/manual/en/pdostatement.fetchall.php)中的示例尝试尝试将我的代码结构化/调整为对MySql表中一列的fetchAll()结果:

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表上某一列的所有结果?

1 个答案:

答案 0 :(得分:6)

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; ?>