0

mysql データを必要な HTML 形式にドラッグするのに問題があります。私が持っている/必要なものの簡単な例を挙げてみます。

例の表:

CREATE TABLE IF NOT EXISTS `tblcat` (
  `id` int(10) NOT NULL AUTO_INCREMENT,
  `catname` varchar(100) DEFAULT NULL,
  `comments` text NOT NULL,
  `enabled` tinyint(1) NOT NULL DEFAULT '0',
  PRIMARY KEY (`id`),
  KEY `id` (`id`)
)

CREATE TABLE IF NOT EXISTS `tblsubcat` (
  `id` int(10) NOT NULL AUTO_INCREMENT,
  `subcatname` varchar(100) DEFAULT NULL,
  `catid` int(10) DEFAULT NULL,
  `enabled` tinyint(1) NOT NULL DEFAULT '0',
  PRIMARY KEY (`id`),
  KEY `id` (`id`)
)

サンプルデータ:

INSERT INTO `tblcat` (`id`, `catname`, `comments`, `enabled`) VALUES
(100, 'Bells & Horns', '', 0),
(101, 'Bottles & Bottle Cages', '', 0),
(216, 'Brake Blocks - Shimano', '', 0),
(243, 'Brake Discs & Accessories', '', 0)

INSERT INTO `tblsubcat` (`id`, `subcatname`, `catid`, `enabled`) VALUES
(194, 'Bottom Bracket Axles', 102, 0),
(204, 'Bottom Bracket Parts', 102, 0)

ターゲット HTML:

<li><a href="viewproducts.php?task=showsubs&catID=100">Bells & Horns</a></li>
<li><a href="viewproducts.php?task=showsubs&catID=101">Bottles & Bottle Cages</a></li>
<li>
<a href="viewproducts.php?task=refine&catID=102" class="extends">Bottom Brackets & Accessories</a>
<ul class="subcategory">
  <li><a href="viewproducts.php?task=refine&catID=102&subcatID=194">Bottom Bracket Axles</a></li>
  <li><a href="viewproducts.php?task=refine&catID=102&subcatID=204">Bottom Bracket Parts</a></li>
</ul>
</li>
<li><a href="viewproducts.php?task=showsubs&catID=216">Brake Blocks - Shimano</a></li>
<li><a href="viewproducts.php?task=showsubs&catID=243">Brake Discs & Accessories</a></li>

これまでの私の試み:

$CurrentCatID = 0;
$Categories = mysql_query("SELECT tblcat.id as CatID, tblcat.catname as CatName, IFNULL(tblsubcat.id, -1) as SubCatID, IFNULL(tblsubcat.subcatname, '') as SubCatName FROM tblcat LEFT OUTER JOIN tblsubcat ON tblcat.id = tblsubcat.catid WHERE tblcat.enabled = '0' ORDER BY tblcat.catname ASC, tblsubcat.subcatname ASC");  
$CurrentCatID = mysql_result($Categories, 0, "CatID");
while ($row = mysql_fetch_assoc($Categories)) {
    echo "<li><a href=\"viewproducts.php?task=showsubs&catID=" . $row["CatID"] . "\">" . htmlspecialchars($row["CatName"]) . "</a></li>";
}

上記の PHP を拡張して、上記のターゲット HTML を作成するにはどうすればよいですか? 私はあらゆる種類の複雑なループの後方および前方メソッドを試しましたが、これは醜いものであり、それを行うためのよりクリーンな方法があるに違いないと確信しています-だから、IDはここで尋ねると思いました:)

編集:

私の最終的な作業バージョン:

$InSub = false;
$PreviousCatID = "";
$Categories = mysql_query("SELECT tblcat.id as CatID, tblcat.catname as CatName, IFNULL(tblsubcat.id, -1) as SubCatID, IFNULL(tblsubcat.subcatname, '') as SubCatName FROM tblcat LEFT OUTER JOIN tblsubcat ON tblcat.id = tblsubcat.catid WHERE tblcat.enabled = '0' ORDER BY tblcat.catname ASC, tblsubcat.subcatname ASC");  

while ($row = mysql_fetch_assoc($Categories)) {
    if ($InSub === true && ($row["SubCatID"] === "-1" || $PreviousCatID !== $row["CatID"])) {
        echo "  </ul>\n";
        echo "</li>\n";
        $InSub = false;
    }        
    if ($row["SubCatID"] === "-1") {
        echo "<li><a href=\"viewproducts.php?task=showsubs&catID=" . $row["CatID"] . "\">" . htmlspecialchars($row["CatName"]) . "</a></li>\n";  
    } else {
        if ($PreviousCatID !== $row["CatID"] || $InSub === false) {
            echo "<li><a href=\"viewproducts.php?task=showsubs&catID=" . $row["CatID"] . "\" class=\"extends\">" . htmlspecialchars($row["CatName"]) . "</a>\n";
            echo "  <ul class=\"subcategory\">\n";
            $InSub = true;
        }
        echo "    <li><a href=\"viewproducts.php?task=showsubs&catID=" . $row["CatID"] . "&subcatID=" . $row["SubCatID"] . "\">" . htmlspecialchars($row["SubCatName"]) . "</a></li>\n";
    }
    $PreviousCatID = $row["CatID"];
}
4

1 に答える 1

1

「これまでの試行」を行うよりクリーンな方法:

まず、クエリをストアド プロシージャにすることをお勧めします。これにより、コードがクリーンアップされ、コンパイルされるためパフォーマンスが向上します。

SP がオプションでない場合は、少なくともクエリを上記の定数値に割り当ててから、mysql_query(CONST_QRY); を使用します。. . . SQLを動的に構築する変数がないためです。

第 2 に、結果セットのループ処理はそれほど「醜い」ものではありませんが、通常、サーバー側コードで「ビュー」またはクライアント側 HTML を作成したくありません。JQuery と Ajax を使用してサーバー側の PHP コードにリクエストを送信すると、クエリが実行され、結果がクライアント側のコードに返されて表示されます。


編集


あなたのコメントについて、私はあなたの質問のその部分を誤解していました。ごめん。

現在サブレベルにいるかどうかを示すブール値を使用することをお勧めします。もう 1 つは、最後のループ反復がサブレベルにあったかどうかを示します。以下のコードは、それがどのように機能するかの概念です。

$blnSub = false;
$prevSubId = "";
while(...){
   $blnEndSub = $blnSub;
   $blnSub = ($row["subId"] == null);

   //if not in a sub, but was previously in sub, end the UL
   if($blnSub == false && $blnEndSub == true) {
      echo "</ul>";
   //if in sub but was not previously in sub, start UL
   } else if ($blnSub == true && $blnEndSub == false) {
      echo "<ul>";
   //if in a sub.  previously in sub.  new sub id.
   } else if ($blnSub == true && $blnEndSub == true && $prevSubId != $row["subId"]) {
      echo "</ul><ul>";
   }

   if($blnSub == true) {
        echo "<li class=sub><ahref...etc...></a></li>";
   } else {
        echo "<li><ahref...etc...></a></li>";
   }

   $prevSubId = $row["subId"];
}
于 2013-10-03T17:03:47.967 に答える