phpによるsqlでの検索について

解決済

回答 2

投稿

  • 評価
  • クリップ 0
  • VIEW 596

snowman

score 22

大学の授業の課題でphpとMysqlを連携したプログラムの作成をしろというのがありました。
色々と試したのですが結局うまく行かず、完成させることができないまま提出をしました・・・
しかし、わからないままは悔しいし何よりテストでできないとまずいと思い、ここで質問させていただきました。
また、自分の考え方が正しいのかも皆様に判断していただきたいので、わかりきっていることでも自分の考えを述べさせていただいています。

以下がコードです。

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"
<html>
[ list_4_42.php ]
  "http://www.w3.org/TR/html4/strict.dtd">
 <head>
  <meta http-equiv="Content-Type" content="text/html;charset=utf-8"/>
  <title>Webシステム(データベースの利用例)</title>
  </head>
  <body>
  <h1>Webシステム</h1>
  <p>データベースを利用するPHPプログラムの例</p>
  <?php
  $link = mysqli_init();
  // MySQLに接続する。ユーザ名とパスワードは,自分がサーバに用意したものを書く
  // 使用するデータベースを選択する
  $db = mysqli_real_connect(
  $link, 'localhost', 'n1234', '1234', 'support_db', 8888);
  if (! $db) {
  exit ('MySQLには接続できません.');
    }
 mysqli_set_charset($link, 'utf8'); // 教科書にはないが必要

 // フォームに入力されているかどうか
 $snum = "";
 $sname = "";
 $Graduate = "";
 $class = "";

 if(isset($_GET['snum'])) {
 // 入力フォームの内容を取得する
 $snum = @trim($_GET['snum']);
 // selectコマンドを実行する
 $query="SELECT * FROM gakusei_t where snumber='$snum'";
 //$query="SELECT * FROM gakusei_t";
 $result = mysqli_query($link, $query);
 if (! $result) {
 exit ('コマンドを実行できません.');
 }
 }
 else if(isset($_GET['sname'])) {
 // 入力フォームの内容を取得する
 $sname = @trim($_GET['sname']);
 // selectコマンドを実行する
 $query="SELECT * FROM gakusei_t where sname='$sname'";
 //$query="SELECT * FROM gakusei_t";
 $result = mysqli_query($link, $query);
 if (! $result) {
 exit ('コマンドを実行できません.');
 }
 }
 else if(isset($_GET['Graduate'])) {
 // 入力フォームの内容を取得する
 $Graduate = @trim($_GET['Graduate']);
 // selectコマンドを実行する
 $query="SELECT * FROM gakusei_t where sname='$Graduate'";
 //$query="SELECT * FROM gakusei_t";
 $result = mysqli_query($link, $query);
 if (! $result) {
 exit ('コマンドを実行できません.');
 }
 }
 else if(isset($_GET['class'])) {
 // 入力フォームの内容を取得する
 $class = @trim($_GET['class']);
 // selectコマンドを実行する
 $query="SELECT * FROM gakusei_t where sname='$class'";
 //$query="SELECT * FROM gakusei_t";
 $result = mysqli_query($link, $query);
 if (! $result) {
 exit ('コマンドを実行できません.');
 }
 }


 ?>
 <form action="" method="GET">
 <p>学籍番号:<input type="text" name="snum" value="
 <?php
 echo $snum;
 ?>
 "/> <input type="submit" value="送信する"/>
 </p>
 <p>名前:<input type="text" name="sname" value="
 <?php
 echo $sname;
 ?>
 "/><input type="submit" value="送信する"/>
 </p>
 <p>出身:<input type="text" name="Graduate" value="
 <?php
 echo $Graduate;
 ?>
 "/> <input type="submit" value="送信する"/>
 </p>
 <p>クラス:<input type="text" name="class" value="
 <?php
 echo $class;
 ?>
 "/> <input type="submit" value="送信する"/>
 </p>
 </form>
 <p>
 <?php
 if ((isset($snum) != "" && is_numeric($snum) && mysqli_num_rows($result) == 1)||
     (isset($sname) != "" && is_string($sname) && mysqli_num_rows($result) == 1)||
     (isset($Graduate) != "" && is_string($Graduate) && mysqli_num_rows($result) == 1)||
     (isset($class) != "" && is_numeric($class) && 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 "</tr>\n";
 echo "<tr>\n";
 echo "<td align='right'>" . $row['snumber'] . "</td>\n";
 echo "<td>" . $row['sname'] . "</td>\n";
 echo "<td>" . $row['Graduate'] . "</td>\n";
 echo "<td align='right'>" . $row['class'] . "</td>\n";
 echo "</tr>\n";
 echo "</table>\n";
 } else {
 //echo ":" . $snum . ":" . isset($snum) . ":" . is_numeric($snum) . ":" .
 mysql_num_rows($result);
    }
 ?>
 </p>
</body>
 </html>

このコードは学籍番号、名前、出身、クラスのどれかのテキストボックスに入力をし、それをsqlのデータベースで検索、その検索結果を表示するというプログラム(の予定だった)です。
現状では学籍番号での検索だけ動作しています。

試したこと

if(isset($_GET['snum'])) {
 // 入力フォームの内容を取得する
 $snum = @trim($_GET['snum']);
 // selectコマンドを実行する
 $query="SELECT * FROM gakusei_t where snumber='$snum'";
 //$query="SELECT * FROM gakusei_t";
 $result = mysqli_query($link, $query);
 if (! $result) {
 exit ('コマンドを実行できません.');
 }
 }
 else if(isset($_GET['sname'])) {
 // 入力フォームの内容を取得する
 $sname = @trim($_GET['sname']);
 // selectコマンドを実行する
 $query="SELECT * FROM gakusei_t where sname='$sname'";
 //$query="SELECT * FROM gakusei_t";
 $result = mysqli_query($link, $query);
 if (! $result) {
 exit ('コマンドを実行できません.');
 }
 }
 else if(isset($_GET['Graduate'])) {
 // 入力フォームの内容を取得する
 $Graduate = @trim($_GET['Graduate']);
 // selectコマンドを実行する
 $query="SELECT * FROM gakusei_t where sname='$Graduate'";
 //$query="SELECT * FROM gakusei_t";
 $result = mysqli_query($link, $query);
 if (! $result) {
 exit ('コマンドを実行できません.');
 }
 }
 else if(isset($_GET['class'])) {
 // 入力フォームの内容を取得する
 $class = @trim($_GET['class']);
 // selectコマンドを実行する
 $query="SELECT * FROM gakusei_t where sname='$class'";
 //$query="SELECT * FROM gakusei_t";
 $result = mysqli_query($link, $query);
 if (! $result) {
 exit ('コマンドを実行できません.');
 }
 }


この部分のif文をelseで接続せずにそれぞれ独立させてみました。
そしたら、どこに何を入力しても検索結果が表示されなくなりました・・・。

考察

以上の結果から

if(isset($_GET['snum'])) {
 // 入力フォームの内容を取得する
 $snum = @trim($_GET['snum']);
 // selectコマンドを実行する
 $query="SELECT * FROM gakusei_t where snumber='$snum'";
 //$query="SELECT * FROM gakusei_t";
 $result = mysqli_query($link, $query);
 if (! $result) {
 exit ('コマンドを実行できません.');
 }
 }
 else if(isset($_GET['sname'])) {
 // 入力フォームの内容を取得する
 $sname = @trim($_GET['sname']);
 // selectコマンドを実行する
 $query="SELECT * FROM gakusei_t where sname='$sname'";
 //$query="SELECT * FROM gakusei_t";
 $result = mysqli_query($link, $query);
 if (! $result) {
 exit ('コマンドを実行できません.');
 }
 }
 else if(isset($_GET['Graduate'])) {
 // 入力フォームの内容を取得する
 $Graduate = @trim($_GET['Graduate']);
 // selectコマンドを実行する
 $query="SELECT * FROM gakusei_t where sname='$Graduate'";
 //$query="SELECT * FROM gakusei_t";
 $result = mysqli_query($link, $query);
 if (! $result) {
 exit ('コマンドを実行できません.');
 }
 }
 else if(isset($_GET['class'])) {
 // 入力フォームの内容を取得する
 $class = @trim($_GET['class']);
 // selectコマンドを実行する
 $query="SELECT * FROM gakusei_t where sname='$class'";
 //$query="SELECT * FROM gakusei_t";
 $result = mysqli_query($link, $query);
 if (! $result) {
 exit ('コマンドを実行できません.');
 }
 }


この部分に問題があると考えました。
また、名前、出身、クラスのどれかのテキストボックスに入力をして送信ボタンを押した場合、テキストボックスに入力したものが消えていたので(if文を独立させた時にはならなかった)、データがどこかで消されてしまっていると考えているのですが、全く原因がわからずここで断念しました・・・

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • shi_ue

    2017/06/26 20:43

    インデントが無くなってて見る気が失せます。

    キャンセル

  • ttyp03

    2017/06/27 09:24

    長いコードなんだからインデントくらいしてくれ。見る気が失せる。と書こうと思ったらshi_ue氏も書いてたw

    キャンセル

回答 2

+1

snumが存在するときはsnumberを調べて、存在しないときは
snameに対してsname,Graduate,classの順番で検索するということでしょうか?
それともただの書き間違いでGraduateはGraduateカラムを検索するのでしょうか?

とりあえずロジックだけ

<form>
snum:<input type="text" name="snum"><br>
sname:<input type="text" name="sname"><br>
Graduate:<input type="text" name="Graduate"><br>
class:<input type="text" name="class"><br>
<input type="submit" value="go">
</form>
<?PHP
foreach(["snum","sname","Graduate","class"] as $val){
  $$val=filter_input(INPUT_GET,$val,FILTER_VALIDATE_REGEXP,["options"=>["regexp"=>"/.+/","default"=>null]]);
}
if(!is_null($snum)){
  print "snumber='".$snum."'";
}elseif($ret=array_filter([$sname,$Graduate,$class],function($x){return !is_null($x);})){
  print "sname='".array_shift($ret)."'";
}else{
  print "not search";
}
?>

mysqli_関数は、手続き型とオブジェクト指向型の2種類があるのですが
手続き型の場合でもできればprepareで処理をしたほうがいいでしょう。
好みにもよりますが可能であれば汎用性の高いPDOの方がよいと思います。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/06/27 11:16

    ちなみに今回はテストのためユーザーから受けたデータをそのままHTML上に表示していますが
    本ちゃんで表示が必要な場合は必ずhtmlspecialcharsなどで変換してください
    またSQLで検索する場合はprepare処理など適切な処理をいれてください

    キャンセル

checkベストアンサー

0

さくっと見た限りでは

if(isset($_GET['snum']))

の条件判定がまずいと思います。
formでは入力してなくても空文字が来ますので、上記条件はtrueになりその中しか処理しないはずです。
(よって記載されている
現状では学籍番号での検索だけ動作しています。
だけが動きます)

if(isset($_GET['snum']) && empty($_GET['snum']) === false)

がいいかと思います(他のisset部分の条件も同様

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

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

  • ただいまの回答率 90.21%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

同じタグがついた質問を見る