WHERE句で一致しない場合を判断させる方法

このQ&Aのポイント
  • WHERE句で一致しない場合を判断させる方法について質問があります。
  • $mysql_Codeで一致しない場合に特定の処理を行いたいがうまくいかないです。
  • 一部のフィールドが表示されない問題についても考察しています。
回答を見る
  • ベストアンサー

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
  • 回答数2
  • ありがとう数2

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

  • ベストアンサー
  • shimix
  • ベストアンサー率54% (865/1590)
回答No.2

たとえば該当件数が1件だったら if(!mysql_fetch_array($mysql_Row)){ このときのmysql_fetch_arrayで読み込んでしまいますよね。なので while($row = mysql_fetch_array($mysql_Row)){ は最初からbreakしてしまいます。 最初のifをmysql_num_rowsが0かどうかのチェックに代えるとか、whileをdo~whileにするとか、mysql_data_seekなどでポインタを戻すとか、の対策が必要ですね。 が、個人的には最初でチェックする必要はないと思います。データ行がなければ$html_Codeは空白のままになりますから、最後でチェックしても問題ないでしょう? $html_Code = ""; 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"; } if ($html_Code == '') { $html_Code .= '<tr><td colspan="4">条件に一致する項目はありません。</td></tr>'; }

kiseki777
質問者

お礼

>最初のifをmysql_num_rowsが0かどうかのチェックに代えるとか、whileをdo~whileに >するとか、mysql_data_seekなどでポインタを戻すとか、の対策が必要ですね。 http://php.quus.net/array/prev.php 配列の位置をポインタといい、 それを戻すとは、キーが小さい方へ位置を移動ということですね。 f(!mysql_fetch_array($mysql_Row)){で一度mysql_fetch_arrayを使っているためにポインタが移動し、再度mysql_fetch_arrayを使ったときはポインタはリセットされないので戻す作業が必要ということでしょうか。 >$html_Code = ""; とても簡単な解決策があったのですね。気がつかなかったです。 難しく考えすぎていました。ありがとうございました。

その他の回答 (1)

  • bin-chan
  • ベストアンサー率33% (1403/4213)
回答No.1

$mysql_Rowの値(レコード件数)を判断するとか? > $mysql_Code = "SELECT * FROM infotable WHERE name='$kisetsu' > 一致するはずの一部のフィールドが表示されなかったりします。 データ次第じゃないですか?全項目埋まってるのかな? $mysql_Code = "SELECT id, name, kudamono, coment FROM infotable WHERE にするとか。

kiseki777
質問者

お礼

>データ次第じゃないですか?全項目埋まってるのかな? はい。全てにデータは入っています。 if(!mysql_fetch_array($mysql_Row)){ $html_Code .= '<tr><td colspan="4">条件に一致する項目はありません。</td></tr>'; } このコードを入れたとたんに一部のフィールドが表示されなくなりました。 >$mysql_Code = "SELECT id, name, kudamono, coment FROM infotable WHERE *ではダメなことがあるのですか・・・ このようにして試してみましたが、結果は同じでした。 あれから、調べたり試したりを繰り返していますが、解決しそうもありません。 <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="ja" lang="ja"> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <meta http-equiv="Content-Style-Type" content="text/css" /> <meta http-equiv="Content-Script-Type" content="text/javascript" /> <title></title> <style type="text/css">#formeria{width:200px;float:left;}table{width:800px;float:left;border-collapse: collapse;border-spacing:0;}th{border:1px solid #ccc;background-color: #eee;}td{border:1px solid #ccc;}</style> <?php //-------------------------- //初期値設定 //-------------------------- $kisetsu = "春"; $kudamono = "りんご"; //-------------------------- if(isset($_GET['submit'])){ if(isset($_GET['kisetsu']) && isset($_GET['kudamono'])){ $kisetsu = htmlspecialchars($_GET['kisetsu']); $kudamono = htmlspecialchars($_GET['kudamono']); $mysql = mysql_connect('localhost','xxxxxxx','xxxxxxxxxxxx'); if(!$mysql){ die("MYSQLの接続に失敗。<br />".mysql_errno().":".mysql_error()); } if(!mysql_select_db('kisetsu',$mysql)){ die("データベースの接続に失敗。<br />".mysql_errno().":".mysql_error()); } $mysql_Code1 = "SELECT * FROM infotable WHERE name='$kisetsu' AND kudamono='$kudamono'"; $mysql_Code2 = "SELECT count(*) FROM infotable WHERE name='$kisetsu' AND kudamono='$kudamono'"; mysql_set_charset('utf8'); $mysql_Select = mysql_query($mysql_Code1,$mysql); $mysql_Count = mysql_query($mysql_Code2,$mysql); if(!$mysql_Select || !$mysql_Count){ die(mysql_error()); } $html_Code = ""; if($mysql_Count==0){ $html_Code .= '<tr><td colspan="4">条件に一致する項目はありません。</td></tr>'; } while($row = mysql_fetch_array($mysql_Select)){ $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"; }}} ?> </head> <body> <table> <tr><th>id&nbsp;</th><th>name</th><th>kudamono</th><th>coment</th></tr> <?php echo $html_Code; ?> </table> <div id="formeria"> <form action="<?php echo $_SERVER['PHP_SELF']; ?>" action="GET"> <select name="kisetsu" size="int"> <option value="春"<?php if($kisetsu=="春"){echo " selected";} ?>>春</option> <option value="夏"<?php if($kisetsu=="夏"){echo " selected";} ?>>夏</option> <option value="秋"<?php if($kisetsu=="秋"){echo " selected";} ?>>秋</option> <option value="冬"<?php if($kisetsu=="冬"){echo " selected";} ?>>冬</option> </select> <select name="kudamono" size="int"> <option value="りんご"<?php if($kudamono=="りんご"){echo " selected";} ?>>りんご</option> <option value="梨"<?php if($kudamono=="梨"){echo " selected";} ?>>梨</option> <option value="パイナップル"<?php if($kudamono=="パイナップル"){echo " selected";} ?>>パイナップル</option> </select> <input type="submit" name="submit" value="送信"/> </form> </div> </body> </html> 下記はテキストとしてエクスポートしたデータベースの一部です。 ===データベース kisetsu== テーブルの構造 infotable カラム|種別|NULL|デフォルト値 |id|int(11)|いいえ| |name|text|いいえ| |kudamono|text|いいえ| |coment|text|いいえ| テーブルのデータのダンプ infotable |1|春|梨|ああああああ、 いいいいいいいいい。 うううう。 |2|秋|梨|ああああああ、 いいいいいいいいい。 うううう。 ~~idは主キーです。それが30まで続きます。~~ |30|春|パイナップル|ああああああ、 いいいいいいいいい。 うううう。

関連するQ&A

  • 一致しないデータも表示させたい

    初心者です。 よろしくお願いいたします。 $sql = "SELECT * FROM table WHERE s_code IN ('" .$code."')"; $res = mysql_query($sql) or die("データ抽出エラー"); echo( "<TABLE>" ); echo( "<TR>" ); echo( "<TH>コード</TH>" ); echo( "<TH>コード名称</TH>" ); echo( "<TH>情報</TH>" ); echo( "</TR>\n" ); while ($row = mysql_fetch_array($res,MYSQL_ASSOC)){ echo( "<TR>" ); echo("<td>$row[s_code]</td>"); echo("<td>$row[name_j]</td>"); echo("<td>$row[contents]</td>"); echo( "</TR>\n" ); } 上記を実行すると $codeにカンマ区切りで入っているデータと テーブル(table)のs_codeに一致するデータが表示されます。 一致しないデータがあった場合は $codeのデータのみ表の1列目に記入させることは可能でしょうか。 たとえば、 $codeが (A,B,C)で table には AとCしか ない場合 -------------------------------- コード  コード名称  情報 -------------------------------- A りんご 青森産 B  C バナナ フィリピン産 --------------------------------- 説明が下手ですみません。 よろしくお願いいたします。

    • ベストアンサー
    • PHP
  • Formを使ったページ間での受け渡し

    いつもお世話になっています。 また、どうしても分からないことがあって投稿させて頂きます。 現在、商品管理ページをphpとmysqlで作っているのですが、 ---------------------------(分かりにくいかもしれませんが、作ってる文をそのまま載せます) <form action="Div_Insert.php" method="post">  (接続&クエリ省略) if($rows){ while($row = mysql_fetch_array($res)){ $GetItem .= "<tr>"; $GetItem .= "<td colspan=5>".$row["ITEM_ID"]."</td>"; $GetItem .= "</tr>"; $GetItem .= "<tr>"; $GetItem .= "<td>".$row["ITEM_NM"]."</td>"; $GetItem .= "</tr>"; $GetItem .= "<tr>"; $GetItem .= "<td>".$row["EXPLAN"]."</td>"; $GetItem .= "</tr>"; $GetItem .= "<tr>"; $GetItem .= "<td>".$row["ITEM_DIV"]."</td>"; $GetItem .= "</tr>"; $GetItem .= "<tr>"; $GetItem .= "<td>"; $GetItem .= "<SELECT name='ITEM_GP_LIST'><OPTION value=''></OPTION>"; while ($row2 = mysql_fetch_array($res2,MYSQL_ASSOC)){ $GetItem .= "<OPTION value=".$row2["GP_NM"].">".$row2["GP_NM"]."</OPTION>"; } mysql_data_seek( $res2, 0 ); $GetItem .= "</SELECT>"; $GetItem .= "</td>"; $GetItem .= "<tr>"; } (省略) <input type="submit" name "bottun1" value="登録"> ------------------------------- というプログラムのページを作りました。 submitされた時にDiv_Insert.phpへ $row["ITEM_ID"]とITEM_GP_LISTの値を渡せるように作りたいのですが、 試行錯誤を重ねましたが私の実力では不可能でした。 複数行の$row["ITEM_ID"]とITEM_GP_LISTを渡すというのが難しくて。。 とても分かりにくい質問だと思いますが、どうか宜しくお願い致します。

    • ベストアンサー
    • PHP
  • データが表示されません

    php4とMySQLを使用しています。 select文でデータを取得したあと while($Row2 = mysql_fetch_array($result2, MYSQL_ASSOC)){ $name = $Row2['name']; $contents = $Row2['contents']; ?> <table> <tr> <td><?=$name?></td> </tr> <tr> <td><?=$contents?></td> </tr> </table> <? } ?>で表示しようとしていますが、10件中の10件目しか表示されません。 上書きされているようです。どこがおかしいでしょうか? 教えてください。お願いいたします。

    • ベストアンサー
    • PHP
  • mysql_fetch_array取得結果を2行で

    mysql_fetch_arrayで取得した結果を、 2行で表示させるには、どうすればよいでしょうか? ※そのままだと横に長くなり過ぎるので、 複数行にして、テーブル横幅を抑えたい、です。 <現状> mysql_connect("localhost", "mysql_user", "mysql_password") or die("Could not connect: " . mysql_error()); mysql_select_db("mydb"); $result = mysql_query("SELECT * FROM mytable"); $body .= "<table> <tr> <th>ID</th> <th>氏名</th> </tr>"; while ($row = mysql_fetch_array($result)) { $body .= "<tr> <td></td> <td>".$row[name]."</td> <td>".$row[preid]."</td>

    • ベストアンサー
    • PHP
  • mysql内データ一覧表示

    for文を使用し、データ一覧を出しています。 ソースは for ($i = 0; $i < 10; $i ++) { if($row = mysql_fetch_array($result)) { $name1 = $row['name1']; $name2 = $row['name2']; $names .= '<tr>'."\n"; $names .= '<td>' .$name1. '</td>'."\n"; $names .= '<td>' .$name2. '</td>'."\n"; $names .= '</tr>'."\n"; } } echo $names; としています。 データベース内に内容10個あればもちろん10個表示されます。 例えば8個しか内容がない場合は8個表示されるのですが、残りの2個を空の<tr>~</tr>で埋めたいのですが、どのように記述したらよろしいでしょうか? 例は8個目までは <tr> <td>$name1の値</td> <td>$name2の値</td> </tr> 8個目以降は <tr> <td></td> <td></td> </tr> としたいです。 宜しくおねがいします。

    • ベストアンサー
    • PHP
  • php + mysql でフォーム作成時のエラー

    データベースから取り出したデータをラジオボタンで選択し、それをデータベース(別のテーブル)に追加させる機能を作りたいです。 非常に初歩的なことだとは思うのですがご教授ください。 MySQL 4.0.27 PHP 5.2.11 <FORM ACTION="cone3.php" METHOD="post"> <?php $srv = ""; // サーバー名 $id = ""; // ユーザーID $passwd = "; // パスワード $dbn = ""; // データベース名 $sql = "SELECT code, lname, lecturer, kind, gradetype FROM Lecture"; // SQL文 // データベースに接続する $db = mysql_connect($srv,$id,$passwd); mysql_select_db($dbn,$db); $rs = mysql_query($sql,$db); //--- テーブルのレイアウト --- 開始 -----------------------> print("<TABLE><TR>"); print("<TR><th> </th><th>講義名</th><th>教員</th><th>科目区分</th><th>配当学年</th></tr>"); while($row = mysql_fetch_array($rs)) { print '<tr><td><input type="radio" name="regist" value="$row['code']"></td>'; print '<td>' . $row['lname'] . '</td>'; print '<td>' . $row['lecturer'] . '</td>'; print '<td>' . $row['kind'] . '</td>'; print '<td>' . $row['gradetype'] . '</td>'; print '</tr>'; print ("</TR>"); } print("</TABLE>"); print_r($_POST); echo "<br />\n"; mysql_free_result($rs); mysql_close($db); //--- 終了 ---> ?> <input type="submit" name="submit" value="送信"> </form> 以上のようなソースでラジオボタンで配列の$row[code]の値を送りたいんですがうまくいきません。 よろしくお願いします。

    • ベストアンサー
    • PHP
  • 入れ子のようにしてデータを作りたい。

    よろしくお願い致します。 次のようなコードを書きました。 京都(15) 大阪(18) 滋賀(6) 奈良(23) 和歌山(21) 兵庫(9) というようなファイルを作りたいのですが、 どうもカッコの中に入れる数字がうまく入りません。 また一般的な方法として下記のような発想の 記述でよいのか、御指導をお願い致します。 <table width="100%" align="left"> <?php $con = MYSQL_CONNECT("localhost","*****","*****"); mysql_select_db("net-jp00001"); $res = mysql_query("SELECT pref.pref_id, pref.pref_name FROM pref"); // 表示文字コード if (!$res) { die('クエリーが失敗しました。'.mysql_error()); } $i=0; // クエリの文字の表示 while ($row = mysql_fetch_assoc($res)) { if ( $i >= 3 ){ ?> <form method='POST' action='search_city.php'> <tr align="center" bgcolor="#FCFFD0"> <? $i=1; }else{ $i++; } ?> <td width="5" height="21" colspan="1" align="left" bordercolor="1" bgcolor="#FCFFD0"> <input type="radio" name="pref_id" value="<?php echo $row['pref_id'] ?>"> </td> <td width="200"colspan="11" align="left" bordercolor="1" bgcolor="#FCFFD0"> <label><font size="-1"><?php echo $row['pref_name'] ?></font></label> <?  //この部分でエラーが出て記述方法がわかりません。 $pref = $row['pref_name']; $res1 = mysql_query("SELECT count(*) as city_id FROM pref INNER JOIN city ON pref.pref_id = city.pref_id WHERE pref.pref_name = $pref_name"); list($num) = mysql_fetch_row($res1); echo "(".$num.")"; ?> </td> <? } ?> </tr> <tr align="left" bgcolor="#D0FFF8"> <td height="21" colspan="12" bordercolor="1"> <input name="submit" type='submit' value='市区エリアへ'> </td> </tr> </form> </table>

    • ベストアンサー
    • PHP
  • GETメソッド ID MYSQL

    分からないことがありましたのでご質問をさせて頂きます。 現在作成してる仕様なのですが、 フォームの一つの項目のリンクを設置し、別のページに渡し そこで更に詳細な情報をMYSQLからひっぱってきて表示させようとしております。 そこでGETメソッドを使って行おうとしているのですが、どうしても 変数の受け渡しがうまくいきません。 こちらがそのコードになります。 1,フォーム <td><a href="shousai.php?code=<?php echo $row['id'];?>">詳しくはこちら</a></td> 2,詳細ページ(shousai.php) <?php echo var_dump($_GET["id"]); $id = $_GET["id"]; $con = mysql_connect('localhost','aaaa','aaa'); if (!$con) { print("MySQLへの接続に失敗しました"); exit; } if (!mysql_select_db("database")) { print("データベースへの接続に失敗しました"); exit; } $sql="select * from table where id ='$id'"; $result=mysql_query($sql,$con); //SQL文の発 $rows=mysql_num_rows($result); while($row = mysql_fetch_array($result)){ ?> <table border ="1"> <tr><td><?php echo $row["name"]; ?></p></td></tr> <tr><td><?php echo $row["address"]; ?></td></tr> <tr><td><?php echo $row["station"]; ?></td></tr> <?php } ?> </table> 2の詳細ページにてvar_dumpで$_GET["id"];の値を受け取ってるか 確かめたのですがNULLになっており、ページになにも反映されません。 フォームからリンクで値を送り、それをきっかけにデータベースに接続して詳細を表示させたいと思っております。 どなたかご存知の方お伺いできませんでしょうか?

    • ベストアンサー
    • PHP
  • ショッピングカートの作成

    今ショッピングカートを作成しようとしていて商品サンプルがいくつかあり「カートへ」ボタンを押すと精算ページへ飛び精算を行うというプログラムをつくっているのですがいくつかのサンプルでどれを選んでも一番上のサンプルの精算しか行えません。どうすれば解決できますでしょうか?よろしくお願いします。 ショッピングカートのプログラムの一部です。 while($row = mysql_fetch_row($result)){; $code = $row['0']; print "<form method='post' action='cart_syohin2.php'><tr>"; print "<td rowspan='2'>"; if (file_exists("cart_image/$code.jpg")) print "<img src='cart_image/$code.jpg' border='0'>"; print "</td>"; print "<td rowspan='3'>{$row['3']}</td>"; print "<td nowrap>{$row['2']}円</td></tr>"; print "<tr><td nowrap><input type='text' name='num' size='3'>個</td></tr>"; print "<tr><td>{$row['1']}</td>"; print "<td><input type='hidden' name='code' value='$code'><input type='submit' name='cart' value='カートへ'>"; print "</td>"; print "</tr></form>\n"; }

    • 締切済み
    • PHP
  • PHPでレコード一覧から詳細へのリンク方法

    MySQLでデータベースを構築し、PHPで表示しています。 レコードを一覧で並べるのはうまく行きましたが…一覧から詳細へリンクさせるのがうまく行きません。 detail.phpというファイルを作成してリンクさせようと思っていますが… (1)formタグを使って、GETでSUBMITする形にする場合はどうしたらいいでしょうか? (2)普通にaタグを使って、detail.php?id=xxxxx という形にする方法でもいいのですが、リンクを教えてdetail.phpに移った時点で"?"以下が消えてしまいます。 (1)の方法がやり易いかと思い、色々調べて自分なりにやってみましたが、"detail.php?id=%BE%DC%BA%D9&id=1&id=4&id=3&id=5&id=6&id=7&id=9&id=10&id=11" という形になり、なんでか全てのIDを並べている形になっています… 理想はdetail.php?id=xxxxxとなって欲しいのですが… ちなみにコードは以下の通りです。 <? php echo "<table>"; echo "<tr>"; echo "<th>ID</th>"; echo "<th>名前</th>"; echo "<th>所在地</th>"; echo "<th>詳細</th>"; echo "</tr>"; while( $row = mysql_fetch_array($result) ) { echo "<form method=\"GET\" action=\"detail.php?id=".$row["id"]."\">"; echo "<tr>"; echo "<td>".$row["id"]."</td>"; echo "<td>".$row["name"]."</td>"; echo "<td>".$row["addr"]."</td>"; echo "<td><input type=\"submit\" value=\"詳細\" name=\"id\"></td>"; echo "<input type=\"hidden\" value=\"".$row["id"]."\" name=\"id\">"; echo "</tr>"; } echo "</table>"; ?>

    • ベストアンサー
    • MySQL