我正在尝试使用PDO语句嵌套foreach循环(这在我之前在mysql,btw中工作)。第一个例子有效,第二个例子没有。但是我不希望每次都运行SQL查询(不是PDO的那个?)并且更喜欢使用更像示例2的东西。但是,它不会将循环“嵌套”在另一个内部,看来,它首先运行的是第一个,然后是下一个。
示例1)
foreach($db->query('SELECT country FROM db GROUP BY `country`') as $row1) {
echo $row1['country']."<br/>";
foreach($db->query('SELECT * FROM db') as $row2) {
if ($row1['country']==$row2['country']){
echo $row2['name']."<br/>";
}
}
}
示例2)
$cntry = $db->query('SELECT country FROM db GROUP BY `country` ');
$rslts = $db->query('SELECT * FROM db');
foreach ($cntry as $row1) {
echo "<div id='".$row1['country']."'>".$row1['country']."<br/>";
foreach($rslts as $row2) {
if ($row1['country']==$row2['country']){
echo $row2['name']."<br/>";
}
};
echo "</div>";
}
答案 0 :(得分:2)
(这不是PDO的意思吗?)
没有。 PDO的目的是将您的查询发送到数据库服务器并返回结果。但是PDO无法减少执行的查询次数。
所以,这是正确的解决方案:
$stmt = $db->query('SELECT country, name FROM db ORDER BY country, name');
$data = $stm->fetchAll(PDO::FETCH_COLUMN|PDO::FETCH_GROUP);
foreach ($data as $country => $row)
{
echo $country."<br/>\n";
foreach ($row as $name)
{
echo $name."<br/>\n";
}
}
事实上,对于像这样的代码,fetchAll()
只是一个语法糖:
$data = array();
while ($row = $stmt->fetch())
{
$data[] = $row;
}
它只是从查询结果中创建常规PHP数组。当然,您可以根据需要循环遍历此数组。意味着您始终替换fetchAll()
并手动循环结果,当然您可以按照您希望的方式对结果进行分组。
在 foreach
上使用$stmt
只是一种语法糖,旨在混淆PHP用户。因为$stmt
不是一个数组,而是一种更复杂的结构。
答案 1 :(得分:0)
不确定,但我记得它会像这样
$cntry = $db->query('SELECT country FROM db GROUP BY `country` ')->fetchAll (PDO::FETCH_COLUMN);
$rslts = $db->query('SELECT * FROM db')->fetchAll(PDO::FETCH_COLUMN);
foreach ($cntry as $row1) {
echo $row1['country']."<br/>";
foreach($rslts as $row2) {
if ($row1['country']==$row2['country']){
echo $row2['name']."<br/>";
}
}
}