【问题标题】:how to Group header meniu category and subcategory mysqli using stmt statement results and display by parent如何使用 stmt 语句结果对标题菜单类别和子类别 mysqli 进行分组并按父项显示
【发布时间】:2017-01-04 17:06:14
【问题描述】:

如何对类别和子类别进行分组并显示来自 misqli DB 的所有结果以获取标题菜单?我制作了一个名为category 的表,其中包含3 列id, category, parent,然后我使用parent 对类别进行分组,值为parent=0 的类别和子类别值,其中核心父类与主要类别。但问题是代码只显示第一个主类别和第一个对应的子类别,我想显示所有。

所以我有 3 个类别值(fruits id=1 , parent=0cars id=2 parent=0clothes id=3 parent=0parent=0,这意味着它们是类别标题),例如对于汽车,我有 2 个子类别值 (moto id=52 parent=2 auto id=34 parent=2) 你明白了...

$parentTake = '0';
$categorieDrowdown = "";
$categorieDrowdownLista = "";
$stmt = $con->prepare('SELECT id, category, parent FROM category WHERE parent=?');
    $stmt->bind_param('i', $parentTake);
    $stmt->execute();
    $existCount = $stmt->store_result();
        if($existCount == 0){
    echo "nU ai nici o categorie adaugata";
     exit();
        }
    $stmt->bind_result($idParent, $categorie, $parent);
    while ($stmt->fetch())    {
        $idParent;
        $categorie;
        $categorieDrowdown .= '<li class="dropdown"> <a href="#" class="dropdown-toggle" data-toggle="dropdown" role="button" aria-haspopup="true" aria-expanded="false"> '.$categorie.'<span class="caret"></span></a>       
            ';      

    $stmt = $con->prepare('SELECT id, category, parent FROM category WHERE parent=?');
    $stmt->bind_param('i', $idParent);
    $stmt->execute();
    $existCount = $stmt->store_result();
        if($existCount == 0){
    echo "nU ai nici o subcategorie lista adaugata";
     exit();
        }
    $stmt->bind_result($idLista, $categorieLista, $parentLista);
    while ($stmt->fetch())    {
        $idLista;
        $categorieLista;
        $categorieDrowdownLista .= ' <ul class="dropdown-menu">
        <li><a href="#">'.$categorieLista.'</a></li>
            </ul>
        </li>      
            ';
        }//close while subcategorie
    }//close while  categorie first select

和显示

   <div class="collapse navbar-collapse" id="bs-example-navbar-collapse-1">
      <ul class="nav navbar-nav">
        <li class="active"><a href="#">Home </a></li>
        <li><a href="#">Admin CMS</a></li>
        <?php echo $categorieDrowdown;//CATEGORIE PRIMA ex: fructe?>    
        <?php echo $categorieDrowdownLista;//CATEGORIE SECUNDA ex:mere?>    

      </ul>

对不起我的英语和我的问题,但我是新手

【问题讨论】:

  • 抱歉重复发帖,但有人知道帮助我吗?请
  • 您可以尝试修改我在这个问题中给出的答案,但最简单的是我编辑的接受的答案。 stackoverflow.com/a/41398248/2630660 快速简单的方法基本上是您首先要选择父 0,然后在 while 循环中进行另一个选择父 = 类别 id 的查询。我可以在几个小时内给你代码,我现在在手机上。
  • 谢谢你,我看到了你的回答,解释的答案真的帮助了我,因为我明白我在哪里做错了,再次感谢你

标签: php loops mysqli while-loop


【解决方案1】:

您正在用第二个$stmt 变量覆盖第一个$stmt,这就是为什么您只获得第一个菜单项及其子类别的原因。我对您的代码进行了一些调整,并添加了一种替代方法,它不会像循环查询那样对性能造成影响。另外值得一提的是,如果您没有子类别,则不应退出脚本。只需制作一个空占位符,您就可以继续加载页面。

$stmt-&gt;store_result(); 不返回行数。您调用它可以访问$stmt-&gt;num_rows 属性,这将为您提供找到的行的结果。请注意,我没有在第二个示例(mysqli::store_result())中存储结果,我只是在填充$menu 数组,甚至不需要知道我是否有结果。

$start = microtime( true );
$output = '';

$stmt = $con->prepare( '
    SELECT
        id, category, parent
    FROM category
    WHERE parent = 0
' );
$stmt->execute();
$stmt->store_result();
// YOU DON'T WANT TO DO THIS... o.O it's fine for debuging tho
//~ if($stmt->num_rows == 0){
    //~ echo "nU ai nici o categorie adaugata";
    //~ exit();
//~ }
// INSTEAD
if( $stmt->num_rows > 0 ){
$stmt->bind_result($idParent, $categorie, $parent);
    while ($stmt->fetch()){
        $output .= '
        <li class="dropdown">
            <a href="#" class="dropdown-toggle" data-toggle="dropdown" role="button" aria-haspopup="true" aria-expanded="false">
                ' . $categorie . ' <span class="caret"></span>
            </a>
            <ul class="dropdown-menu">';

        // rename $stmt to $stmt2 so you'll not overwrite the initial statement
        $stmt2 = $con->prepare('SELECT id, category, parent FROM category WHERE parent=?');
        $stmt2->bind_param('i', $idParent);
        $stmt2->execute();
        $stmt2->store_result();
        // NOR THIS... o.O
        //~ if($stmt2->num_rows == 0){
            //~ echo "nU ai nici o subcategorie lista adaugata";
            //~ exit();
        //~ }
        // INSTEAD
        if( $stmt2->num_rows > 0 ){
            $stmt2->bind_result($idLista, $categorieLista, $parentLista);
            while ($stmt2->fetch()){
                $output .= '
                <li>
                    <a href="#">'.$categorieLista.'</a>
                </li>';
            } //close while subcategorie
        }
        $output .= '
            </ul>
        </li>';
    } // close while  categorie first select
}

echo $output, "\n\n\n";
echo 'Duration: ', microtime( true ) - $start, "\n\n\n";

//-----------------------------------------------------------

// I LIKE IT THIS WAY... ONLY FOR 1 SUBLEVEL THO
// for unlimited dept sub categories you need different approce
$start = microtime( true );
unset( $output );
$output = '';
$menu = array();
$sel = $con->prepare( '
    SELECT
        id, category, parent
    FROM category
    ORDER BY parent, category ASC
' );
$sel->execute();
$sel->bind_result( $id, $category, $parent );
while( $sel->fetch() ){
    if( ! $parent ){ // same as $parent == 0
        $menu[ $id ] = array(
            'name' => $category,
            'sub'  => array(),
        );
    } else {
        $menu[ $parent ]['sub'][ $id ] = array(
            'name' => $category,
        );
    }
}
$sel->close();
foreach( $menu as $id => $item ){
    $output .= '
    <li class="dropdown">
        <a href="#" class="dropdown-toggle" data-toggle="dropdown" role="button" aria-haspopup="true" aria-expanded="false">
            ' . $item['name'] . ' <span class="caret"></span>
        </a>
        <ul class="dropdown-menu">';
    foreach( $item['sub'] as $subid => $subitem ){
        $output .= '
            <li>
                <a href="#">' . $subitem['name'] . '</a>
            </li>';
    }
    $output .= '
        </ul>
    </li>';
}
//~ echo '<pre>', var_dump( $menu ), '</pre>';
echo $output, "\n\n\n";
echo 'Duration: ', microtime( true ) - $start, "\n\n\n";

示例输出:

        <li class="dropdown">
            <a href="#" class="dropdown-toggle" data-toggle="dropdown" role="button" aria-haspopup="true" aria-expanded="false">
                fruits <span class="caret"></span>
            </a>
            <ul class="dropdown-menu">
                <li>
                    <a href="#">apple</a>
                </li>
                <li>
                    <a href="#">orange</a>
                </li>
                <li>
                    <a href="#">banana</a>
                </li>
                <li>
                    <a href="#">Pen Pineapple Apple Pen</a>
                </li>
            </ul>
        </li>
        <li class="dropdown">
            <a href="#" class="dropdown-toggle" data-toggle="dropdown" role="button" aria-haspopup="true" aria-expanded="false">
                cars <span class="caret"></span>
            </a>
            <ul class="dropdown-menu">
                <li>
                    <a href="#">moto</a>
                </li>
                <li>
                    <a href="#">auto</a>
                </li>
            </ul>
        </li>
        <li class="dropdown">
            <a href="#" class="dropdown-toggle" data-toggle="dropdown" role="button" aria-haspopup="true" aria-expanded="false">
                clothes <span class="caret"></span>
            </a>
            <ul class="dropdown-menu">
                <li>
                    <a href="#">skirt</a>
                </li>
            </ul>
        </li>


Duration: 0.0020129680633545



    <li class="dropdown">
        <a href="#" class="dropdown-toggle" data-toggle="dropdown" role="button" aria-haspopup="true" aria-expanded="false">
            cars <span class="caret"></span>
        </a>
        <ul class="dropdown-menu">
            <li>
                <a href="#">auto</a>
            </li>
            <li>
                <a href="#">moto</a>
            </li>
        </ul>
    </li>
    <li class="dropdown">
        <a href="#" class="dropdown-toggle" data-toggle="dropdown" role="button" aria-haspopup="true" aria-expanded="false">
            clothes <span class="caret"></span>
        </a>
        <ul class="dropdown-menu">
            <li>
                <a href="#">skirt</a>
            </li>
        </ul>
    </li>
    <li class="dropdown">
        <a href="#" class="dropdown-toggle" data-toggle="dropdown" role="button" aria-haspopup="true" aria-expanded="false">
            fruits <span class="caret"></span>
        </a>
        <ul class="dropdown-menu">
            <li>
                <a href="#">apple</a>
            </li>
            <li>
                <a href="#">banana</a>
            </li>
            <li>
                <a href="#">orange</a>
            </li>
            <li>
                <a href="#">Pen Pineapple Apple Pen</a>
            </li>
        </ul>
    </li>


Duration: 0.00058293342590332

数据库结构和数据

CREATE TABLE `category` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `category` varchar(255) NOT NULL,
  `parent` int(10) NOT NULL DEFAULT '0',
  PRIMARY KEY (`id`),
  KEY `parent` (`parent`)
) ENGINE=InnoDB AUTO_INCREMENT=11 DEFAULT CHARSET=utf8;

INSERT INTO `category` (`id`, `category`, `parent`) VALUES
(1, 'fruits', 0),
(2, 'cars', 0),
(3, 'clothes', 0),
(4, 'moto', 2),
(5, 'auto', 2),
(6, 'apple', 1),
(7, 'orange', 1),
(8, 'banana', 1),
(9, 'skirt', 3),
(10, 'Pen Pineapple Apple Pen', 1);

【讨论】:

  • 谢谢,现在我知道我错在哪里了,但是如果使用 // 我喜欢这种方式... 仅适用于 1 SUBLEVEL THO // 对于无限的部门子类别,您需要对上面的代码进行不同的处理,数组购物车不起作用,但仅适用于 1 个类别和 1 个子类别
  • 你是什么意思阵列车不工作?它应该输出相同的结果,除了在第一个示例中我没有订购菜单。
  • 没关系,我已经解决了,我告诉过我是否使用带有 // for unlimited dept sub categories you need different approce 的示例,这让我对我拥有的其他数组产生了问题,但我只有 1 个类别和 1 个子类别
  • 哦,:)。这就是为什么我给出了一个我用来生成示例输出的 SQL 示例。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-04-02
  • 1970-01-01
相关资源
最近更新 更多