0

PDO ステートメントを使用して foreach ループをネストしようとしています (これは、以前は mysql で機能していました)。最初の例は機能しますが、2 番目の例は機能しません。しかし、私は毎回 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 に答える