0

我正在尝试使用 PDO 语句嵌套 foreach 循环(这以前在 mysql 中对我有用,顺便说一句)。第一个示例有效,第二个示例无效。但是我不希望每次都运行 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>";
    }
4

2 回答 2

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(),当然您可以按照您希望的方式对结果进行分组。

虽然使用foreachon$stmt再次只是一个语法糖,旨在迷惑 PHP 用户。因为$stmt不是数组而是一种更复杂的结构。

于 2013-10-23T11:51:57.143 回答
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/>";
        }
    }
}
于 2013-10-23T11:50:13.573 回答