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

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

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

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

Q&A

解決済

3回答

660閲覧

二つのテーブルの内容を表示するPHPプログラム

NASKA

総合スコア10

PHP

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

0グッド

0クリップ

投稿2022/07/07 14:42

編集2022/07/07 16:07

参考書の演習問題の解答がなく、プログラムの書き方に詰まってしまったので、質問させていただきます

PHP

1<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" 2 "http://www.w3.org/TR/html4/strict.dtd"> 3<html> 4<head> 5 <meta http-equiv="Content-Type" content="text/html;charset=utf-8"/> 6 <title>Webシステム(データベースの利用例)</title> 7</head> 8<body> 9 <h1>Webシステム</h1> 10 <p>データベースを利用するPHPプログラムの例</p> 11 <?php 12 $link = mysqli_init(); 13 // MySQLに接続する。ユーザ名とパスワードは,自分がサーバに用意したものを書く 14 // 使用するデータベースを選択する 15 $db = mysqli_real_connect( 16 $link, 'localhost:8889', 'aaa', 'aaa', 'support_db', 8889); 17 if (! $db) { 18 exit ('MySQLには接続できません.'); 19 } 20 mysqli_set_charset($link, 'utf8'); 21 22 // フォームに入力されているかどうか 23 $snum = ""; 24 if(isset($_GET['snum'])) { 25 // 入力フォームの内容を取得する 26 $snum = @trim($_GET['snum']); 27 // selectコマンドを実行する 28 $query="SELECT * FROM gakusei_t where snumber='$snum'"; 29 //$query="SELECT * FROM gakusei_t"; 30 $result = mysqli_query($link, $query); 31 if (! $result) { 32 exit ('コマンドを実行できません.'); 33 } 34 } 35 ?> 36 37 <form action="" method="GET"> 38 <p>学籍番号:<input type="text" name="snum" value=" 39 <?php 40echo $snum; 41 ?> 42"/> <input type="submit" value="送信する"/> 43 </p></form> 44 <p> 45 <?php 46 if (isset($snum) != "" && is_numeric($snum) && mysqli_num_rows($result) == 1) { 47 $row = mysqli_fetch_array($result); 48 echo "<table border = \"1\">\n"; 49 echo "<tr>\n"; 50 echo "<th>学籍番号</th>\n"; 51 echo "<th>氏名</th>\n"; 52 echo "<th>出身</th>\n"; 53 echo "<th>クラス</th>\n"; 54 echo "</tr>\n"; 55 echo "<tr>\n"; 56 echo "<td align='right'>" . $row['snumber'] . "</td>\n"; 57 echo "<td>" . $row['sname'] . "</td>\n"; 58 echo "<td>" . $row['syusshin'] . "</td>\n"; 59 echo "<td align='right'>" . $row['class'] . "</td>\n"; 60 echo "</tr>\n"; 61 echo "</table>\n"; 62 } else { 63 //echo ":" . $snum . ":" . isset($snum) . ":" . is_numeric($snum) . ":" . mysql_num_rows($result); 64 } 65 ?> 66 </p> 67</body> 68</html>

こちらのPHPプログラムを
選択ボックスで学籍番号を選択すると、その学籍番号の学生テーブルと履修テーブルの内容を表示するPHPプログラムに変えたいです
今は

$query="SELECT * FROM gakusei_t where snumber='$snum'";

のところを

$query="SELECT * FROM gakusei_t NATURAL JOIN risyu_t WHERE gakusei_t.snumber='$snum' AND risyu_t.snumber='$snum'";

に変えて、
テーブルを表示する部分を

<?php if (isset($snum) != "" && is_numeric($snum) && mysqli_num_rows($result) == 1) { $row = mysqli_fetch_array($result); echo "<table border = \"1\">\n"; echo "<tr>\n"; echo "<th>学籍番号</th>\n"; echo "<th>氏名</th>\n"; echo "<th>出身</th>\n"; echo "<th>クラス</th>\n"; echo "<th>履修科目</th>\n"; echo "</tr>\n"; echo "<tr>\n"; echo "<td align='right'>" . $row['snumber'] . "</td>\n"; echo "<td>" . $row['sname'] . "</td>\n"; echo "<td>" . $row['syusshin'] . "</td>\n"; echo "<td align='right'>" . $row['class'] . "</td>\n"; echo "<td>\n"; foreach($row['risyu'] as $risyu){ echo $risyu['kamoku'] . "(" . $risyu['hyouka'] . ") <br\>\n"; } echo "</td>\n"; echo "</tr>\n"; echo "</table>\n"; } else { //echo ":" . $snum . ":" . isset($snum) . ":" . is_numeric($snum) . ":" . mysql_num_rows($result); } ?>

このように変えて学籍番号を入力したときに履修テーブルの内容を持ってくることができるか試したのですが、テーブルが出てきませんでした。
先程のsqlで$snumの場所に1212001と指定し、検索したものを下に載せます
イメージ説明
このように出るので、sql自体は間違っていないと思うのですが、表示の仕方がわかりません。

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

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

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

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

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

yambejp

2022/07/08 00:44

mysqli_関数はジリ貧なので自力で解決できないならはやめにpdoへの移行をおすすめします
guest

回答3

0

自己解決

php

1<?php 2 if (isset($snum) != "" && is_numeric($snum) && mysqli_num_rows($result) >= 1) { 3 $row = mysqli_fetch_array($result); 4 echo "<table border = \"1\">\n"; 5 echo "<tr>\n"; 6 echo "<th>学籍番号</th>\n"; 7 echo "<th>氏名</th>\n"; 8 echo "<th>出身</th>\n"; 9 echo "<th>クラス</th>\n"; 10 echo "<th>履修科目</th>\n"; 11 echo "</tr>\n"; 12 echo "<tr>\n"; 13 echo "<td align='right'>" . $row['snumber'] . "</td>\n"; 14 echo "<td>" . $row['sname'] . "</td>\n"; 15 echo "<td>" . $row['syusshin'] . "</td>\n"; 16 echo "<td align='right'>" . $row['class'] . "</td>\n"; 17 echo "<td>\n"; 18 do{ 19 echo $row['kamoku'] . "(" . $row['hyouka'] . ") <br>\n"; 20 } 21 while($row = mysqli_fetch_array($result)); 22 echo "</td>\n"; 23 echo "</tr>\n"; 24 echo "</table>\n"; 25 } else { 26 //echo ":" . $snum . ":" . isset($snum) . ":" . is_numeric($snum) . ":" . mysql_num_rows($result); 27 } 28 ?>

このようにdo while文で記述したらうまく行きました

投稿2022/07/11 16:23

NASKA

総合スコア10

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

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

0

テーブルの構造を示す情報がないのでなんとも言えませんが、

$query = <<<EOT SELECT * FROM gakusei_t LEFT JOIN risyu_t ON gakusei_t.snumber = risyu_t.snumber WHERE gakusei_t.snumber = '$snum' EOT;

ってやったらどうでしょう。
NATURAL JOINって同じカラム名があると全部結合しちゃうので、
それぞれでもし違う意味で例えばnameカラムがあるとそれも結合条件にしちゃうので。
おそらく、gakusei_tに従属する形でrisyu_tがあると想像するので、
LEFT JOINに変えてみました。

投稿2022/07/08 01:11

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

NASKA

2022/07/08 01:57

そちらに変えたらコマンドを実行できませんの例外エラーが出てしまいました。おそらくsql記述ではなく下の方のphp記述のforeachら辺に問題があると考えているのですが、わからなくなってしまいました
退会済みユーザー

退会済みユーザー

2022/07/08 02:31 編集

if()内の「isset($snum) != ""」っておかしいからね。trueやfalseと比較してほしいところ。 PHP: mysqli_result::$num_rows - Manual https://www.php.net/manual/ja/mysqli-result.num-rows.php mysqli_num_rows()で必ずしも結果セットの行数が出てくるとは限らないので、 mysqli_fetch_array()やmysqli_fetch_assoc()の結果がfalseじゃない条件の間ループするように改めるとか。
guest

0

とりあえず ; が抜けています。

PHP

1 foreach($row['risyu'] as $risyu){ 2 echo $risyu['kamoku'] . "(" . $risyu['hyouka'] . ") <br\>\n"; // < 3 } 4 echo "</td>\n"; // <

投稿2022/07/07 15:47

kei344

総合スコア69398

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

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

NASKA

2022/07/07 16:08

ご指摘ありがとうございます。そちらを修正したらエラーは出なくなりましたが、テーブルが出ませんでした。その解決方法はありますでしょうか
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問