###実現したいこと
mysql に登録した商品マスターのカテゴリー名をPHPでリストメニューを作りたい。(Part.3)
正直なところ、前回の質問で回答していた内容をまだ理解できていません
とても難しいですsqlは
ここまでくるとPHP内で処理した方がいいのか、SQLだけで処理できるのか判断がつかなくなりました。
助言お願いします。
初心者です。
###用意したmysql
hs_id | ct_01 | ct_02 | ct_03 | ct_04 | ct_05 | ct_06 | name | URL |
---|---|---|---|---|---|---|---|---|
1001 | A | AA | AAA | A-ct4 | name1001 | http://www | ||
1002 | A | AA | BBB | A-ct4 | name1002 | http://www | ||
1003 | A | AA | BBB | B-ct4 | name1003 | http://www | ||
1004 | A | AA | CCC | A-ct4 | name1004 | http://www | ||
1005 | A | BB | BBB | A-ct4 | name1005 | http://www | ||
1006 | A | BB | BBB | A-ct4 | name1006 | http://www | ||
1007 | A | BB | CCC | B-ct4 | name1007 | http://www | ||
1008 | B | AA | AAA | A-ct4 | A-ct5 | A-ct6 | name1008 | http://www |
1009 | B | BB | AAA | B-ct4 | B-ct5 | name1009 | http://www | |
1010 | B | BB | BBB | A-ct4 | C-ct5 | name1010 | http://www |
を読み込みsqlにて下記のhtmlを書き出したいです。
前回部分的に質問したのですが、理解できない部分があり悩んでいます。
html
1<ul> 2 <li><a href="#" class="item-arrow">A</a> 3 <ul class="level2"> 4 <li><a href="#" class="item-arrow">AA</a> 5 <ul class="level3"> 6 <li><a href="#" class="item-arrow">AAA</a> 7 <ul class="level4"> 8 <li><a href="#" class="item-arrow">A-ct4</a> 9 <ul class="level5"> 10 <li><a href="URL">name1001</a></li> 11 </ul> 12 </li> 13 </ul> 14 </li> 15 <li><a href="#" class="item-arrow">BBB</a> 16 <ul class="level4"> 17 <li><a href="#" class="item-arrow">A-ct4</a> 18 <ul class="level5"> 19 <li><a href="URL">name1002</a></li> 20 </ul> 21 </li> 22 <li><a href="#" class="item-arrow">B-ct4</a> 23 <ul class="level5"> 24 <li><a href="URL">name1003</a></li> 25 </ul> 26 </li> 27 </ul> 28 </li> 29 <li><a href="#" class="item-arrow">CCC</a> 30 <ul class="level4"> 31 <li><a href="#" class="item-arrow">A-ct4</a> 32 <ul class="level5"> 33 <li><a href="URL">name1004</a></li> 34 </ul> 35 </li> 36 </ul> 37 </li> 38 </ul> 39 </li> 40 <li><a href="#" class="item-arrow">BB</a> 41 <ul class="level3"> 42 <li><a href="#" class="item-arrow">BBB</a> 43 <ul class="level4"> 44 <li><a href="#" class="item-arrow">A-ct4</a> 45 <ul class="level5"> 46 <li><a href="URL">name1005</a></li> 47 <li><a href="URL">name1006</a></li> 48 </ul> 49 </li> 50 </ul> 51 </li> 52 <li><a href="#" class="item-arrow">CCC</a> 53 <ul class="level4"> 54 <li><a href="#" class="item-arrow">B-ct4</a> 55 <ul class="level5"> 56 <li><a href="URL">name1007</a></li> 57 </ul> 58 </li> 59 </ul> 60 </li> 61 </ul> 62 </li> 63 </ul> 64 </li><!-- A --> 65 <li>B 66 <ul class="level2"> 67 <li><a href="#" class="item-arrow">AA</a> 68 <ul class="level3"> 69 <li><a href="#" class="item-arrow">AAA</a> 70 <ul class="level4"> 71 <li><a href="#" class="item-arrow">A-ct4</a> 72 <ul class="level5"> 73 <li><a href="#" class="item-arrow">A-ct5</a> 74 <ul class="level6"> 75 <li><a href="#" class="item-arrow">A-ct6</a> 76 <ul class="level7"> 77 <li><a href="URL">name1008</a></li> 78 </ul> 79 </li> 80 </ul> 81 </li> 82 </ul> 83 </li> 84 </ul> 85 </li> 86 </ul> 87 </li> 88 </ul> 89 </li><!-- B --> 90</ul>
###試したsql文
php
1<?PHP 2require_once("./js/nic_MYDB.php"); 3$pdo = db_connect(); 4 5// 01-02 ct-0102 6$sql= "SELECT ct_02,COUNT(*) AS count FROM products_table where hs_id >= 1001 AND hs_id <= 1999 GROUP BY ct_02 ORDER BY hs_id ASC "; 7$stmh0102 = $pdo->query($sql); 8 9$sql= " 10SELECT REPLACE( 11 CONCAT( '<li><a href=\"#\" class=\"item-arrow\">', IFNULL( T1.ct_03, '' ) 12 , '</a><ul ><li><a href=\"#\" class=\"item-arrow\">' 13 , REPLACE( GROUP_CONCAT( DISTINCT T1.ct_04, '</a></li><li>' ) , ',', '' ) 14 , '</li></ul></li>' ) 15 , '</li><li></li></ul></li>' 16 , '</li></ul></li>' ) AS html_data 17from products_table T1 18where T1.hs_id >= 1001 19AND T1.hs_id <= 1999 20GROUP BY T1.ct_03 21ORDER BY T1.ct_03 22;"; 23$stmh0104a = $pdo->query($sql); 24?> 25 26<nav id="dd"> 27<ul> 28<li class="font18"><a href="http://www.nikkohm.com/test/#" class="active">Part Search</a> 29 <!-- 01 --> 30 <ul class="level1" style="display: block;"> 31 <!-- 01-01 --> 32 <li><a href="#" class="item-arrow">Power</a> 33 34<?PHP 35echo '<!-- 01-02 -->'; 36echo "<ul class=\"level2\" style=\"display: none;\">"; 37while ($row = $stmh0102->fetch(PDO::FETCH_ASSOC)) { 38 echo "<li><a href=\"#\" class=\"item-arrow\">"; 39 echo htmlspecialchars($row["ct_02"]); 40 echo "</a>"; 41 42 echo "<!-- 01-03 -->"; 43 echo "<ul class=\"level2\" style=\"display: none;\">"; 44 while ($row = $stmh0104a->fetch(PDO::FETCH_ASSOC)) { 45 echo ($row["html_data"]); 46 } 47 echo "</ul><!-- 01-03 -->"; 48 echo "</li>"; 49} 50echo "</ul><!-- 01-02 -->"; 51?> 52 53 </li><!-- 01-01 --> 54 <!-- 01-02 --> 55 <li><a href="#" class="item-arrow">Shunt</a> 56 </li><!-- 01-02 --> 57 </ul><!-- 01 --> 58</li><!-- Part Search --> 59</ul>
###試した結果のhtml
html
1<nav id="dd"> 2 <ul> 3 <li class="font18"><a href="http://www.nikkohm.com/test/#" class="active">Part Search</a> 4 <!-- 01 --> 5 <ul class="level1" style="display: block;"> 6 <!-- 01-01 --> 7 <li><a href="#" class="item-arrow">Power</a> 8 9 <!-- 01-02 --> 10 <ul class="level2" style="display: none;"> 11 <li><a href="#" class="item-arrow">A</a><!-- 01-03 --> 12 <ul class="level2" style="display: none;"> 13 <li><a href="#" class="item-arrow">AA</a> 14 <ul class="level2" style="display: none;"> 15 <li><a href="#" class="item-arrow">AAA</a></li> 16 <li>BBB</a></li> 17 <li>CCC</a></li> 18 </ul> 19 </li> 20 <li><a href="#" class="item-arrow">BB</a> 21 <ul class="level2" style="display: none;"> 22 <li><a href="#" class="item-arrow">BBB</a></li> 23 </ul> 24 </li> 25 </ul> 26 <!-- 01-03 --></li> 27 </ul> 28 <!-- 01-02 --> 29 </li> 30 <!-- 01-01 --> 31 <!-- 01-02 --> 32 <li><a href="#" class="item-arrow">Shunt</a> </li> 33 <!-- 01-02 --> 34 </ul> 35 <!-- 01 --> 36 </li> 37 <!-- Part Search --> 38 </ul> 39</nav>
tomari_perform様に教えていただいたsqlに追加したのですが
どこが悪いのか BBB、CCCにリンクが付きません。
よろしくお願い致します。
テスト-A
テスト-B
テストーC
PHP
1 $db_user = "***"; // ユーザー名 2 $db_pass = "***"; // パスワード 3 $db_host = "***"; // ホスト名 4 $db_name = "***"; // データベース名 5 $db_type = "mysql"; // データベースの種類 6 7 $dsn = "$db_type:host=$db_host;dbname=$db_name;charset=utf8"; 8 9 try { 10 $pdo = new PDO($dsn, $db_user,$db_pass); 11 $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 12 $pdo->setAttribute(PDO::ATTR_EMULATE_PREPARES, false); 13 $sql ='SELECT name,level,url,link,(SELECT COUNT(*) FROM tbl AS t2 WHERE t2.l BETWEEN t1.l AND t1.r AND t2.level=t1.level+1) AS child FROM tbl AS t1 ORDER BY l'; 14 $pdo->query($sql); 15 $rows=$stmt->fetchAll(PDO::FETCH_ASSOC); 16 print get_tree($rows); 17 } catch(PDOException $Exception) { 18 die('エラー :' . $Exception->getMessage()); 19 } 20 21function get_tree($rows){ 22 $indent=3; 23 $l1=0; 24 ob_start(); 25 foreach($rows as $key=>$row){ 26 $l2=$row["level"]; 27 $l3=($key<count($rows)-1)?$rows[$key+1]["level"]:0; 28 if($l1>=$l2){ 29 print str_repeat(" ",($l2-1)*$indent); 30 } 31 if($l1<$l2){ 32 print PHP_EOL; 33 print str_repeat(" ",($l2-1)*$indent); 34 $class=$row["level"]>1?" class=\"level{$row["level"]}\"":""; 35 print "<ul{$class}>".PHP_EOL; 36 print str_repeat(" ",($l2-1)*$indent); 37 } 38 print "<li>"; 39 if($row["link"]==1 and $row["url"]!==""){ 40 /* item-arrowクラスの付け方がおかしかったので修正 */ 41 $class=$row["child"]>0?" class=\"item-arrow\"":""; 42 print "<a href=\"{$row["url"]}\"{$class}>{$row["name"]}</a>"; 43 }else{ 44 print $row["name"]; 45 } 46 if($row["child"]>0) print "(".$row["child"].")"; 47 if($l2==$l3){ 48 print "</li>".PHP_EOL;; 49 } 50 if($l2>$l3){ 51 print "</li>".PHP_EOL; 52 for($i=$l2-$l3-1;$i>0;$i--){ 53 print str_repeat(" ",($i)*$indent); 54 print "</ul>".PHP_EOL; 55 print str_repeat(" ",($i-1)*$indent); 56 print "</li>".PHP_EOL; 57 } 58 print str_repeat(" ",($l3)*$indent); 59 print "</ul>".PHP_EOL; 60 } 61 $l1=$l2; 62 } 63 $str=ob_get_contents(); 64 ob_end_clean(); 65 return $str; 66}
テスト-C のSQLのみ実行
テスト-D
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2017/08/01 08:30
2017/08/01 08:34
2017/08/01 09:34
2017/08/01 11:52
2017/08/01 12:09
2017/08/01 12:17 編集
2017/08/01 14:34
2017/08/01 14:38
2017/08/02 00:17
2017/08/02 00:58
2017/08/02 01:14
2017/08/02 02:04
2017/08/02 02:27
2017/08/02 02:36
2017/08/02 02:42
2017/08/02 02:52
2017/08/02 03:00
2017/08/02 04:04
2017/08/02 04:06
2017/08/02 04:31
2017/08/02 04:37
2017/08/02 04:42
2017/08/02 04:47
2017/08/02 05:13
2017/08/02 05:19
2017/08/02 05:57
2017/08/02 06:06
2017/08/03 04:53
2017/08/03 05:08
2017/08/03 05:46
2017/08/03 06:03
2017/08/03 07:16
2017/08/03 07:35
2017/08/06 05:31 編集