我正尝试通过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表上某一列的所有结果?
答案 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; ?>