0

章テーブル

CHID | Name | Active | Order
 1     Ch2      Y        2
 2     Ch5      N        10
 3     Ch1      Y        1

ページ テーブル

PID | Name  | Active | CHID | Order
 1    Ch1P1     Y       1       1
 2    Ch1P2     Y       1       2
 3    Ch2P2     Y       3       2
 4    Ch2P1     Y       3       1
 5    Ch5P1     N       2       1

現在の結果では、各章がリストされていますが、各章の下にすべてのページもリストされています。現在のスクリプトの「foreach」部分を取り、Dreamweaver で作成した PHP とマージしました。

を探しています:

Ch1
    Ch1P1
    Ch1P2
Ch2
    Ch2P1
    Ch2P2

私の現在のphp/mysqlスクリプト。

    $myarray = array();
    mysql_select_db($database, $connection);
    $query_GetModuleChaptersPages = sprintf("SELECT chapters.CHID, chapters.Chapter_Name AS ChapterName, chapters.MID, chapters.`Order` AS ChapterOrder, pages.PID, pages.Page_Name AS PageName, pages.CHID, pages.Is_Active, pages.`Order` AS PageOrder FROM chapters, pages WHERE chapters.MID = 1"));
    $GetModuleChaptersPages = mysql_query($query_GetModuleChaptersPages, $connection) or die(mysql_error());
    $row_GetModuleChaptersPages = mysql_fetch_assoc($GetModuleChaptersPages);
    $totalRows_GetModuleChaptersPages = mysql_num_rows($GetModuleChaptersPages);

    while ($row = mysql_fetch_array($GetModuleChaptersPages, MYSQL_ASSOC)) { $myarray[$row['ChapterName'] ][]  = $row['PageName']; }

    print "<ul>";
    foreach ($myarray as $key => $val) {
        print "<li><h5>";
        print $key;
        print "</h5><ul>";
        for($i=0;$i<count($val);$i++){
            print "<li>";
            print $val[$i];
            print "</li>";
        }
        print "</ul></li>";
    }
    print "</ul>";
4

2 に答える 2

0

総当たり攻撃のようなものです。

//get all the chapters we want, add criteria as needed
$chapterQuery = "SELECT * FROM `chapters` ORDER BY `order`";
$chapterResult = mysql_query($chapterQuery);
while ($row = mysql_fetch_assoc($chapterResult)) {
    $chapters[] = $row;
}

//get all the pages we want, add criteria as needed
$pagesQuery = "SELECT * FROM `pages` ORDER BY `order`";
$pagesResult = mysql_query($pagesQuery);
while ($row = mysql_fetch_assoc($pagesResult)) {
    $pages[$row['CHID']][$row['order']] = $row;
}

echo "<ul>";
foreach ($chapters as $chapter) {
    echo "<li><h5>" . $chapter['Name'] . "</h5><ul>";
    foreach ($pages[$chapter['CHID']] as $page) {
        echo "<li>".$page['Name']."</li>";
    }
    echo "</ul></li>";
}
echo "</ul>";

ここで重要なのは、最初のキーとしてチャプターIDを使用してページをページ配列に追加することです。これは、注文したページの2番目のキーですが、[$row['order']]の代わりに[]を使用することもできます。

于 2013-01-22T03:18:09.763 に答える
0

出力前に配列に格納 (キャッシュ) しても構わない場合:

$data=array();
$result=$mysqli->query("SELECT chapters.chid,chapters.name as cname,pages.pid,pages.name as pname FROM chapters LEFT JOIN pages ON (chapters.chid=pages.chid) WHERE chapters.active='Y' and pages.active='Y' ORDER BY chapters.order ASC,pages.order ASC");
while($row=$result->fetch_assoc())
{
    if(empty($data[$row["chid"]))
        $data[$row["chid"]]=array("name"=>$row["cname"],"pages"=>array());
    $data[$row["chid"]]["pages"][$row["pid"]=$row["pname"];
}
echo "<ul>";
foreach($data as $chid=>$chapter)
{
    echo "<li><h5>".htmlentities($chapter["name"],ENT_COMPAT,"UTF-8")."</h5><ul>";
    foreach($chapter["pages"] as $page)
    {
        echo "<li>".htmlentities($page,ENT_COMPAT,"UTF-8")."</li>";
    }
    echo "</ul></li>";
}
echo "</ul>";

フェッチ中出力したい場合:

$ch=$mysqli->query("SELECT chid,name FROM chapters WHERE active='Y' ORDER BY `order` ASC");
$pg=$mysqli->prepare("SELECT pid,name FROM pages WHERE active='Y' AND chid=? ORDER BY `order` ASC");
$pg->bind_param("i",$chid);
echo "<ul>";
while($row=$ch->fetch_assoc())
{
    echo "<li><h5>".htmlentities($row["name"],ENT_COMPAT,"UTF-8")."</h5><ul>";
    $chid=intval($row["chid"]);
    $pg->execute();
    $pgrst=$pg->get_result();
    while($pages=$pgrst->fetch_assoc())
    {
        echo "<li>".htmlentites($pages["name"],ENT_COMPAT,"UTF-8")."</li>";
    }
    echo "</ul></li>";
}
echo "</ul>";

これはテストされていないので、「箱から出して」動作するとは思わないでください。しかし、それは作業トラックを指し示すはずです。

于 2013-01-22T04:34:18.313 に答える