複数テーブルの情報を一つのページで使用する際の注意点と解決方法

このQ&Aのポイント
  • mysqlとphpでサイトを構築している際、複数テーブルの情報を一つのページで使用したい場合、注意点や解決方法をまとめました。
  • 具体的なテーブルの構成と表示したい内容について説明し、phpでの記述方法に関しても解説しています。
  • テーブルの連結方法やループ処理の追加、データの取得方法など、問題の解決に役立つ情報を提供しています。
回答を見る
  • ベストアンサー

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

お世話になります。 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
  • 回答数1
  • ありがとう数1

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

  • ベストアンサー
  • yambejp
  • ベストアンサー率51% (3827/7415)
回答No.1

sub2、sub3はどうやって絞り込みをするのかいまいちわかりませんが、 今回の件に限って言えば、テーブルの結合をせずに、それぞれをSQLで なげて、配列に取り込んでおけばよいように見えます。

sabeck
質問者

お礼

遅くなり申し訳ございません。 その後アドバイス通り、結合せずそれぞれのクエリを受け取る事により解決しました。本当にありがとうございました。

関連するQ&A

  • 『MySQL』どこがまちがってますでしょうか?!

    <table> <tr> <th>name</th> <th>telno</th> </tr> <?php if( ! $db = mysql_connect( 'localhost', 'ユーザー名', 'パスワード') ){ die( ’MySQL接続失敗' ); mysql_select_db('test', $db ); $sel = mysql_query('SELECT name,telno FROM phone'); while ($row = mysql_fetch_array ($sel)) { echo "<tr>"; echo " <td>".$row["name"]."</td>"; echo " <td>".$row["telno"]."</td>"; echo "</tr>"; } mysql_free_result ($sel); mysql_close($db); ?> </table> 上記のソースを自分のレンタルサーバーに置いてみてアクセスしたところ 何も表示されません。 何がおかしいでしょうか? 状態   ・Win MYSQLLadmin 1.4が起動していて青信号状態    このソフトの中では PC名   Ltest Lphone (コマンドプロンプトからは mysql> select * from phone; で中にデータは入っていることが確認できた。    ・サーバーはPHP可。(MySQL可でないとダメ?!)) 何がおかしいんでしょ?! 自分で考える不安要素は、 PHPは<?php ~?> で挟むんで使うことは先日知ったばかりですが、PHP自体が動いてるはずと仮定してます。 またこのphoneのテーブルの中身はMySQLのサーバーに格納されてるのでしょうか?! それとも自分のPCのローカル?! PLEASE H E L P M E !!!

    • ベストアンサー
    • MySQL
  • 同じサーバーで、異なるデータベースを同時に開くことはできますか?

    1.タイトルの通り、同時に開くことができますでしょうか? 日本PHPユーザー会ホームページでは以下の方法でできるとの回答があります。 $con1 = mysql_connect(localhost, user_id , pass); $con2 = mysql_connect(localhost, user_id , pass); mysql_select_db("db1",$con1); mysql_select_db("db2",$con2); ======================================== db1 user_table user_id(int),user_name(var) ========================================== db2 main_table main_id(int),user_id(int) ======================================== $sql_user_name = "SELECT user_name FROM user"; $result_user = mysql_query($sql_user_name,$con1); $row_user = mysql_fetch_array($result_user); echo $row_user[user_name]; のようにやっても mysql_fetch_array()がでます。 mysql_queryは最後の接続を活かすとなっているのでこの部分の書き方を教えてください。 2.できたとしてリレーションを行うことができますでしょうか? つまり $sql_user_name = "SELECT user_name FROM db1.user_table,db2.main_table WHERE db1.user_table.user_id = db2.main_table.user_id" というようなことはできますでしょうか? 長文で申し訳ありませんが、どうかよろしくお願いします。

    • ベストアンサー
    • MySQL
  • PHPでMySQLテーブルロック一覧取得

    PHPでMySQLテーブルロックされている一覧を取得したいですがどのようにすれば良いかご教授願います。 Web検索で調べるとロック状態はmysql_list_processesや、show processlistでも試してみましたが、思うような結果は得られませんでした。正常には動作していますが、欲しいデータが取り出せないですす。。。 単純に、現在ロックしているテーブル名(レコードロックは不要です。)を一覧で出力させることはできないのでしょうか? PHPから実施できるやり方をご教授頂けると幸いです。 -------Test Program()--------- <?php $link = mysql_connect('localhost', 'login_id', 'login_pass'); mysql_select_db('db_name'); mysql_query('LOCK TABLES table1 WRITE'); mysql_query('INSERT INTO table1 SET field1 = "test", field2 = "1"'); //$result = mysql_list_processes($link); 以下のSQL文とも入れ替えて試しました。 $result = mysql_query('show processlist'); while ($row = mysql_fetch_assoc($result)){ printf("%s %s %s %s %s %s %s %s\n", $row["Id"], $row["User"], $row["Host"], $row["db"], $row["Command"], $row["Time"] , $row["State"], $row["Info"]); } mysql_free_result($result); mysql_query('UNLOCK TABLES'); ?>

    • ベストアンサー
    • MySQL
  • MySQLとApacheとの関係

    プログラミング初心者です.今,PHP5.2.9とMySQL5.1.34とApacheを使ってプログラミングをやっているのですが,PHPにおいてデータベースと接続するのができなくて困っています. 私は今,(サンプル本から)データベースの内容をHTMLに表示させる処理を書いたのですが,アドレスを入力してもApacheが完全に停止してしまい動作しなくなってしまいます.しかし,他の単純なphpやHTMLのプログラムはスムーズに動作します.こうなってしまうのが考えられる原因を教えていただきたくて質問させていただきました.コードは以下のとおりです.また,保存場所はMySQLはC:/MySQL/ 作成したDBはC:/MySQL Server 5.1/Data です. また,ApacheについてなんですがC:/workspace/ のフォルダにプログラムを入れる感じです.申し訳ありませんがよろしくお願いします. <html> <head> <meta http-equiv="Content-type" content="text/html; charset=Shift_JIS"> <title>簡易アドレス帳(MySQL-PHP)</title> </head> <body> <?php $dbname = "test"; $user = "root"; $passwd = "password"; $tbname = "addrbook"; $host = "localhost"; $db = mysql_connect("$host", "$user", "$passwd"); if (!$db){ echo "データベースの接続でエラーが発生しました<BR>\n"; exit; } mysql_select_db($dbname); $sel = mysql_query("SELECT name,telno,email FROM $tbname"); if (!$sel) { echo "検索でエラーが発生しました<BR>\n"; exit; } echo "<table border=\"1\">\n"; echo " <caption>簡易アドレス帳(MySQL-PHP)</caption>\n"; echo " <tr><th>名前</th><th>電話番号</th><th>メールアドレス</th></tr>\n"; while ($row = mysql_fetch_row ($sel)) { echo " <tr>\n"; echo " <td>".$row[0]."</td>\n"; echo " <td>".$row[1]."</td>\n"; echo " <td>".$row[2]."</td>\n"; echo " </tr>\n"; } echo "</table>\n"; mysql_free_result ($sel); mysql_close($db); ?> </body> </html> 補足 あの一つ一つエラーを見ていった結果, $db = mysql_connect("$host", "$user", "$passwd"); の文がapacheの停止に原因があることがわかりました.ファイルの保存場所,mysqlの設定方法などの原因なのでしょうか?

    • ベストアンサー
    • MySQL
  • テーブルのデータをarray (array (***, ***)) の形式で取得したい

    id、氏名、年月日(date)、点数(tensu)の列を持つテーブルseiseki があります。 <?php $conn_id = mysql_connect("localhost","root","*****") or die('Error connecting to MySQL'); mysql_select_db('******',$conn_id); $query ="SELECT date,tensu from seiseki; $result = mysql_query($query,$conn_id) or die($query.'failed('.mysql_error().')'); $date = array(); $tensu = array(); while($row = mysql_fetch_array($result)){ $date[] = $row['date']; $tensu = $row['tensu']; } print_r($date); echo "<br/>\n";      ←15行目 print_r($tensu); echo "<br/>\n";      ←16行目 ?> これをブラウザで見ると、 Array ( [0] => 2009-05-01 [1] => 2009-06-07 [2] => 2009-07-24 ・・・・・・ ) Array ( [0] => 80 [1] => 75 [2] => 90 ・・・・・・・ ) となります。 15,16行目をコメントアウトして print_r($row[“date”],[“$tensu”]); とするとエラーになります。 array (array (2009-05-01, 80), array (2009-06-07, 75 ), array (2009-07-24 , 90)・・・・・・・ ); の形式でデータを取得するにはどのようにすれば良いでしょうか?

    • ベストアンサー
    • MySQL
  • 会員ページ SESSIONについて

    レンタルサーバはさくらインターネット、プランはプレミアムです。 PHPは5.2.171、MySQLは5.1です。 login.phpから各メンバーのIDとPWを入力してデータベース内ののデータと一致したら、main.phpにLocationでとぶようにしています。 2日前ほどからログインができなくなり、大変困っています。(それまでは問題なくログインができた。) 原因はわからないのですが、色々検証したところ、 login.phpでログインしたときにmain.phpでIDが取得できていないということがわかりました。 コードは下記のようになります。 login.php if ($uid != "" || $upass != "") { $link = mysql_connect($DB_HOST,$DB_USER,$DB_PASS); mysql_select_db($DB_NAME,$link); $uid = mysql_real_escape_string($uid, $link); $upass = mysql_real_escape_string($upass, $link); $userQuery = sprintf("SELECT count(*) as `cnt` FROM `member` WHERE `id`='%s' AND `password`='%s'",$uid,$upass); $userResult = mysql_query($userQuery, $link) or die(mysql_error()); if ($row = mysql_fetch_assoc($userResult)) { $count = $row['cnt']; if ($count == 1) { session_start(); $_SESSION['ok_flg'] = 1; $_SESSION['uid'] = $_REQUEST['id']; header("Location: main.php"); exit; } else { $msg = '<p class="error">ユーザーIDまたはパスワードが違います。</p>'."\n"; } } else { $msg = '<p class="error">ユーザーIDまたはパスワードが違います。</p>'."\n"; } } 省略部分が少しありますが、特に問題ないと思います。 main.php session_start(); if ($_SESSION['ok_flg'] != 1) { header("Location: /"); exit; } if (!isset($_SESSION['uid'])) { header("Location: /"); exit; } $uid = mysql_real_escape_string($_SESSION['uid'], $link); $userQuery = sprintf("SELECT * FROM `member` WHERE id='%s' ",$uid); $userResult = mysql_query($userQuery, $link) or die(mysql_error()); if ($row = mysql_fetch_assoc($userResult)) { $user_name = $row['user_name']; } echo $user_name; としています。 ここからが問題なのですが、 1.ログインするとSESSIONファイルが2つ発行されてしまう。  1つ目は空のファイル。2つ目がIDなどが記載されているファイル。 main.phpのsession_start()を取ると1つのみの発行。(IDなどが記載されている方。) 2.main.phpに切り替わったときに$_SESSION['ok_flg']と$_SESSION['uid']の値が取得できないためlogin.phpに戻される。 3.main.phpのsession_start()を取ればページは表示されるが、session_id()も$_SESSION['ok_flg']と$_SESSION['uid']の2つも取得できない。 3.main.phpでsession_start()を取れば他のページはsession_idは取得できるが$_SESSION['ok_flg']と$_SESSION['uid']が取得できない。 4.session_start()と併用で$_GETも使用しているページがあるが$_GETを使用しているページも2と同じ現象になる。 以上ですが、お分かりになる方がいらっしゃいましたら、教えていただけないでしょうか。 宜しくお願い致します。

    • ベストアンサー
    • PHP
  • データーベースのすべての画像を取り出したい

    データーベースのテーブル内の画像をすべて取り出すプログラムを書いています。 データベース(Mysql)には画像が4列(4個)存在しますがプログラムの書き方が悪いと思うのですが、1つしか画像を取り出すことができません。 すべて取り出すにはどこを直せばよいでしょうか? 書いたソースは以下になります。 たぶん$img_db=$row["img_data"]; echo $img_db;が原因のような気がしますが分かりません。 詳しい方教えてください。 <display.php>(データーベースから読み込みようphp) <?php $conn=mysql_connect("localhost","root",""); mysql_select_db("practice"); $result = mysql_query("select img_data from sample "); while($row= mysql_fetch_array($result)){ $img_db=$row["img_data"]; echo $img_db; } ?> <output.php>(ブラウザ表示用php) <html> <head> <meta http-equiv=”Content-Type” content=”text/html; charset=UTF-8”> <title>画像表示</title> </head> <body> <p>MySQLのBLOBにバイナリで格納した画像を表示してみます。</p> <?php echo "<img src=\"display.php?$img_db\">" ?> </body> </html>

    • ベストアンサー
    • PHP
  • すいません、質問をさせて下さい。

    すいません、質問をさせて下さい。 データベースに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
  • データベース表示結果のデザイン

    データベースの全件検索結果の表示のデザインをしたいと考えているのですがうまくいきません。 PHPのソースは以下の通りです。 <?php mysql_connect('localhost','root','******'); mysql_select_db('AAAAAAAA'); $sql= "select * from ??????"; $result = mysql_query($sql); $rows = mysql_num_rows($result); if($rows == 0){ echo "<p>該当データがありません。</p>"; } else { while($row = mysql_fetch_array($result)){ echo "<p>"; echo $row["renban"]; echo " "; echo $row["tourokubi"]; echo " <br />"; echo $row["title"]; echo " "; echo $row["A"]; echo "-"; echo $row["B"]; echo " "; echo $row["C"]; echo " "; echo $row["D"]; echo " "; echo $row["E"]; echo " "; echo $row["F"]; echo " "; echo $row["G"]; echo "</p><hr />"; } } ?> この検索結果の1つ1つのデータをテーブルで囲んでechoで呼び出したA~Gまでの項目を<tr>や<td>で区切って表のような形にしたいのですがどのようにすればいいでしょうか。 よろしくお願いいたします。

    • ベストアンサー
    • PHP
  • はじめて質問させていただきます!

    はじめて質問させていただきます! 宜しくお願い申し上げます! 友人にajaxでmysqlから最新の1件のニュースデータを引っ張り出して表示させるphpスクリプトを作ってもらいました。 こんな感じになります。 <!---ここからがスクリプトで---> <?php $i = 0; foreach ($news as $thenews): $class = null; if ($i++ % 2 == 0) { $class = ' class="altrow"'; } ?> <dl> <dt> <?php echo $my->df($thenews['News']['date'],"Y.m.d"); ?>【<?php echo $thenews['News']['title']; ?>】</dt> <dd> <div style="height: 60px; overflow-y: auto;"> <?php echo $thenews['News']['body']; ?> </div> </dd> </dl> <hr /> <?php endforeach; ?> <dl> <dt><a href="news/">■過去のニュースはこちら</a></dt> </dl> <!---ここまでで終りっす---> このスクリプトを変えて、最新の2件のニュースデータを引っ張り出して表示させようと思って、こんな風にしてみたのですが、こうすると同じニュース(最新の1件)が2個表示されてしまいました。 <!---ここからがスクリプトで---> <?php $i = 0; foreach ($news as $thenews): $class = null; if ($i++ % 2 == 0) { $class = ' class="altrow"'; } ?> <dl> <dt> <?php echo $my->df($thenews['News']['date'],"Y.m.d"); ?>【<?php echo $thenews['News']['title']; ?>】</dt> <dd> <div style="height: 60px; overflow-y: auto;"> <?php echo $thenews['News']['body']; ?> </div> </dd> <dt> <?php echo $my->df($thenews['News']['date'],"Y.m.d"); ?>【<?php echo $thenews['News']['title']; ?>】</dt> <dd> <div style="height: 60px; overflow-y: auto;"> <?php echo $thenews['News']['body']; ?> </div> </dd> </dl> <hr /> <?php endforeach; ?> <dl> <dt><a href="news/">■過去のニュースはこちら</a></dt> </dl> <!---ここまでで終りっす---> 当の友人に直してもらおうと連絡してみても、音信不通でメールも帰ってこない状態なので困ってしまい、こちらに質問させていただきました。 こんなソース見ても、わからないのかも知れませんが、もし参考になるようなご意見をいただけましたら幸いです! 何卒、宜しくお願い申し上げます。

    • 締切済み
    • PHP