• ベストアンサー

データベースから読み込んで表示させる方法について

PHP、MySQL共に超初心者です。 説明も下手で申し訳ないのですが、どうぞご教授お願いいたします。 WEBページから小説をデータベースに登録させる管理画面をPHPで作成しております。 登録はうまくいったのですが、登録内容を一覧表示させるページで、思ったように表示させることが出来なくて困ってしまいました。 テーブルの主な内容は以下の通りです。 ■genre(ジャンル名テーブル) └【id】…数字  【genre_name】…小説のジャンル名 ■novel●●(小説を入れるテーブル。●●の部分はgenreテーブルの【id】と同じ) └【genre】…genreテーブルの【id】と同じにしてジャンル分け。  【title】…小説タイトル  【writing_date】…執筆日  【release】…0は非公開、1は公開。 やりたいことは、 【release】が1(公開)となっている【title】(小説タイトル)を、【writing_date】(執筆日)の新しい順に全て表示させ、それを【genre】ごとにまとめたテーブルに表示させる事。 (【release】が0しかないジャンルは表示させない) です。 現在、公開設定となっていない小説しかないジャンルまでもが表示されてしまっています。 (もちろん内容がないので、ジャンル名と項目名だけが不恰好に表示されてしまいます。) 結合など色々検索して試してみたのですが、解決できずにいます。 どのような方法があるか 本当に説明下手で大変申し訳ないのですが、ご助力宜しくお願いいたします。 初心者ゆえ、どこまで説明すれば良いかもわかっておりませんので、説明不足な部分は補足させていただきます。 どうぞ宜しくお願いいたします。 ■環境 MYSQL:4.0.24 PHP:5.2.6 ■プログラム <?php $genre_sql = "select * from genre"; $genre_que = mysql_query($genre_sql); while ($genre_row = mysql_fetch_array($genre_que)) { $genre_id = $genre_row['id']; $genre_id = sprintf("%02d", $genre_id); $genre_name = $genre_row['genre_name']; $novel_sql = "select * from novel$id order by writing_date desc limit 1"; $novel_que = mysql_query($novel_sql); while ($novel_row = mysql_fetch_array($novel_que)) { $novel_id = $novel_row['id']; $novel_genre = $novel_row['genre']; echo "▼".$genre_name. "<br> <table border=\"0\" cellspacing=\"0\" cellpadding=\"0\"> <tr> <td class=\"tdTitleEdi\" width=\"90%\">タイトル</td> <td class=\"tdTitleEdi\" width=\"10%\">更新日</td> </tr>"; $title_sql = "select * from title$genre_id"; $title_que = mysql_query($title_sql); while ($title_row = mysql_fetch_array($title_que)) { $title_id = $title_row['id']; $title_name = $title_row['title_name']; $novel_sql = "select * from novel$genre_id where genre=$genre_id and title=$title_id"; $novel_que = mysql_query($novel_sql); while ($novel_row = mysql_fetch_array($novel_que)) { $novel_id = $novel_row['id']; $novel_genre = $novel_row['genre']; $novel_title = $novel_row['title']; $novel_writing_date = $novel_row['writing_date']; $novel_release = $novel_row['release']; echo "<tr>"; echo "<td class=\"tdEdiTi\">"; $novel_sql = "select * from novel$genre_id where genre=$genre_id and title=$title_id"; $novel_que = mysql_query($novel_sql); while ($novel_row = mysql_fetch_array($novel_que)) { echo $title_name; echo "&nbsp;</td>"; } } } echo "<td class=\"tdEdiLi\">"; $novel_sql = "select * from novel$genre_id where genre=$genre_id and title=$title_id order by writing_date desc limit 1"; $novel_que = mysql_query($novel_sql); while ($novel_row = mysql_fetch_array($novel_que)) { $year = mb_substr($novel_writing_date,0,4); $month = mb_substr($novel_writing_date,5,2); $day = mb_substr($novel_writing_date,8,2); echo $year. "." .abs($month). "." .abs($day); } echo "&nbsp;</td>"; echo "</tr>"; } } echo "</table>\n"; } } ?>

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

  • ベストアンサー
  • dell_OK
  • ベストアンサー率13% (739/5638)
回答No.2

私も、No.1のご回答にあるように、novelテーブルの設計の見直しをおすすめします。 novelテーブルは●●などで分けずに、1つで十分です。 私が作るとしたら、例えば、 ■novel └【id】…小説のid。内容を更新する時などに使います。  【genre_id】…genreテーブルの【id】と同じにしてジャンル分け。  【title】…小説タイトル  【writing_date】…執筆日  【release】…0は非公開、1は公開。 のようにするのですが、そうすると、お調べになった結合などが容易にできるようになります。 今は、テーブルが●●で分かれているために、結合ができない(やってできない事はないけど説明は割愛)のです。 そうすると、SQLの実行は1回だけで済ませる事もできるようになります。 プログラム全体を変更するようになるので、これも今は割愛します。 で、今のままで何とかするだけしてみる作戦。 プログラムの3段落目のSQL文に、条件を追加してみましょう。 ※掲載されたプログラムを、環境を作って試験実行してみたのですが微妙に修正しなければならないところがありましたので、試験実行は中止して、もしかしたらこれだけでいいのかな、と思ったので。 $novel_sql = "select * from novel$id order by writing_date desc limit 1"; ↓ $novel_sql = "select * from novel$genre_id where release=1 order by writing_date desc limit 1"; これだけです。 ※ novel$id は novel$genre_id の間違いではないかと思う。 この時点で実行されるSQLで、そのジャンルにおける公開設定となっている小説がなければ、その内側のループをしないので、ジャンル名も表示されなくなると思います。 そうすると、次のジャンルの処理になるので、いいのではないでしょうか。 試験実行していないのでわかりませんが、もしだめならまた少しずつ調整するとして、やってみてください。

butechin
質問者

お礼

非常に解りやすい解説、本当にありがとうございました! ご指摘通り、 $novel_sql = "select * from novel$genre_id where release=1 order by writing_date desc limit 1"; ↑こちらに変更したらうまく登録されたジャンルのみのテーブルを表示させる事ができました! ●●で分けていないテーブルは最初に作っていたのですが、分けたほうがプログラムしやすいかなと勘違いして分けてしまいました。 分けてない方法で十分との事でしたので、今度はそちらでチャレンジしてみます。 本当にありがとうございました!!

全文を見る
すると、全ての回答が全文表示されます。

その他の回答 (1)

  • UmJammer
  • ベストアンサー率58% (115/196)
回答No.1

まずテーブル設計を見直した方がよいかと思います。 novel●●の「●●」の部分が必要だとは思えないのですが、何か特別な理由があるのでしょうか。ジャンルテーブルのIDはgenreというフィールドとして持っているわけですよね。 結果、煩雑にSQLを発行する羽目になっているのだと思います。 可能なら検討してみてください。

butechin
質問者

お礼

●●と分けている事に特に理由はなく、ただ単にプログラムしやすいんじゃないかなと勘違いして分けていただけです( ;^^)ヘ.. なので、おっしゃる通り、テーブル設計を見直して再度チャレンジしてみます! 本当にありがとうございました!!

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • 動的サイトを作ってみたのですが、うまくデータベースからデータが取得できません。。。

    よろしくお願いいたします。 趣味でゲームソフトのデータベースを作っています。 MYSQLを使って動的にデータを表示させるサイトです。 http://www.game-minzoku.jp/meisai.php?titleid=5362 例えばこのようにパラメータをつけてページを展開しているのですが、 この『?title=****』の数字をアドレスバー上で変更してほかのページを表示させようとすると、 該当データがありません。 がと出てしまいます。 これがようやくGoogleにインデックスされ始めてきましたが、自然検索から入ってもこのようなことが起こってしまって困っています。 自分で調べてはみたものの、独学で進めているため、どうやって解決したらよいか分からず困っています。 どなたかお力添えいただけますと幸いです。 問題のページのソースはこちらです。(cssなどの不要と思われる個所はけしてありますが、もし足りない箇所あればおっしゃっていただけますと幸いです) ================================================================ <?php extract($_GET); mysql_connect('****','****','****'); mysql_select_db('****'); mysql_query("set character_set_client=utf8"); mysql_query("set character_set_connection=utf8"); mysql_query("set character_set_results=utf8"); $sql = "select * from game,genre,hanbai,kaihatsu,hard where game.genreid=genre.genreid and game.hardid=hard.hardid and game.hanbaiid=hanbai.hanbaiid and game.kaihatsuid=kaihatsu.kaihatsuid and game.titleid =" . $titleid; $result = mysql_query($sql); $rows = mysql_num_rows($result); $title_name_sql = "select title from game where titleid =" . $titleid ; $res = mysql_query($title_name_sql); $title_name = mysql_result($res,0); echo "<title>"; echo "$title_name | ゲーム民族</title>"; echo "</head><body>"; echo "<a href=index.php>ゲーム民族</a>"; echo "<h1><font size=2>ゲーム民族は"; echo "$title_name"; echo "の詳細を網羅したデータベースのサイトです</font></h1>"; echo "<p><a href=index.php>TOP</a> > $title_name</p>"; echo $title_name の基本情報; if($rows == 0){ echo "<p>該当データがありません。</p>"; } else { while($row = mysql_fetch_array($result)){ echo "<a href=",$row["url"],">"; echo "<img src=",$row["img"]," alt=",$row["title"],">"; echo "</a>"; echo "<table border=1 height=40 cellpadding=2 cellspacing=2 width=800>"; echo "<tr><td>タイトル</td><td>"; echo $row["title"]; echo "</td></tr>"; echo "<tr><td>発売元</td><td>"; echo "<p><a href=\"maker.php?hanbaiid=",$row["hanbaiid"],"\">", $row["hanbai"] ,"</a></p>\n"; echo "</td></tr>"; echo "<tr><td>開発元</td><td>"; echo "<p><a href=\"developer.php?kaihatsuid=",$row["kaihatsuid"],"\">", $row["kaihatsu"] ,"</a></p>\n"; echo "</td></tr>"; echo "<tr><td>機種</td><td>"; echo $row["hard"]; echo "</td></tr>"; echo "<tr><td>発売日</td><td>"; echo $row["hatsubai"]; echo "</td></tr>"; echo "<tr><td>ジャンル</td><td>"; echo "<p><a href=\"genre.php?genreid=",$row["genreid"],"\">", $row["genre"] ,"</a></p>\n"; echo "</td></tr>"; $sql2= "select * from game,title_creater,creater,roll where game.titleid=title_creater.titleid and title_creater.createrid=creater.createrid and title_creater.rollid=roll.rollid and game.titleid = " . $row["titleid"]; $result2 = mysql_query($sql2); $rows2 = mysql_num_rows($result2); while($row2 = mysql_fetch_array($result2)){ echo "<tr><td>クリエーター</td><td>"; echo $row2["creater"]; echo $row2["roll"]; echo "</td></tr>"; } } } ?> </body></html> ================================================================ 本当に見にくい意味不明のソースで申し訳ありませんが、よろしくお願いいたします!

    • ベストアンサー
    • PHP
  • データーベースをフォームから入力し更新

    データーベースをフォームから入力し更新 登録済のデーターベースをフォームから入力し更新したいのですが、どうしてもうまくいきません。 http://park18.wakwak.com/~little-box/Dreamweaver/sql010.htm のサイトを参考にしているのですがitiran.phpのところからつまづいています。 // 検索した結果を全部表示 echo "<table border=1>"; echo "<tr><td>id</td><td>name</td></tr>"; while($row=mysql_fetch_array($res)){    echo "<tr>";    echo "<td>". $row["name"] . "</td>";    echo "<td>". $row["age"] . "</td>";    echo "<form action=koushin_input.php method=post>";    echo "<input type=hidden name=id value=" . $row["id"] . ">";    echo "<td><input type=submit value=更新></td>";    echo "</form>";    echo "<form action=sakujo.php method=post>";    echo "<input type=hidden name=id value=" . $row["id"] . ">";    echo "<td><input type=submit value=削除></td>";    echo "</form>";    echo "</tr>"; } echo "</table>"; の辺りがおかしいのではと思っているのですが… アドバイスください。また、他に参考になるサイトがありましたらぜひ教えてください。

    • ベストアンサー
    • 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
  • WHERE句で一致しない場合を判断させる方法

    下記のようなコードで$mysql_Codeで一致しない場合は、 $html_Code .= '<tr><td colspan="4">条件に一致する項目はありません。</td></tr>'; をさせたいと考えているのですが思うようにいきません。 $mysql_Code = "SELECT * FROM infotable WHERE name='$kisetsu' AND kudamono='$kudamono'"; mysql_set_charset('utf8'); $mysql_Row = mysql_query($mysql_Code,$mysql); $html_Code = ""; if(!mysql_fetch_array($mysql_Row)){ $html_Code .= '<tr><td colspan="4">条件に一致する項目はありません。</td></tr>'; } while($row = mysql_fetch_array($mysql_Row)){ $id = $row["id"]; $name = $row["name"]; $kudamono = $row["kudamono"]; $coment = nl2br($row["coment"]); $html_Code .= "<tr><td>$id</td><td>$name</td><td>$kudamono</td><td>$coment</tr>\n"; } といったやり方でやると、一致するはずの一部のフィールドが表示されなかったりします。 $mysql_Codeで一致するフィールドが見つかったかどうかを !mysql_fetch_array($mysql_Row) で判断させているのですが、これはダメなのでしょうか。 そういう場合はどのようにするのがいいのでしょうか。

    • ベストアンサー
    • PHP
  • データベースの文字が???で表示される

    PHPによるwebアプリケーションスーパーサンプルという参考書のプログラム(p552)でどうしても実行できないものがあります。 やりたいことはMySQLに接続してデータを表示させるというものです。数字であるIDと年齢は表示されるのですが、文字である名前と出身地のところが「???」で表記されてしまいます。 何度も参考書のソースプログラムを見直したのですがどこが違うのか分かりません。以下は原因がありそうなコードの抜粋です。(抜粋なのでエラーと関係なさそうなコードは途中でも省略しています。) よろしくお願いします。 idはID、namは名前、preは出身地、agは年齢です。 //文字コード $enc_disp = "EUC-JP"; $enc_db = "EUC-JP"; //データの文字コードを変換する function cnv_enc($string, $to, $from){ //文字コードを変換する $det_enc=mb_detect_encoding($string, $from.",". $to); if($det_enc and $det_enc != $to){ return mb_convert_encoding($string, $to, $det_enc); } else{ return $string; } } //データを取り出す $sql="SELECT id,nam,pre,ag FROM table1 ORDER BY id"; $res=mysql_query($sql,$conn) or die("データ抽出エラー"); //取り出したデータを表示する echo "<table border=\"1\">"; echo "<tr>"; echo "<td>ID</td>"; echo "<td>名前</td>"; echo "<td>出身</td>"; echo "<td>年齢</td>"; echo "</tr>"; while($row=mysql_fetch_array($res,MYSQL_ASSOC)){ echo "<tr>"; echo "<td>".$row["id"]."</td>"; echo "<td>".cnv_enc($row["nam"], $enc_disp, $enc_db)."</td>"; echo "<td>".cnv_enc($row["pre"], $enc_disp, $enc_db)."</td>"; echo "<td>".$row["ag"]."</td>"; echo "</tr>"; } echo "</table>";

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

    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で同じページに似た内容のデータベースを表示

    PHPで同じページに同じデータベース(table)から別の条件でリストを表示させています。 もっと簡単でスマートな方法はないか、ご質問させていただきます。 【表示例】 <鈴木さん> 鈴木たろう 090-0000-0000 鈴木まさゆき 080-0000-0000 鈴木あきこ 03-0000-0000 <佐藤さん> 佐藤まさる 090-0000-0000 佐藤ともみ 080-0000-0000 佐藤けいこ 03-0000-0000 【PHP】 <?PHP $sql = "SELECT name, tel FROM table"; $sql .= " WHERE name LIKE '%鈴木%'"; $recordSet = mysql_query($sql); $rows = mysql_num_rows($recordSet); if($rows){ while($row = mysql_fetch_array($recordSet)) { $table .= "".$row['name'].""; $table .= " ".$row['tel']."<br>"; $table .= "\n"; } } echo "<鈴木さん><br>"; echo $table; mysql_free_result($recordSet); ?> <?PHP $sato_sql = "SELECT name, tel FROM table"; $sato_sql .= " WHERE name LIKE '%佐藤%'"; $sato_recordSet = mysql_query($sato_sql); $sato_rows = mysql_num_rows($sato_recordSet); if($sato_rows){ while($sato_row = mysql_fetch_array($sato_recordSet)) { $sato_table .= "".$sato_row['name'].""; $sato_table .= " ".$sato_row['tel']."<br>"; $sato_table .= "\n"; } } echo "<佐藤さん><br>"; echo $sato_table; mysql_free_result($sato_recordSet); ?> 上記のように、同じデータベース(table)から、 「鈴木さん」「佐藤さん」それぞれ条件を設定して表示していますが、 もっと簡単に短いコードで表示させることは可能でしょうか。 また、可能であれば、それを何と呼べば(検索すれば)宜しいのでしょうか。 お願い致します。

    • ベストアンサー
    • PHP
  • smartyでMySQLから連想配列取り出しと表示

    フォーム(POST)を使ってMySQLにデータを挿入し、 mysql_fetch_assocにて連想配列で取り出して、 whileで表示する場合、 ======================================== $sql = "SELECT * hogehoge"; $result = mysql_query($sql); while ($row = mysql_fetch_assoc($result)) { echo $row["userid"]; echo $row["name"]; echo $row["sex"]; } ======================================== とすれば、MySQLから値を取りだして表示できます。 ただ、それをsmartyに置き換えて以下のようにすると、 ======================================== {foreach from=$row item=hoge} <tr> <td>{$row.userid}</td> <td>{$row.name}</td> <td>{$row.sex}</td> </tr> {/foreach} ======================================== 同じ値が$rowの値の数だけ返されてしまいます。 例だと、 1 太郎 男 2 花子 女 3 一郎 男 4 陽子 女 5 良子 女 と表示したいものが、 1 太郎 男 1 太郎 男 1 太郎 男 となってしまいます。 これを解決するには、どのようにすればよろしいのでしょうか?

    • ベストアンサー
    • PHP
  • WHILEで取り出しループ中にさらにSQL文を入れたいです。

    こんばんは。 いつもお世話になっております。 またはまってしまったみたいで、どうにもわからなく なってしまいました。 どうかご指導よろしくお願いいたします。 使用環境はPHP5+Apche+MySQL4.0です。 2つのテーブルから【一覧リスト】というページを作って mysq_fetch_array関数で、行をループで呼び出しました。 ここまでは出来たのですが、取り出したキー情報を もとに、別テーブルの情報(文字列)を取り出したい のです。 以下、試してみたコードです。 //SQL発行 $rs = mysql_query("select * from uriage", $conn); //1件ずつ取り出すループ while( $rec = mysql_fetch_array( $rs, MYSQL_ASSOC)){ echo "<tr>"; echo "<td>".$rec['oder_no']."</td>"; $sql = "(select*from syouhin where syouhin_id = '".$rec["syouhin_id"]."')"; $res = mysql_query($sql); $rows = mysql_fetch_array($res); echo $rows["syouhin_name"]; echo "<td>".$rec['siiresaki']."</td>"; echo "<td>".$rec['tanka']."</td>"; echo "</tr>"; } Parse error: syntax error, unexpected T_ECHO というエラーが返ってきています。 エラーの行数はecho $rows["syouhin_name"]; の部分です。 何が悪いのかすら判らなくて…。 どうか、ご指導よろしくお願いいたします。

    • ベストアンサー
    • PHP
  • if()文が上手くいかない。パート2

    $sql= 'SELECT a.id,a.name,a.ji,a.pass,b.id,b.name,b.day,b.st,b.sh,b.tday,b.tt,b.th,b.go FROM t AS a, ti AS b WHERE a.id=b.id group by a.id ORDER BY b.day DESC'; $res = mysql_query($sql); $sql2 = 'SELECT * FROM ti'; $res2 = mysql_query($sql2); while($row = mysql_fetch_array($res)){ $st = $row['st']; } while($row2 = mysql_fetch_array($res2)){ if(!$st==""){ echo $row2['name'].'<br>出勤<br>'; }else{ echo $row2['name']; } } 改善点御教授下さい。お願いします。 参考:http://okwave.jp/qa/q7424432.html

    • 締切済み
    • PHP
このQ&Aのポイント
  • ワクチン接種が進んでいるにも関わらず、新型コロナウイルス感染者が急増しています。
  • この急拡大の原因は、デルタ株の感染力が強力なことと、自粛疲れや慣れで出歩いている人が増えたことが考えられます。
  • 感染予防対策やワクチン接種の重要性を再認識し、引き続き感染拡大を防ぐための行動が必要です。
回答を見る

専門家に質問してみよう