よ
最初の$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);
ダブルポスト申し訳ありません
が、誰も私を助けるために知っているあなたは、私が与えたanswearを変更しようとすることができますしてください – Alcatraz007
?この質問では、最も簡単なのは、私が編集した受け入れられた回答です。 http://stackoverflow.com/a/41398248/2630660素早く簡単な方法は基本的には最初に親0を選択し、whileループでparent = category idを選択する別のクエリを作成します。数時間後に私はあなたにコードを渡すことができます。私は今、モバイルに乗っています。 –
ありがとう、私はあなたの答えを見て、説明の答えは本当に私が間違いをしたことを理解したので、助けた。 – Alcatraz007