使用PDO语句嵌套foreach循环

时间:2013-10-23 11:44:38

标签: php pdo foreach

我正在尝试使用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>";
    }

2 个答案:

答案 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/>";
        }
    }
}