質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
HTML5

HTML5 (Hyper Text Markup Language、バージョン 5)は、マークアップ言語であるHTMLの第5版です。

MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

データベース

データベースとは、データの集合体を指します。また、そのデータの集合体の共用を可能にするシステムの意味を含めます

Q&A

解決済

2回答

2730閲覧

mysql に登録した商品マスターのカテゴリー名をPHPでリストメニューを作りたい。(難易度5+)

daisaku64

総合スコア16

HTML5

HTML5 (Hyper Text Markup Language、バージョン 5)は、マークアップ言語であるHTMLの第5版です。

MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

データベース

データベースとは、データの集合体を指します。また、そのデータの集合体の共用を可能にするシステムの意味を含めます

1グッド

2クリップ

投稿2017/08/01 07:05

編集2017/08/03 05:07

###実現したいこと
mysql に登録した商品マスターのカテゴリー名をPHPでリストメニューを作りたい。(Part.3)

正直なところ、前回の質問で回答していた内容をまだ理解できていません
とても難しいですsqlは
ここまでくるとPHP内で処理した方がいいのか、SQLだけで処理できるのか判断がつかなくなりました。
助言お願いします。

初心者です。

###用意したmysql

hs_idct_01ct_02ct_03ct_04ct_05ct_06nameURL
1001AAAAAAA-ct4name1001http://www
1002AAABBBA-ct4name1002http://www
1003AAABBBB-ct4name1003http://www
1004AAACCCA-ct4name1004http://www
1005ABBBBBA-ct4name1005http://www
1006ABBBBBA-ct4name1006http://www
1007ABBCCCB-ct4name1007http://www
1008BAAAAAA-ct4A-ct5A-ct6name1008http://www
1009BBBAAAB-ct4B-ct5name1009http://www
1010BBBBBBA-ct4C-ct5name1010http://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

イメージ説明
赤い部分に</li>

x_x👍を押しています

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

この手の階層構造は、自分の直接の親情報だけを持つ「隣接リストモデル」が
一般的で、それを管理しやすいように「入れ子集合モデル」に変換して利用します。
ご提示の階層は「経路列挙モデル」に近いですが、カテゴリをカラムで管理
しているため、拡張性がわるく持ち方としていまいちです。

今回のテーブル構成はマストでしょうか?

隣接リストモデルから入れ子集合モデルへ

  • 隣接リストモデル

SQL

1create table tbl( 2id int not null unique, 3parent_id int null, 4name varchar(30), 5url varchar(100), 6link tinyint, 7level int not null default 0, 8l int null, 9r int null 10);
  • 入れ子集合モデルへのコンバータ

SQL

1DROP PROCEDURE IF EXISTS SET_LR; 2DELIMITER // 3CREATE PROCEDURE SET_LR() 4BEGIN 5DECLARE a INT DEFAULT 0; 6DECLARE done INT DEFAULT 0; 7DECLARE CUR CURSOR FOR 8SELECT id FROM tbl WHERE level=0 ORDER BY parent_id ASC,id DESC; 9DECLARE CONTINUE HANDLER FOR SQLSTATE '02000' SET done = 1; 10UPDATE tbl SET level=0,l=0,r=0; 11/* level,l,rを初期化*/ 12 13UPDATE tbl SET level=1,l=(SELECT @a:=@a+1 FROM (SELECT @a:=0) AS sub),r=@a:=@a+1 14WHERE parent_id IS NULL 15ORDER BY id; 16/* 先頭データのlevelを1とし、l,rを1ずつ足していく*/ 17 18OPEN CUR; 19REPEAT 20FETCH CUR INTO a; 21IF NOT done THEN 22SET @id=a; 23SET @sql='UPDATE tbl as a1,tbl as a2,tbl as a3 SET a1.l=a2.l+1,a1.r=a2.l+2,a1.level=a2.level+1,a2.r=a2.r+2,a3.r=a3.r+2 WHERE a1.parent_id=a2.id AND a2.l<a3.r AND a1.id=?'; 24/* 子のlに親の1+1、子のrに親のl+2,子のlevelに親のlevel+1親のrを2増やす、親のlより大きいrを2増やす */ 25 26PREPARE stmt from @sql; 27EXECUTE stmt USING @id; 28SET @sql='UPDATE tbl as a1,tbl as a2,tbl as a3 SET a3.l=a3.l+2 WHERE a1.parent_id=a2.id AND a2.l<a3.l and a3.id!=a1.id AND a1.id=?'; 29/* 親の1より大きいlの内、子以外のものを2増やす */ 30 31PREPARE stmt from @sql; 32EXECUTE stmt USING @id; 33END IF; 34UNTIL done END REPEAT; 35CLOSE CUR; 36END 37// 38DELIMITER ;
  • データ投入

SQL

1insert into tbl(id,parent_id,name,url,link) values 2( 1,null,'A','#',1), 3( 2,null,'B','#',1), 4( 3,1,'AA','#',1), 5( 4,1,'BB','#',1), 6( 5,2,'AA','#',1), 7( 6,2,'BB','#',1), 8( 7,3,'AAA','#',1), 9( 8,3,'BBB','#',1), 10( 9,3,'CCC','#',1), 11(10,4,'BBB','#',1), 12(11,4,'CCC','#',1), 13(12,5,'AAA','#',1), 14(13,6,'AAA','#',1), 15(14,6,'BBB','#',1), 16(15,7,'A-ct4','#',1), 17(16,8,'A-ct4','#',1), 18(17,8,'B-ct4','#',1), 19(18,9,'A-ct4','#',1), 20(19,10,'A-ct4','#',1), 21(20,11,'B-ct4','#',1), 22(21,12,'A-ct4','#',1), 23(22,13,'B-ct4','#',1), 24(23,14,'A-ct4','#',1), 25(24,21,'A-ct5','#',1), 26(25,22,'B-ct5','#',1), 27(26,23,'C-ct5','#',1), 28(27,24,'A-ct6','#',1), 29(28,15,'name1001','www',1), 30(29,16,'name1002','www',1), 31(30,17,'name1003','www',1), 32(31,18,'name1004','www',1), 33(32,19,'name1005','www',1), 34(33,19,'name1006','www',1), 35(34,20,'name1007','www',1), 36(35,27,'name1008','www',1), 37(36,25,'name1009','www',1), 38(37,26,'name1010','www',1);
  • コンバート

SQL

1CALL SET_LR;

階層状況の確認

SQL

1SELECT CONCAT( REPEAT( "__", LEVEL -1 ) , name ) AS name 2FROM area 3ORDER BY l

PHPへの書き出し

以前作った分の流用なので若干インデントのバグがありますが
出力するHTML文としてはさほど問題ないはずです
※ポイント

  • classの指定など最大限当初例示いただいたHTMLにあわせたつもりですが

おかしかったらうまく調整してください

  • linkが1でURLが空でなければアンカーが貼られます

あえてリンクを表示したくない場合レコードのlinkを0にするなどテストしてみてください

  • ただしhtmlspecialcharやurlencodeなどかけてないので注意
  • 一応直下の要素数をカウントして表示しておきました

ちなみに、以下SQL文にすればカテゴリを含むすべての子要素数が表示されます

SELECT name,level,url,link,(SELECT COUNT(*)-1 FROM tbl AS t2 WHERE t2.l BETWEEN t1.l AND t1.r ) AS child FROM tbl AS t1 ORDER BY l

※PHP修正

PHP

1 2 3try{ 4 /* PDOの接続は自身の環境に合わせて下さい */ 5 $pdo = new PDO($dsn, $user,$password); 6 $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'; 7 /* 今回prepare処理は不要なのでqueryに変更しておきます 8 $stmt = $pdo->prepare($sql); 9 $stmt->execute([]); 10 */ 11 $stmt = $pdo->query($sql); 12 $rows=$stmt->fetchAll(PDO::FETCH_ASSOC); 13 /*当初gett_reeになっていたので修正します*/ 14 print get_tree($rows); 15}catch(PDOException $e){ 16 die($e->getMessage()); 17} 18 19function get_tree($rows){ 20 $indent=3; 21 $l1=0; 22 ob_start(); 23 foreach($rows as $key=>$row){ 24 $l2=$row["level"]; 25 $l3=($key<count($rows)-1)?$rows[$key+1]["level"]:0; 26 if($l1>=$l2){ 27 print str_repeat(" ",($l2-1)*$indent); 28 } 29 if($l1<$l2){ 30 print PHP_EOL; 31 print str_repeat(" ",($l2-1)*$indent); 32 $class=$row["level"]>1?" class=\"level{$row["level"]}\"":""; 33 print "<ul{$class}>".PHP_EOL; 34 print str_repeat(" ",($l2-1)*$indent); 35 } 36 print "<li>"; 37 if($row["link"]==1 and $row["url"]!==""){ 38 $class=$row["child"]>0?" class=\"item-arrow\"":""; 39 print "<a href=\"{$row["url"]}\"{$class}>{$row["name"]}</a>"; 40 }else{ 41 print $row["name"]; 42 } 43 if($row["child"]>0) print "(".$row["child"].")"; 44 if($l2==$l3){ 45 print "</li>".PHP_EOL;; 46 } 47 if($l2>$l3){ 48 print "</li>".PHP_EOL; 49 for($i=0;$i<$l2-$l3-1;$i++){ 50 print str_repeat(" ",($l2-$i-1)*$indent); 51 print "</ul>".PHP_EOL; 52 print str_repeat(" ",($l2-$i-2)*$indent); 53 print "</li>".PHP_EOL; 54 } 55 print str_repeat(" ",($l3)*$indent); 56 print "</ul>".PHP_EOL; 57 if($l3>0){ 58 print str_repeat(" ",($l3-1)*$indent); 59 print "</li>".PHP_EOL; 60 } 61 } 62 $l1=$l2; 63 } 64 $str=ob_get_contents(); 65 ob_end_clean(); 66 return $str; 67} 68

投稿2017/08/01 07:26

編集2017/08/03 07:14
yambejp

総合スコア114769

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

daisaku64

2017/08/01 08:30

回答ありがとうございます 初心者なものでマストがわかりません。 ごめんなさい
yambejp

2017/08/01 08:34

えーと、表現が悪かったですね > 今回のテーブル構成はマストでしょうか? 今回のテーブル構成以外の方法ではだめでしょうか?という確認です。 マスト=絶対に必要とか他に変えられないとかいう意味の一般名詞です (一般語だと思ってましたが業界によっては使わないのかもしれませんね)
daisaku64

2017/08/01 09:34

データありきのものなので でも必要であれば変換して別ファイルに書き出しも可能です。
yambejp

2017/08/01 11:52

効率的なデータの持ち方を追記しました 一度こちらで試してみて下さい
daisaku64

2017/08/01 12:09

ありがとうございます。 データの形を変えるんですね?私には難しいです。ごめんなさい。 商品マスターは随時修正、追加、削除されますので、単純に今のデータのまま表示できないでしょうか?
yambejp

2017/08/01 12:17 編集

やってることは新しいレコードが親のIDを覚えていくだけですよ ちなみに元の命題のようなデータ管理は整合性がとれないのでじきに破綻すると思います
daisaku64

2017/08/01 14:34

商品マスターに変更あるたびに、上記のプログラムを作成するんですね? 頻繁に商品マスターの変更があるため、この作業は運営上無理だと思います すみません
daisaku64

2017/08/01 14:38

前回の私の質問で、sql文だけでクリアされている方がいらっしゃたので、この内容もsqlを組み上げればクリアできると思ってました。 今、前回のsqlを参考に組み上げていますが、初心者なものでなかなか進みません 頑張ってみます。
yambejp

2017/08/02 00:17

> 商品マスターに変更あるたびに、上記のプログラムを作成するんですね? いえ、更新ごとに「CALL SET_LR;」を実行するだけです。 procedureというのは一度つくっておくと後からは何度でも 再利用できます。 ちなみに今回は入れ子モデルのテーブルを便宜上ひとつにまとめ ましたが、わけて管理すればトリガーという仕組みで 半自動的に階層構造を作ることができます。 まずは階層構造とはどういうものかということをイメージしてもらえるよう 例示しましたので、とにかく一度提示したとおりのことをやってみた上で それで運用できるかどうか判断下さい
daisaku64

2017/08/02 00:58

教えていただいたSQL実行してみました 結果、上記にテスト-Aとテスト-Bをアップしました なるほどです!こういうことですね。関心しました。 商品が1000点ある場合、1000件分の「データ投入SQL」を作り、変更・削除・追加があったとき、このSQLを更新するという流れでしょうか? よろしくお願い致します。
yambejp

2017/08/02 01:14

> 商品が1000点ある場合、1000件分の「データ投入SQL」を作り、 > 変更・削除・追加があったとき、このSQLを更新するという > 流れでしょうか? そうですね。とりあえずテストは成功しているようなので このあとPHP側にデータをわたしてWEB上に階層を表示する作業が 必要ですが、それも解説したほうがよいですか?
daisaku64

2017/08/02 02:04

お手数かけますが、お願いします。 すみません
yambejp

2017/08/02 02:27

追記しときました 問題あったり仕様の追加が必要ならご指摘下さい
daisaku64

2017/08/02 02:36

PHPありがとうございます。 まずはテストしてみます
daisaku64

2017/08/02 02:42

$stmt->execute([]); がしシンタックスエラーになりますが $stmt->execute(); でも大丈夫でしょうか?
yambejp

2017/08/02 02:52

そこはデータ絞込用のダミーなので $stmt = $pdo->prepare($sql); $stmt->execute([]); の2行を $pdo->query($sql); に書き換えてください。 逆にシンタックスエラーになるはずではないので もしかしたらPHPのバージョンが古いのかもしれないですよ
yambejp

2017/08/02 03:00

item-arrowクラスの付け方がおかしかったので一部修正してます
daisaku64

2017/08/02 04:04

invalid data source name エラーでつながりません データベースのバージョンは5.6 PHPは5.4です ちなみに普段はこのようにつないでます↓ function db_connect(){ $db_user = "user"; // ユーザー名 $db_pass = "****"; // パスワード $db_host = "host"; // ホスト名 $db_name = "db-name"; // データベース名 $db_type = "mysql"; // データベースの種類 $dsn = "$db_type:host=$db_host;dbname=$db_name;charset=utf8"; try { $pdo = new PDO($dsn, $db_user,$db_pass); $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); $pdo->setAttribute(PDO::ATTR_EMULATE_PREPARES, false); } catch(PDOException $Exception) { die('エラー :' . $Exception->getMessage()); } return $pdo; }
yambejp

2017/08/02 04:06

もちろんPDOの接続については、ご自身の環境にあわせてください
daisaku64

2017/08/02 04:31

テスト-Cでつながりました が $get_tree(); を呼び出しても何も表示されませんでした
yambejp

2017/08/02 04:37

あら・・・ print gett_ree($rows); ↓↓↓ print get_tree($rows); 関数名のtypoでした・・・修正しておきますので ご自身の方のソースも確認してみてください
daisaku64

2017/08/02 04:42

そこは気づいて修正しておきました (^^)
yambejp

2017/08/02 04:47

$get_tree(); とありますが、一応get_tree()で間違いないですよね? テキストのバッファリングができない環境ってことはないと おもいますが、とりあえずデバッグということであれば ob_xxxと書かれた3行をとっぱらってみてください 全部都度出力にかわります
daisaku64

2017/08/02 05:13

ob_xxxコメントアウトしても何も表示されません いただいたPHPの中に$rows と $row がありますがコレは $rowsに統一したらダメですか? それから関数の呼び出しは <?PHP $get_tree(); ?> で良いですよね?
yambejp

2017/08/02 05:19

> いただいたPHPの中に$rows と $row がありますがコレは > $rowsに統一したらダメですか? 使い分けてますので混同しないように気をつけていただけるなら すきに命名してください すなわち、fetchAllで全ての出力結果を得ているのが$rows (row=行の複数形的な命名のしかた) $rowsからforeachで1行ずつ抜き出していいるのが$row またしつこいようですが $get_tree(); では何も得られないので print get_tree($rows); としてくださいね(get_treeの戻り値をprintしないと出力されない)
daisaku64

2017/08/02 05:57

yambejpさん 大変ありがとうございました。無事表示できました 感謝感謝です。コンバート作業を自動化できないか考えてみます 長い時間本当にありがとうございました。 この内容で追加がありましたら聞いていいですか?すみません
yambejp

2017/08/02 06:06

> コンバート作業を自動化できないか考えてみます また機会があればお教えします。前述していますがヒント「トリガー」 > この内容で追加がありましたら聞いていいですか? もちろん大丈夫です。どんどんきいてください。 案外飲み込みが速くて教えててもストレスになっていないので
daisaku64

2017/08/03 04:53

すみません 今確認してみたんですが<li>を閉じる</li>がところどころ足りないのですが 予想つきますか?解答欄に結果アップしています 私も調べてみますが、よろしくお願い致します。
daisaku64

2017/08/03 05:08

テスト-Dに部分的ですが、抜けた場所をアップしてます 難しい・・・・ よろしくお願い致します。
yambejp

2017/08/03 05:46

やはりバグってましたか。 検証にちょっと時間かかるかもしれません 時間をみてやるようにします
daisaku64

2017/08/03 06:03

すみません。よろしくお願いします
yambejp

2017/08/03 07:16

場当たり的にソースを修正しました。 きちんとロジックを追っていないので、まだ間違いがあるかもしれません
daisaku64

2017/08/03 07:35

流石です!バッチリでした!ありがとうございます。 あとでソース見比べてみます。
daisaku64

2017/08/06 05:31 編集

こんばんは。 商品マスターテーブルから データ投入用のデータを作るのが大変です。実際 1つ挿入になると全て作り直しになります 何か良い方法がないか探ってみます
guest

0

内容がだぶりましたので、削除しました

投稿2017/08/03 04:50

編集2017/08/05 01:26
daisaku64

総合スコア16

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問