データベースのLEAGUEとSUB_LEAGUEの関連取得における表示不具合の解決方法

このQ&Aのポイント
  • データベースのLEAGUEテーブルとSUB_LEAGUEテーブルを関連させるために、IDとLEAGUE_IDを元にデータを取得して表示しています。
  • FOREACHで回すことで、LEAGUEのNAMEとそれに紐づく複数のSUB_LEAGUEのNAMEを表示していますが、<dt>タグに書かれている内容が2回表示されてしまいます。
  • 表示が重複している問題を解決するためには、LEAGUEのNAMEを一度だけ表示し、それに対応するSUB_LEAGUEのNAMEをリスト形式で表示する方法があります。
回答を見る
  • ベストアンサー

すいません、質問をさせて下さい。

すいません、質問をさせて下さい。 データベースにLEAGUEテーブルと、SUB_LEAGUEテーブルがあります。 LEAGUEテーブルには主キーのIDとNAMEがあります。 SUB_LEAGUEテーブルには主キーのIDとLEAGUEテーブルのIDとNAMEがあります。 LEAGUE ID NAME 1 PL 2 CL 3 ML SUB_LEAGUE ID LEGUE_ID NAME 1 1 RE 2 1 SL 3 2 YG 4 2 HT 5 3 LA 6 3 NY LEAGUEテーブルのIDとSUB_LEAGUEテーブルのLEAGUE_IDを元に データを取得し、それをsmarty側で表示したいのですが FOREACHで回しているので、<dt>タグに書かれている内容が2回表示されて しまいます。 {foreach} <dl> <dt>LEAGUEのNAME</dt> <dd><li>SUB_LEAGUEのNAME</li></dd> <dd><li>SUB_LEAGUEのNAME</li></dd> </dl> {/foreach} 希望としては、 PL ・RE ・SL CL ・YG ・HT ML ・LA ・NY としたいのですが、何か良い方法はありませんでしょうか? よろしくお願い致します。

  • PHP
  • 回答数2
  • ありがとう数12

質問者が選んだベストアンサー

  • ベストアンサー
  • seastar3
  • ベストアンサー率69% (99/142)
回答No.2

私はsmartyは使ったことがないのですが、PHPとSQLとhtmlとhtml内スクリプトの仕組みは理解しているつもりです。目的の動作を実現するためにどの技術に何の機能を任せるかが明確に思い描けなければなりません。システムを立体的にとらえて、データベースの使い方をもう一工夫すれば実現できるのではないでしょうか。すなわち、 select LEAGUE.NAME as league_mei, SUB_LEAGUE.NAME as sub_league_mei from LEAGUE, SUB_LEAGUE where LEAGUE.ID = SUB_LEAGUE.LEAGUE_ID 上に示したSQL命令で下のようなクエリ結果が吐き出されます。 league_mei  sub_league_mei   PL      RE   PL      SL   CL      YG   CL      HT   ML      LA   ML      NY この情報を表計算ソフトのピボットテーブルのように加工すれば、ご希望の表示に編集できます。 PHPのfetch命令をうまく使って、1行ごとのフィールド値を取り出して必要な表示用に使ってみましょう。

NeilMania
質問者

お礼

自己解決しました。 ありがとうございました

その他の回答 (1)

  • seastar3
  • ベストアンサー率69% (99/142)
回答No.1

要はSQLの組み立て方ですが、例えば SQLiteデータベース$dbのテーブルLEAGEUとSUB_LEAGUEから目的の行を取り出すためには、下のようなSQLコマンド文字列をクエリ実行コマンド sqlite_query()関数に流し込み、その結果レコードの集合をwhile文のループで回します。 $tbl = sqlite_query("select LEAGUE.NAME as league_mei, SUB_LEAGUE.NAME as sub_league_mei from LEAGUE, SUB_LEAGUE where LEAGUE.ID = SUB_LEAGUE.LEAGUE_ID ",$db); 何のリレーショナル型データベースか明示されてないので、このコードのような操作をふさわしい形で導入すれば解決すると思います。

NeilMania
質問者

お礼

メッセージありがとうございます。 教えて頂いたSQLだと普通にデータを取ってくるだけだと 思うので、自分がやりたい事はsqliteでも、mysqliでも 無理だと思うのですが…。 SQLだと無理だと思うので(?) phpかsmarty(tpl)で出来ればと思って質問しました。

関連するQ&A

  • smartyのforeachの使い方

    仮に$strが以下のような配列を持っている場合smartyのtpl側で 出力させたいのですがうまくいきません。 Array ( [0] => Array ( [id] => 1 [name] => 名前 [sub_id] => Array ( [0] => 12 [1] => 13 ) [sub_name] => Array ( [0] => あああ [1] => いいい ) [sub_cnt] => Array ( [0] => 5 [1] => 5 ) ) [1] => Array ( [id] => 1 [name] => 名前 ) ) sub_***は配列が存在するものとしないものがあります。 そしてtpl側は {foreach item=items from=$str} <ul id="side{$items.id}"> {foreach item=item from=$items} <li><a href="index.php?id={$item.sub_id}">{$item.sub_name} ({$item.sub_cnt})</a></li> {/foreach} </ul> {/foreach} とforeachを重ねてみたのですがsub_***の値が表示されない 状態です。 複雑な配列なのですがこの場合どうすればうまく表示させれるの でしょうか?

    • ベストアンサー
    • PHP
  • ドロップダウンメニュー(?)の作成

    <style type="text/css"> ul#menu{ overflow:auto; } ul#menu li{ width:20%; overflow:auto; float:left; } </style> <ul id="menu"> <li id="intro">ほげ1</li> <li id="member">ほげ2</li> <li id="roadmap">ほげ3</li> <li id="inquiry">ほげ4</li> </ul> よくあるタイプの横並びのものを作っていたのですが、 この度、各項目をクリックするとサブメニューが表示されるようなものを作ることになりました。そこで <!-- XHTML 2.0が対応してたらdi要素が使える。dt,ddだとちょっと書きにくい感あり--> <ul id="menu"> <li id="intro"> <dl> <dt>ほげ1</dt> <dd>ほげ1-1</dd> <dd>ほげ1-2</dd> </dl> </li> <!--(略)--> </ul> としておき、通常dtのみ(dd{diplay:none;})が表示されている状態で ddに対してのルールを加える(dd#intro{display:list-item;})Javascriptを書くことで対処しようと思いました。 問題は「別なli要素がクリックされたら、その他の要素はdisplay:none;に戻さないといけないこと。」 自分がアルゴリズムを考えると、どうも毎回ごり押し感が否めず、 li要素の数を変えたら変えたで、その度にjavascript側にフラグ用の変数を変えなければならなさそうな構成になりそうな予感です。 皆様ならどのようなソースで組むか聞いてみたいと思いました。 (ソースは・・・800文字を超えてしまい、掲載できません。補足かお礼を用います。お礼にならないかもしれませんが、ご了承ください)

  • 複数テーブルの情報を一つのページで使いたいのですが

    お世話になります。 mysqlとphpでサイトを構築しています。 複数テーブルの情報を一つのページで使いたいのですが、どうも上手くいきません。 どうかよろしくお願い致します。 環境:Mysql 5.1.22-rc,PHP  5.2.5 データベース:test01 main -------------------------------------------------------- id name kana 1 太郎 たろう 2 次郎 じろう 3 花子 はなこ -------------------------------------------------------- sub1 (実際には8カラムあります) -------------------------------------------------------- id age   cat  home  1 26 A 東京 2 24 B 千葉 3 31 O 大阪 -------------------------------------------------------- sub2 -------------------------------------------------------- id a_sakuhin   title 1 data_1   青空   1 data_2   夕日 1 data_3   流星   3 data_1   町並み 3 data_2   列車   -------------------------------------------------------- sub3 -------------------------------------------------------- id b_sakuhin title  1 data_1 犬 2 data_1 猫 2 data_2 牛 3 data_1 ネズミ 3 data_2 象 -------------------------------------------------------- 上記のような構成になっており、 htmlのページ上では下記の様に表示したいと考えています。 -------------------------------------------------------- *id=1 の人間のページ ───────────────────────── header ───────────────────────── ───────────────────────── テーブルmainとテーブルsub1の内容 ───────────────────────── ───────────────────────── テーブルsub2の内容をデータがあるだけ繰り返す ───────────────────────── ───────────────────────── テーブルsub3の内容をデータがあるだけ繰り返す ───────────────────────── ───────────────────────── footer ───────────────────────── -------------------------------------------------------- このようにしたいのですが、上手くいきません。 現在は <?php //データベースへ接続 $dbname = "test01"; $user = "hoge"; $passwd = "**********"; $host = "hogehoge"; $db = mysql_connect("$host", "$user", "$passwd"); if (!$db){ echo "データベースの接続でエラーが発生しました<br />\n"; exit; } mysql_select_db($dbname); $sel = mysql_query("SELECT * FROM main LEFT JOIN sub1 ON main.id = sub1.id WHERE main.id = '1'"); if (!$sel) { echo "検索でエラーが発生しました<br />\n"; exit; } ?> <?php while ($row = mysql_fetch_array($sel, MYSQL_BOTH)) { ?> <dl> <dt>名前</dt> <dd><? echo $row["name"]; ?></dd> </dl> <dl> <dt>ふりがな</dt> <dd><? echo $row["kana"]; ?></dd> </dl> <dl> <dt>年齢</dt> <dd><? echo $row["age"]; ?></dd> </dl> <dl> <dt>出身</dt> <dd><? echo $row["home"]; ?></dd> </dl> <?php } mysql_free_result ($sel); mysql_close($db); ?> のようにしています。 この下にさらにsub2とsub3の内容を繰り返しで入れたいです。 while文を追加してみたり、for文を入れてみたり試しましたが何度やってもエラーがでてしまいます。 テーブルを4つ連結させるのがいいのか、別々に呼び出すのがいいのか… phpの記述がおかしいのか。そもそも、テーブルの設計から間違っているのか。 何が悪いのか、またphpの記述方法などご教授頂ければと思います。 すみませんが、よろしくお願いします。

    • ベストアンサー
    • MySQL
  • cssのみで折りたたみまたはプルダウン

    javascriptを使わずに、IE6に対応させた 縦並びの「折りたたみ」または「プルダウン」メニューのようなものを、 いろいろやっても作れず、助けてください! ソースは以下です <dl> <dt id="Name"><a href="#">おなまえ</a></dt> <dd id="Profile">プロフィールプロフィールプロフィールプロフィールプロフィールプロフィール</dd> <dt id="Name"><a href="#">おなまえ</a></dt> <dd id="Profile">プロフィールプロフィールプロフィールプロフィールプロフィールプロフィール</dd> <dt id="Name"><a href="#">おなまえ</a></dt> <dd id="Profile">プロフィールプロフィールプロフィールプロフィールプロフィールプロフィール</dd> </dl>

  • <li>の画像およびテキストリンクのランダム複数表示

    javascriptでランダム表示する方法を教えて下さい。 サイト内に商品の一覧を作成しようと考えており、それぞれの商品画像、テキストリンクをランダムで動かしたいと思っております。 商品数は10点くらいになる予定です。 <div id="sample"> <ul>  <li>   <dl>   <dt>商品1</dt>   <dd>商品画像</dd>   <dd>商品コメント</dd>   </dl>  </li>  <li>   <dl>   <dt>商品2</dt>   <dd>商品画像</dd>   <dd>商品コメント</dd>   </dl>  </li> </ul> </div> ソースはこんな感じで、10点程の掲載予定です。 <li>~~</li>リスト10点をランダム表示する javascriptを教えて下さい。 よろしくお願いいたします。

  • アコーディオンが思い通りに動きません!

    こんにちは。色々試してもうまくいかないため、相談させて下さい。参考サイトの「accordion 31同時開閉タイプ」を実装しようとしているのですが、思い通りの挙動になりません。現状では、見出しをクリックすると全て開いてしまいますが、開くのはクリックしたものだけで、それ以外は閉じる仕様にしたいのです。 参考サイト http://pops-web.com/main/html/demo-007.html 私がやってみたもの http://otyame.chicappa.jp/test/ ---------------------------------------------------------- ●HTML <div id="categoryListBlock"> <ul id="main"> <li id="testlist01" class="category"> <dl> <dt>見出し1</dt> <dd> <ul id="fashionItem"> <li><a href="#">テストリスト</a></li> <li><a href="#">テストリスト</a></li> <li><a href="#">テストリスト</a></li> </ul> </dd> </dl> </li> <li id="testlist02" class="category"> <dl> <dt>見出し2</dt> <dd> <ul id="fashionItem"> <li><a href="#">テストリスト</a></li> <li><a href="#">テストリスト</a></li> <li><a href="#">テストリスト</a></li> </ul> </dd> </dl> </li> </ul> </div> ●Javascript $(function(){ //オブジェクトを保存 var accordionItem=$('#main'); //一旦全部消す accordionItem.find('dd').hide(); //active要素を指定して開く var no=0; accordionItem.find('dt').eq(no).addClass('active').next('dd').show(); //click-action accordionItem.find('dt').click(function () { //slide $(this).next('dd').slideToggle('slow') .siblings('dd:visible').slideUp('slow'); //activeクラス切り替え $(this).toggleClass('active'); $(this).siblings('dt').removeClass('active'); }); //hover-toggle accordionItem.find('dt').hover(function () { //toggle hoveredクラス $(this).toggleClass('hovered'); }); }); ---------------------------------------------------------- おそらくHTMLの構造が違うため「.siblings」というセレクタが上手く動作していないのかなと思われますが、このような場合どうしたら良いのでしょうか。 よろしくお願い致します。

  • 入力フォームの反映

    登録ページにて、申込者の情報入力フォーム、社長の入力フォーム、部長の入力フォームが同ページにあります。 申込者は社長か部長かをドロップダウンで選択してもらいます。 社長を選んだ場合、申込者の情報を入力すると下の社長の入力フォームに同じものが反映され 部長を選んで入力すると、下の部長の入力欄に同じく反映させたいのですが PHPで可能でしょうか? よろしくお願いいたします。 // <p>[お申込み者入力]</p> <dt> <label for="yakusyoku">役職</label> </dt> <dd> <select id="yakusyoku" name="yakusyoku"> <option value="社長">社長</option> <option value="部長">部長</option> </select> </dd> <dt> <label for="m_name">お名前</label> </dt> <dd> <input name="m_name" type="text" id="m_name" size="10" maxlength="20" /> </dd> <p>[社長情報入力]</p><br> <dt> <label for="s_name">お名前</label> </dt> <dd> <input name="s_name" type="text" id="s_name" size="10" maxlength="20" /> </dd> <p>[部長情報入力]</p><br> <dt> <label for="b_name">お名前</label> </dt> <dd> <input name="b_name" type="text" id="b_name" size="10" maxlength="20" /> </dd>

    • 締切済み
    • PHP
  • ジャンプ先を開く方法

    こんにちは、 折りたたみ機能を使っている <dt id="top">トップ</dt>に 別ページから http://localhost/asel/#top で飛んできた場合、自動的に開くようにしたいのですが、 どのようにすればよいのでしょうか? html------------------- <dl class="accordion"> <dt id="top">トップ</dt> <dd> <h4>カテゴリ1</h4> <ul> <li>攻略編</li> </ul> </dd> </dl> 折りたたみコード-------------------- $(function(){ $('dl.accordion>dd').hide(); $('dl.accordion>dt.opened').nextUntil('dl.accordion>dt').show('slow'); $('dl.accordion>dt').click(function(e) { $(this).toggleClass('opened'); $(this).nextUntil('dl.accordion>dt').toggle('slow'); }); });

  • PHPでログインフォーム

    PHPで簡易的なログインフォームを作成しようと思っています。 name.csvにてユーザーの名前の管理、 pw.csvにてID,パスワードの管理をしようと考えています。 $name = file('name.csv'); $pw = file('pw.csv'); foreach($pw as $val){ list($li_pw_id ,$li_id, $li_pass) = split("\t",$val); if($li_id == $id){ if($li_pass != $pass){ echo "ログイン失敗"; exit; }else{ foreach($shop as $val){ list($li_shop_id ,$li_shop_name, $info_flag) = split("\t",$val); if($li_pw_id == $li_shop_id){ echo "ログイン成功"; } } } }else{ echo "ログイン失敗"; exit; } } と、上記のようにプログラムを記述すると、 ID・パスワードがあっていてもログイン失敗になります。 echoを使用していろいろ確かめた結果、 $li_idが$idと一致しても最後まで読みこんでしまうため、 最終的に$li_id != $idと判断されてしまっているようです。 どのようにすれば、修正できるのか教えていただきたく思います。 上記以外でも、何かいい案があれば教えて下さい。

    • ベストアンサー
    • PHP
  • メールフォームについて質問です。

    php初心者です。 メールフォームのチェックボックスの値をPOSTでキャッチしたあと表示がしたいのですがうまくいきません。 他のPOSTでキャッチした値も、最終的にforeachで回しています。 チェックボックスからの値のみ「array」と出力されます。 多次元配列の値を並列に表示したい場合、どのような処理の考え方があるのか教えていただきたいです。 送信元 <form action="entry.php" method="post"> <dl> <dt>氏名 <span class="red">[必須]</span></dt> <dd><input type="text" name="氏名"></dd> </dl> <dl> <dt>フリガナ <span class="red">[必須]</span></dt> <dd><input type="text" name="フリガナ"></dd> </dl> <dl> <dt>メールアドレス <span class="red">[必須]</span></dt> <dd><input type="text" name="メールアドレス" style="white-space:nowrap;"></dd> </dl> <dl> <dt>参加内容</dt> <dd><input type="checkbox" value="値1" name="参加内容[]">値1</dd> <dd><input type="checkbox" value="値2" name="参加内容[]">値2</dd> </dl> <dl> <dt>個人情報保護方針 <span class="red">[必須]</span><br /><input type="checkbox" class="checkbox" name="個人情報保護方針">同意する</dd> </dl> <p class="contactBt"><input type="submit" value="確認ページ" /></p> </form> 【送信先】 $_POSTSTRINGCODE = "EUC-JP"; $_THISFILESTRING = "UTF-8"; $_MYPOST = ""; foreach($_POST as $key=>$var) { //mb_convert_variables($_THISFILESTRING, $_POSTSTRINGCODE, $key); //smb_convert_variables($_THISFILESTRING, $_POSTSTRINGCODE, $var); $_MYPOST[$key] = $var; } <dl> <?php unset( $_MYPOST['個人情報保護方針'] ); foreach($_MYPOST as $key=>$var) { $key = strtr($key, $string_from, $string_to); if(get_magic_quotes_gpc()) $var = stripslashes($var); $var = htmlspecialchars($var); $OUT_var = ($var == "")?'&nbsp;&nbsp;':nl2br($var); print("<dt>".$key."</dt><dd>".$OUT_var."</dd>"); ?> <INPUT type="hidden" name="<?php echo $key ?>" value="<?php echo $var ?>"> <?php print("</dt></dd>\n"); } ?> </dl> 配列はこんな感じです。 array(6) { ["所属団体"]=> string(1) "a" ["氏名"]=> string(2) "aa" ["フリガナ"]=> string(3) "ア" ["メールアドレス"]=> string(15) "aaa@aaa.co.jp" ["ご参加内容"]=> array(2) { [0]=> string(51) "値1" [1]=> string(15) "値2" } ["個人情報保護方針"]=> string(2) "on" } このまま表示させると「array」として表示されてしまうため「値1」「値2」の値を表示 させるためループ内で色々やってみましたが、考え方自体少しつかめていません。   【現状】 所属団体 a 氏名 aa フリガナ ア メールアドレス aaa@aaa.co.jp ご参加内容 Array (この場所に「値1」「値2」が表示させるようにしたいです) どなたかご教授いただければと思います。 よろしくおねがいいたします。

    • ベストアンサー
    • PHP