繁体   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