1

手続き型コードから PDO クラスにジャンプしようとしていますが、最初のクエリの結果に基づいて DB をクエリするときに問題が発生しました。

この例では、サブメニューのメニュー (id = $parent) があり、その詳細は正常にクエリされ、アクセスできるように配列に格納されます。次に、foreach ループを形成して最初の配列を循環させ、DB に再度クエリを実行して、各サブメニューに属するページを見つけようとします。ここでプロセスが失敗します。

注意点として、接続は問題なく、クエリも手続き的に問題なく動作します。私は単に新しいフォーマットで失敗しているだけです (と思います)。

誰かが私が間違っているところを指摘できれば、私は感謝します。whileループ内で実行されるクエリを実行していましforeachたが、今回はそれが道だと思いました。

コード

function navigation($parent) {

$conn = ConnManager::get('DB');

    //initial query to get list of submenus belonging to $parent
try {       
    $qNAV= $conn->prepare('SELECT ID, Name FROM prm_menu WHERE Parent = :parent');
    $qNAV->execute(array('parent' => $parent));
    $qNAV->setFetchMode(PDO::FETCH_ASSOC);  
    $n=$qNAV->fetchAll();
} 
catch(PDOException $e) {
    echo $e->getMessage();
}

    //now I try to cycle through the array and run another query each time.
foreach($n as $menu) {
    $id = $menu['ID'];
    try{
        $qPAGE=$conn->prepare('SELECT ID, Title, URLName, MenuOrder FROM posts 
                    WHERE MenuID = $id AND Status = 1 ORDER BY MenuOrder ASC, ID ASC');
        $qPAGE->execute(); 
        $qPAGE->setFetchMode(PDO::FETCH_ASSOC);  
        while($m= $qPAGE->fetchAll()) {
            $menu_item = '<li id="navPage'.$m['ID'].'" class="menu-nav">';
            $menu_item.= '<a href="'.$m['URLName'].'">'.$m['Title'].'</a>';
            $menu_item.= '</li>';

            echo '<div class="menu-nav-wrap">';
            echo '<span class="menu-title">'.$menu['Name'].'</span>';
            echo '<ul class="menu-list">';
            echo $menu_item;
            echo '</ul>';
            echo '</div>';
        }

    }
    catch(PDOException $e) {
        echo $e -> getMessage();
    }
}
}
4

2 に答える 2

2

これはあなたがやりたいことではありません:

while($m= $qPAGE->fetchAll()) {

fetchAll()はすべての列を返すため、ステートメントwhileはそれらを反復処理しません。あなたが探しているのはこれです:

$subrows = $qPAGE->fetchAll();
foreach( $subrows as $m) {
    ....

また、これらのネストされたクエリを1つのクエリに統合できる可能性があるため、SQLJOINステートメントを調べる必要があります。

于 2012-08-03T16:11:08.450 に答える
1

Nickb は、特定の問題に対する解決策を提供してくれました。私が追加できる唯一のことは、名前付きパラメーターの使用に一貫性を持たせる必要があるということです。これらは最初のクエリで使用しましたが、ネストされたクエリでも使用する必要があります。

そうは言っても、Nクエリではなく結合を行うことに関する彼のアドバイスは、私が与えるのと同じアドバイスです。

すべての子を再帰する必要がある階層を解決するには、一連のクエリを既に実行する必要があるようです。これを 1 つのクエリとして書き直す必要がある理由はさらにあります。

必要なのは、JOIN テーブル t ON (a.id = t.id) を含める mysql の単純な内部結合構文を学習することだけです。次に、ループする 1 つの結果セットを取得します。たとえば、これはあなたが必要とするもののようです:

SELECT pm.ID, Name, p.ID, Title, URLName, MenuOrder
FROM prm_menu pm 
JOIN posts p ON (p.MenuID = pm.ID AND pm.Parent = :parent' AND p.Status = 1)
ORDER BY p.MenuOrder ASC, p.ID ASC
于 2012-08-03T16:29:54.007 に答える