簡體   English   中英

從PHP / MYSQL選擇值填充下拉菜單。 如何重新排列輸出

[英]Populating Drop Down Menu from PHP/MYSQL Select Values. How to rearrange output

我將繼續展示當前HTML輸出的外觀以及下面的同一個小提示我希望如何輸出HTML: http//jsfiddle.net/xQ95X/3/

一切都很好,我只需要這個jQuery插件( Superfish )的HTML結構就可以了。 下拉列表不適用於兒童UL在LI之外。 它們必須嵌套在里面。

阻止我以這種方式格式化HTML的部分如下:

  <ul class="sf-menu">

    <li><a href="#">HOME</a></li>

    <?php

    $sql="SELECT * FROM section ORDER BY orderID";
    $result=mysql_query($sql) or die ("Error!! BAD SELECT SEARCH STATEMENT");
    $nrows = mysql_num_rows($result);

    // Top level Items

    for($i=1;$i<=$nrows;$i++) {
      $row = mysql_fetch_array($result);
      extract($row);

      $sections[] = $section;
      $sectionids[] = $sectionid;

      if ($section == "FORUM") {
        echo"<li><a href='#' rel='dropmenu$i'>$section</a></li>"; 
      } else {
        echo"<li><a href='#h' rel='dropmenu$i'>$section</a></li>"; 
      }
    }

    // Submenu Items


    for($s=0;$s<count($sections);$s++) {

      /*$sm1 = ($s - 1);*/
      $sp1 = ($s + 1);

      $sql3="SELECT * FROM category WHERE sectionid='$sectionids[$s]'";
      $result3=mysql_query($sql3) or die ("Error!! BAD SELECT SEARCH STATEMENT");
      $nrows3 = mysql_num_rows($result3);

      if ($nrows3 > 0) {
        echo"<ul>";
        for($t=0;$t<$nrows3;$t++) {
          $row3 = mysql_fetch_array($result3);
          extract($row3);

          if ($type=='Photo') {
            $title20 = strtolower($title);
            $title20 = str_replace(" ", "_", $title20);
            $sec = strtolower($sections[$s]);
            $sec = str_replace(" ", "_", $sec);
            if ($sec=='photos') {
              echo"<li><a href='" . dirname($_SERVER['PHP_SELF']) . "$sec/$catID-$title20/1.html'>$title</a></li>";
            }

            else {
              echo"<li><a href='" . dirname($_SERVER['PHP_SELF']) . "$sec/photos/$catID-$title20/1.html'>$title</li></a>";
            }

          } elseif ($type=="Contact") {
            $title20 = strtolower($title);
            $title20 = str_replace(" ", "_", $title20);
            echo "<li><a href='" . dirname($_SERVER['PHP_SELF']) . "contactus/contact_$title20.html'>$title</a></li>";
          } elseif ($type=='Quote') {

            $sql4="SELECT articleID FROM article WHERE category='49' AND Now() > publishingdate ORDER BY publishingdate DESC LIMIT 0, 1";
            $result4=mysql_query($sql4) or die ("Error! bad select statement");
            $row4=mysql_fetch_array($result4);
            extract($row4);

            echo "<li><a href='" . dirname($_SERVER['PHP_SELF']) . "everton_quotes.php?id=$articleID'>$title</a></li>";
          } 
          elseif ($type=='LastMatch') {
            $sql4="select r.matchID as matchID2, r.venue, r.versus as versus2, s.year FROM regmatch r, season s WHERE r.season=s.seasonID AND Now() > r.matchdate ORDER BY r.matchdate DESC LIMIT 0,1";
            $result4=mysql_query($sql4) or die ("Error! bad select statement");
            $nrows4=mysql_num_rows($result4);
            if ($nrows4 > 0) {
              $row4=mysql_fetch_array($result4);
              extract($row4);
              if ($venue=='Home') {
                $teams = "Everton V $versus2";
                $teams2 = "everton_vs_" . str_replace(" ", "_", strtolower($versus2));
              }
              else {
                $teams = "$versus V Everton";
                $teams2 = str_replace(" ", "_", strtolower($versus2)) . "_vs_everton";
              }

              $year = str_replace("/", "-", $year);
              echo "<li><a href='" . dirname($_SERVER['PHP_SELF']) . "match/$year/$matchID2-$teams2/" . strtolower($venue) . "/matchreport.html'>$title</a></li>";
            }
          } elseif ($type=='NextMatch') {

            $sql5="select r.matchID as matchID3, r.venue, r.versus as versus2, s.year FROM regmatch r, season s WHERE r.season=s.seasonID AND r.matchdate > Now() ORDER BY r.matchdate ASC LIMIT 0,1";
            $result5=mysql_query($sql5) or die ("Error! bad select statement");
            $nrows5=mysql_num_rows($result5);
            if ($nrows5 > 0) {
              $row5=mysql_fetch_array($result5);
              extract($row5);
              if ($venue=='Home') {
                $teams = "Everton V $versus2";
                $teams2 = "everton_vs_" . str_replace(" ", "_", strtolower($versus2));
              }
              else {
                $teams = "$versus2 V Everton";
                $teams2 = str_replace(" ", "_", strtolower($versus2)) . "_vs_everton";
              }

              $year = str_replace("/", "-", $year);
              echo "<li><a href='" . dirname($_SERVER['PHP_SELF']) . "match/$year/$matchID3-$teams2/" . strtolower($venue) . "/teamnews.html'>$title</a></li>";
            }
          } else {

    // Overides for missing pages

            if($title == "Gwladys Street Preacher") {
              echo"<li><a href='/fans/121-gwladys_street_preacher/index.html'>$title</a></li>";
            } 

            elseif($title == "The Secret Fan") {
              echo"<li><a href='/news/124-secret-fan/index.html'>$title</a></li>";
            } 

            elseif($title == "Toffee Girl") {
              echo"<li><a href='/fans/125-toffee_girl/index.html'>$title</a></li>";
            } 

            else {

              echo"<li><a href='" . dirname($_SERVER['PHP_SELF']) . $link . "'>$title</a></li>";

            }

          }

        }

        echo"</ul>";
      }

    }

    echo "</ul>";

    ?>

我希望我提供了足夠的信息,如果您需要其他任何信息,請告訴我。 雖然JSFiddle應該讓你很好地了解我希望如何輸出HTML。

PS - 我完全清楚這不是最干凈的代碼,我的猜測是它需要大量的重新排列來獲得所需的輸出。 我願意接受建議。

我個人將第二個for循環(我已經更改為while循環)嵌套在第一(這是非常粗略的代碼)但是在父循環中的注意事項已從部分標題中刪除:

一些偽代碼:

print parent unordered list start
get section data
loop through section results
    print parent list item start
    print section title
    get page data
    print unordered child list start
    loop through page results
         print child list item start
         print page info
         print child list item end
    print child unordered list end 
    print parent list item end
print parent unordered list end

從偽代碼到接近代碼的東西:

$sql="SELECT * FROM section ORDER BY orderID";
$result=mysql_query($sql) or die ("Error!! BAD SELECT SEARCH STATEMENT");

// Top level Items

while($row = mysql_fetch_array($result){
    extract($row);

    if ($section == "FORUM") echo"<li><a href='#' rel='dropmenu$i'>$section</a>"; 
    else echo"<li><a href='#h' rel='dropmenu$i'>$section</a>"; 

    $sql3="SELECT * FROM category WHERE sectionid='$sectionid'";
    $pageResult=mysql_query($sql3) or die ("Error!! BAD SELECT SEARCH STATEMENT");

    echo "<ul>";
    while($page = mysql_fetch_array($pageResult){
       extract($page);
       //process and print each child <li>...</li> here 
       //(this is a cut down example) where you would add your if/elseif section
       echo "<li>$title</li>";
    }
    echo "</ul>"; //close child UL
    echo "</li>"; //close parent LI
}

我認為你需要在第一個中嵌套第二個for循環,以便ul標簽嵌套在li中:一般准則是:

   for($i=1;$i<=$nrows;$i++) {
          $row = mysql_fetch_array($result);
          extract($row);

          $sections[] = $section;
          $sectionids[] = $sectionid;

          if ($section == "FORUM") {
            echo"<li><a href='#' rel='dropmenu$i'>$section</a>";
            for($s=0;$s<count($sections);$s++) { //Filter $sections for FORUM submenu items only
           //submenu items
            } 
            echo "</li>"; 
          } else {
            echo"<li><a href='#h' rel='dropmenu$i'>$section</a>";
            for($s=0;$s<count($sections);$s++) { 
           //submenu items
            }
            echo </li>"; 
          }
        }

我遇到了同樣的問題,開發我們公司的網站導航,提供最好的可擴展解決方案的是所謂的'嵌套集模型'。

邁克希勒在這里的優秀帖子:

http://mikehillyer.com/articles/managing-hierarchical-data-in-mysql/

解釋了所有並給出了嵌套集模型的一個很好的總結。 它應該是一個很好的起點。

它允許您將所有復雜性放入數據庫查詢中,並保持數據庫表和PHP清潔。

基本上,它在數據庫中設置一個“類別”表,並使用左,右相互關聯的值來定義它們的層次結構和關系。

是的,只有一個表...沒有'子類別'表或任何東西......它們都是相同的並且在一張桌子上。 同樣,定義它們的位置和層次結構的是它們的左(lft)和右(rgt)值。

它將指導您如何構建db表以及如何布置站點的類別和子類別。 這對我來說非常好,每當我發現自己必須添加一個類別時,我所做的就是將它添加到類別表中並更改左右值以適應新類別。

希望這對你有所幫助,就像對我一樣!

您需要在里面輸入第二個select語句

  if ($section == "FORUM") {
    echo"<li><a href='#' rel='dropmenu$i'>$section</a>";
       //the ul should start here
    echo "</li>"; 
  } else {
    echo"<li><a href='#h' rel='dropmenu$i'>$section</a>";
       //the ul should start here
    echo "</li>"; 
  }

那么你將不得不避免第二個for循環

 for($s=0;$s<count($sections);$s++) 

因為你可以直接在里面獲得部分ID

$sql3="SELECT * FROM articles WHERE id='$sectionid'";

因此,如果然后在其他內部編寫代碼,則不是很好。

我已經修改了你的代碼,希望它有所幫助,還沒有刪除第二個for循環,但我認為它不需要,根據你的要求修改。

<ul class="sf-menu">

<li><a href="#">HOME</a></li>

<?php
$sql="SELECT * FROM section ORDER BY orderID";
$result=mysql_query($sql) or die ("Error!! BAD SELECT SEARCH STATEMENT");
$nrows = mysql_num_rows($result);

// Top level Items

for($i=1;$i<=$nrows;$i++) {
  $row = mysql_fetch_array($result);
  extract($row);

  $sections[] = $section;
  $sectionids[] = $sectionid;

      echo "<li><a href='";

      if ($section == "FORUM")
          echo "#";
      else
          echo "#h";

      echo "' rel='dropmenu$i'>$section</a>";

      for($s=0;$s<count($sections);$s++) {

      /*$sm1 = ($s - 1);*/
      $sp1 = ($s + 1);

      $sql3="SELECT * FROM category WHERE sectionid='$sectionids[$s]'";
      $result3=mysql_query($sql3) or die ("Error!! BAD SELECT SEARCH STATEMENT");
      $nrows3 = mysql_num_rows($result3);

      if ($nrows3 > 0) {
        echo"<ul>";
        for($t=0;$t<$nrows3;$t++) {
          $row3 = mysql_fetch_array($result3);
          extract($row3);

          if ($type=='Photo') {
            $title20 = strtolower($title);
            $title20 = str_replace(" ", "_", $title20);
            $sec = strtolower($sections[$s]);
            $sec = str_replace(" ", "_", $sec);
            if ($sec=='photos') {
              echo"<li><a href='" . dirname($_SERVER['PHP_SELF']) . "$sec/$catID-$title20/1.html'>$title</a></li>";
            }

            else {
              echo"<li><a href='" . dirname($_SERVER['PHP_SELF']) . "$sec/photos/$catID-$title20/1.html'>$title</li></a>";
            }

          } elseif ($type=="Contact") {
            $title20 = strtolower($title);
            $title20 = str_replace(" ", "_", $title20);
            echo "<li><a href='" . dirname($_SERVER['PHP_SELF']) . "contactus/contact_$title20.html'>$title</a></li>";
          } elseif ($type=='Quote') {

            $sql4="SELECT articleID FROM article WHERE category='49' AND Now() > publishingdate ORDER BY publishingdate DESC LIMIT 0, 1";
            $result4=mysql_query($sql4) or die ("Error! bad select statement");
            $row4=mysql_fetch_array($result4);
            extract($row4);

            echo "<li><a href='" . dirname($_SERVER['PHP_SELF']) . "everton_quotes.php?id=$articleID'>$title</a></li>";
          }
          elseif ($type=='LastMatch') {
            $sql4="select r.matchID as matchID2, r.venue, r.versus as versus2, s.year FROM regmatch r, season s WHERE r.season=s.seasonID AND Now() > r.matchdate ORDER BY r.matchdate DESC LIMIT 0,1";
            $result4=mysql_query($sql4) or die ("Error! bad select statement");
            $nrows4=mysql_num_rows($result4);
            if ($nrows4 > 0) {
              $row4=mysql_fetch_array($result4);
              extract($row4);
              if ($venue=='Home') {
                $teams = "Everton V $versus2";
                $teams2 = "everton_vs_" . str_replace(" ", "_", strtolower($versus2));
              }
              else {
                $teams = "$versus V Everton";
                $teams2 = str_replace(" ", "_", strtolower($versus2)) . "_vs_everton";
              }

              $year = str_replace("/", "-", $year);
              echo "<li><a href='" . dirname($_SERVER['PHP_SELF']) . "match/$year/$matchID2-$teams2/" . strtolower($venue) . "/matchreport.html'>$title</a></li>";
            }
          } elseif ($type=='NextMatch') {

            $sql5="select r.matchID as matchID3, r.venue, r.versus as versus2, s.year FROM regmatch r, season s WHERE r.season=s.seasonID AND r.matchdate > Now() ORDER BY r.matchdate ASC LIMIT 0,1";
            $result5=mysql_query($sql5) or die ("Error! bad select statement");
            $nrows5=mysql_num_rows($result5);
            if ($nrows5 > 0) {
              $row5=mysql_fetch_array($result5);
              extract($row5);
              if ($venue=='Home') {
                $teams = "Everton V $versus2";
                $teams2 = "everton_vs_" . str_replace(" ", "_", strtolower($versus2));
              }
              else {
                $teams = "$versus2 V Everton";
                $teams2 = str_replace(" ", "_", strtolower($versus2)) . "_vs_everton";
              }

              $year = str_replace("/", "-", $year);
              echo "<li><a href='" . dirname($_SERVER['PHP_SELF']) . "match/$year/$matchID3-$teams2/" . strtolower($venue) . "/teamnews.html'>$title</a></li>";
            }
          } else {

    // Overides for missing pages

            if($title == "Gwladys Street Preacher") {
              echo"<li><a href='/fans/121-gwladys_street_preacher/index.html'>$title</a></li>";
            }

            elseif($title == "The Secret Fan") {
              echo"<li><a href='/news/124-secret-fan/index.html'>$title</a></li>";
            }

            elseif($title == "Toffee Girl") {
              echo"<li><a href='/fans/125-toffee_girl/index.html'>$title</a></li>";
            }

            else {

              echo"<li><a href='" . dirname($_SERVER['PHP_SELF']) . $link . "'>$title</a></li>";

            }

          }

        }

        echo"</ul>";
      }

    }//end of for

    echo "</li>";
  }

// Submenu Items

echo "</ul>";

?>

看到這個,注意:我添加了一個名為'has_sub'的索引來檢查該部分是否有sub,然后為它創建一個子菜單

echo '<ul>';
$array = array();
while($row = mysql_fetch_array($query_main_data)) {
    if($row['has_sub'] === 'yes')  {
       echo '<li><a>'.$row['section_name'].'</a></li>';
       echo '<ul>';
       while($row2 = mysql_fetch_array($query_sub_data)) {
          echo '<li><a>'.$row['section_name'].'</a></li>';
       }
       echo '</ul>';
    }
}
echo '</ul>';

tl; dr獲取所有數據,然后構建菜單

有很多方法可以做到這一點,但沒有一個是錯的; 在我必須這樣做的任何地方,我們擁有比數據庫服務器更多的Web服務器,因此為了更好地擴展我們嘗試最小化數據庫調用,並且為了讓開發人員保持簡單,我們盡可能多地在數據庫之外提取邏輯並完成所有操作在php / javascript中處理。

既然您在開始時就知道自己想要什么數據(也就是說,根據傳入的邏輯或任何內容,您不必從數據庫中提取不同內容),您可以在開頭提取所需的所有數據。頁面然后構建菜單,而不是在從數據庫中提取時嘗試執行此操作。 這使您可以1)分離進行數據庫調用的代碼和保存用於構建菜單的邏輯的代碼,以及2)將數據庫調用減少到只有兩個而不是1 +多個部分。 根據您的需要,#2可能不是一個重要因素,但如果您在開始時將所有內容分開,則可以更容易閱讀。

像這樣的東西(可能更干凈):

<li><a href="#">HOME</a></li>

<?php

$sql="SELECT * FROM section ORDER BY orderID";
$result=mysql_query($sql) or die ("Error!! BAD SELECT SEARCH STATEMENT");
$nrows = mysql_num_rows($result);

// Top level Items

for($i=1;$i<=$nrows;$i++) {
  $row = mysql_fetch_array($result);
  extract($row);

  $sections[$sectionid] = $section; //we want to reference the section by the id later
  $sectionids[] = $sectionid;
}

// Here we can pull all of the subsections we need
$all_section_ids = implode(',', $sectionids); // join all of the ids with a comma
// SQL IN lets you select all rows where the sectionid matches any of a list
$sql3="SELECT * FROM category WHERE sectionid IN ($all_section_ids)";
$result=mysql_query($sql) or die ("Error!! BAD SELECT SEARCH STATEMENT");
$nrows = mysql_num_rows($result);

for($i=1;$i<=$nrows;$i++) {
  $row = mysql_fetch_array($result);
  extract($row);

  //Whatever values that you need from the category table, depends on what your data looks like
  $subsections[$sectionid][] = $subsection;
  $types[$sectionid][] = $type; //each sectionid gets a separate array
  $some_array[$sectionid][] = $whatever_variable;
}

//Now we can loop through and create everything
foreach ($sections as $id => $section) {
    //now $section is the name and $id is the sectionid for that section
    echo '<li><a href="whatever link"></a>';
    echo '<ul>';
    //since we separated the subsections by sectionid, we can do this
    foreach ($subsections[$id] as $subsection) {
        echo '<li>';
        //whatever logic you need to to build the inner list
        echo '</li>';
    }
    echo '</ul>';
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM