2017-01-04 5 views
1

カテゴリとサブカテゴリをグループ化し、ヘッダーmeniuのすべての結果をmisqli DBから表示できますか?私はcategoryというテーブルを3列id, category, parentとしましたが、そのカテゴリの値がparent=0となるようにparentを使用してカテゴリをグループ化し、メインカテゴリと親をcorespuningするサブカタログの値をグループ化しました。しかし、問題はコードが私に最初のメインカテゴリと最初に対応するサブカテゴリだけを表示し、すべてを表示したいことです。ヘッダーmeniuカテゴリとサブカテゴリをグループ化する方法stmtステートメントの結果を使用して親と表示する

私は(カテゴリヘッダは、それらであることを意味fruits id=1 , parent=0cars id=2 parent=0parent=0clothes id=3 parent=0)3カテゴリ値を有しており、例えば車のために私は2サブカテゴリ値(moto id=52 parent=2auto 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> 
私の英語と私の問題のため申し訳ありません

をアイデアを得たが、私は初心者

+0

が、誰も私を助けるために知っているあなたは、私が与えたanswearを変更しようとすることができますしてください – Alcatraz007

+0

?この質問では、最も簡単なのは、私が編集した受け入れられた回答です。 http://stackoverflow.com/a/41398248/2630660素早く簡単な方法は基本的には最初に親0を選択し、whileループでparent = category idを選択する別のクエリを作成します。数時間後に私はあなたにコードを渡すことができます。私は今、モバイルに乗っています。 –

+0

ありがとう、私はあなたの答えを見て、説明の答えは本当に私が間違いをしたことを理解したので、助けた。 – Alcatraz007

答えて

0

最初の$stmtを2番目の$stmt変数で上書きしています。そのため、最初のメニュー項目とそのためのサブカテゴリだけが表示されています。私はあなたのコードにいくつかの調整を加え、それを実行する別の方法を追加しました。これは、ループクエリのようなパフォーマンスには影響しません。また、サブキャスターグを持たない場合は、スクリプトを終了しないでください。空のプレースホルダを作成するだけで、ページの読み込みを続けることができます。

$stmt->store_result();は、行数を返しません。 $stmt->num_rowsプロパティにアクセスするために呼び出すと、見つかった行の結果が表示されます。 2番目の例(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); 
ダブルポスト申し訳ありません
+0

ありがとう、今私は間違っている場所を参照してください、使用する場合は//私はこのように好きです。 .. 1 SUBLEVELの場合のみ //上記のコードを別のものにする必要がある無制限のサブカテゴリカテゴリの場合、配列のカートは機能しませんが、1つのカテゴリと1つのサブカテゴリで正常に機能します – Alcatraz007

+0

配列のカートは何を意味しますか?仕事は?私はメニューを注文しなかった最初の例を除き、同じ結果を出力するはずです。 –

+0

私が固定していたことはありませんでした。私が "/ /無制限のdeptサブカテゴリのために、あなたが異なる承認を必要とするために"という例を使用したとしたら、他の配列に問題が生じていましたが、 – Alcatraz007

関連する問題