DB検索結果なしの場合のエラーメッセージが表示されない問題の解消方法

このQ&Aのポイント
  • GETで取得したナンバーを元にDBを検索し、該当するデータがなければエラーメッセージを表示する処理について質問です。
  • 現在のソースでは、該当するデータがない場合でもエラーメッセージが表示されずに処理が続行されてしまいます。
  • if文の条件指定が間違っている可能性を考え、if文の条件を「!$result」から「!pg_num_rows($result)」に変更してみてください。
回答を見る
  • ベストアンサー

DBで検索結果に該当するデータがなかった場合

 GETで取得したナンバーを元にDBを検索し、該当するデータがなければその旨を表示したいのですが、以下のソースでは「該当する記事はありません。」が出力されません。  else以降(データがあった場合)の処理は正常に行われているようなので、if文の最初の条件指定が間違ってるのかと思うのですが、PHPマニュアルにも同じ風にしか書いてなかったので「?」状態です。試しに一度if(!isset($result))と書いてみたんですがやはりダメでした。  どこを直せばいいのか、アドバイスをお願いいたします。 /////////////////////////////////////////////////////////// $conn = my_pg_connect(); $num=$_GET['num']; if(!isset($num)){ $result_html="<p>不正なアクセスです。</p>"; }else{ $sql = "select * from testtable where num='{$num}'"; $result = pg_query($conn,$sql); if(!$result){ $result_html="<p>該当する記事はありません。</p>"; }else{ (データがあった場合はHTMLとして書き出し) } } (後略)

  • rusya
  • お礼率56% (167/295)
  • PHP
  • 回答数1
  • ありがとう数1

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

  • ベストアンサー
  • wp_
  • ベストアンサー率54% (132/242)
回答No.1

if(!$result){ $result_html="<p>該当する記事はありません。</p>"; }else{ ↓ $result = pg_query($conn,$sql); $data = array(); while($row = pg_fetch_assoc($result)) {  $data[] = $row; } if($data == array()) {  $result_html="<p>該当する記事はありません。</p>"; } $resultはリソースです。正常にアクセスできたかを示すキーです。 実データではありません。 falseを返すのはconnectが不正とかいったパターンしかありませんよ。 >マニュアル マニュアルには以下の形式で載っていると思うのですが。。 $result = pg_query($query) or die('Query failed: ' . pg_last_error()); -- 蛇足。 $num=$_GET['num']; if(!isset($num)){ ↓ if(!isset($_GET['num'])){ }else{ $num=$_GET['num']; ですね。 あとGET値をそのままクエリに突っ込んでるのでかなり危険です。 pg_escape_stringを「最低限」噛ましましょう。

rusya
質問者

お礼

早速の回答ありがとうございます。 どこかで「やっぱり$resultではないよなぁ」と思いつつ、情けないことに他に思いつきませんでした。おかげさまで解決です。 現在はとりあえず動作確認最優先なので、XSS対策等は後回しにしているのですが、運用段階ではきちんと実装させたいと思います。

関連するQ&A

  • DBに格納されたバイナリデータを画像表示する方法

    PHP初心者ですみません。PHP、PSQLでDBにアップロードされた画像データ(バイナリデータ)をWEB上で例<img src=image.php>画像表示したいのですが、画像が×表示になってしまいます。格納時にデータが間違っているのか?それとも表示方法が間違っているのかわかりません。どなたか助けてください。 【アップファイル格納時スクリプト】 //fopenして変数に保存 $fp = fopen($_FILES["upfile"]["tmp_name"],"r"); $imagedata = fread($fp,filesize($_FILES["upfile"]["tmp_name"])); fclose($fp); //バイナリデータをエスケープ $imagedata = pg_escape_bytea($imagedata); $filename = $_FILES["upfile"]["name"]; $sql_g = "update img set img_data='$imagedata'"; $conn_g = connect(); $result_g = pg_query($conn_g,$sql_g); pg_close($conn_g); } 【画像表示用ファイルスクリプトimage.php】 $sql_i = "select img_data from img"; $conn_i = connect(); $res_i = pg_query($conn_i,$sql_i); $num_i = pg_num_rows($res_i); $img_data = pg_fetch_result($res_i,0,"img_data"); header('Content-type: image/gif'); header('Content-Disposition: inline; filename=' . $img_data); print"${img_data}"; 【画像表示部分スクリプト】 <img src="http://●●●●/●●/image.php" alt="イメージ" width="500" height="100"> こんな感じなのですが、どこがどう違うのか何度も試してやっとここまできたのですが、答えがでません。お解りの方いらっしゃいましたらご指摘をどうかよろしくお願いいたします。

  • データ削除のスクリプト

    初心者ですがよろしくお願いします。 HTML+PHP+MySQLの組み合わせで、データベースを作っています。「MySQL入門以前」という本で、テーブルを作り、次にデータ登録、検索、修正のスクリプトを作り、そこまではうまく動作しました。 削除のスクリプトが動作せず、エラーメッセージが出てしまいます。テキストを真似て作ってきたのですが、動かない理由がわかりません。 $rows = mysql_num_rows($result);  の部分がいけないということのようですが。 環境は、Windows XP, MySQL 4.020, PHP04.3.7.7, Apache1.3.29 です。 エラーメッセージ;Warning: mysql_num_rows(): supplied argument is not a valid MySQL result resource in c:\documents and settings\hisao\my documents\mysite\hisao\f_sakujo1.php on line 29 該当データがありません。 <?php extract($_POST); extract($_GET); mysql_connect('localhost','root','kyon'); mysql_select_db('hisao'); //MySQLレコード削除 if($kakunin=="確認"){ $sql = "delete from tfk where renban = $ren"; mysql_query($sql); echo "レコードの削除が完了しました"; exit; } //削除確認のためのフォーム $sql = "select * from tfk where renban = $id"; $result = mysql_query($sql); $rows = mysql_num_rows($result); if($rows == 0){ echo "<p>該当データがありません。</p>"; } else{ while($row = mysql_fetch_array($result)){ echo "<p>このレコードを削除します。</p>"; echo "<form action = \"f_sakujo1.php\" method = \"post\">"; echo "<p>県名:"; echo $row["kenmei"]; echo "</p>"; 以下省略

    • ベストアンサー
    • PHP
  • SQL whereの中のif文について

    SQLの中にif文を使いたいですが、 うまくいきません。 やはりwhereの中で使えないですか? アドバイスお願いします。 実際のSQL文: $sql = "select * from room";     $sql = $sql . " WHERE ((Keisai = 1)"; if(Chinryou1>0){ $sql = $sql . " and (Chinryou1 <= {$rent1})";     }else if(Chinryou1==0){ $sql = $sql . " and (Chinryou2 <= {$rent1})";    } $sql = $sql . ")"; $sql = $sql . " order by Narabijun desc, Name"; $sql = $sql . ";"; $result = mysql_query($sql, $conn); $num = mysql_num_rows($result);

    • ベストアンサー
    • MySQL
  • C#でDBにデータを送るプログラムが上手くいかない。

    C#でCSVデータを読み込んでから、PowerGres5のPgAdminに挿入する(Insert into ***)プログラムを作成しています。 SQLコードも接続設定も全てXMLから取り込んで処理しているのですが、なぜかSQLコードの実行でエラーが発生して、例外処理に飛びます。 デバックしてSQLコードを取り出して直接実行すると成功するので、処理の段階で弾かれているのではないのかと予想はできるのですが、対処方法がわかりません。 ちなみにデータを呼び出すことは上手くいきます。 わかる方がおられましたら助言をお願いします。 問題のソースコード↓ StreamReader sr = new StreamReader(ul_address, Encoding.Default); /* ファイルの読み込み */ int k = 0; while(sr.Peek() > -1) { string txt = sr.ReadLine(); /* 一行分のデータを代入 */ if (Regex.Match(txt, "','").Success == false) { /* 文字列内の','を検索。偽の場合、各項目を''で括る処理を行う */ string cut = ","; string[] temp; temp = Microsoft.VisualBasic.Strings.Split(txt, cut, -1, Microsoft.VisualBasic.CompareMethod.Binary); /* ,で文字列を項目ごとに区切って、それぞれを配列へ代入 */ int temp_num = temp.Length; /* 要素数 */ for (int j = 0; j < 100; j++) { if (j == temp_num) break; /* 要素数に到達=nullなので、for分を抜ける */ temp_data[j] = "'" + temp[j] + "'"; /* ''で括る処理 */ } for (int j = 0; j < temp_num; j++) { if (j == 0) txt = temp_data[j]; else txt += "," + temp_data[j]; /* 分離した項目を、,で区切りながら文字列に戻す */ } } dl_data[k] = txt; /* 文字列を配列に代入 */ k++; } //Read_db(); NpgsqlConnection conn = new NpgsqlConnection(connectionString); /* 接続設定 */ try /* DB接続 */ { conn.Open(); } catch { string res = "接続エラー[各設定を確認してください]"; get_bad(res); /* 結果を返す */ return; } int x = 0; /* 添え字変数 */ st: /* 戻り地点 */ NpgsqlCommand command = new NpgsqlCommand(UlorderSt + dl_data[x] + UlorderEn, conn); Int32 rowsaffected; try /* SQLコードの実行 */ { rowsaffected = command.ExecuteNonQuery(); /* SQLコードの読込&実行 */ x++; if (x < k) goto st; /* nullになるまで繰り返す */ conn.Close(); /* 接続を閉じる */ string res2 = "データ送信完了"; get_ok(res2, k); /* 結果を返す */ } catch { string res = "データ送信エラー[SQLコードを確認してください]"; get_bad(res); /* 結果を返す */ }

  • MYSQL、PHPを使ってのデータとそのデータ数表示について

    よろしくお願いいたします。 このようなテーブルを組んでいます。  game        maker  マリオ      任天堂  カービィ     任天堂  FF        スクエニ   ドラクエ     スクエニ  ソニック     セガ このテーブルを使って、  任天堂(2)  スクエニ(3)  セガ(1) というように、メーカーが作ったゲームの数がカッコ内ででるように、makerを並べたいと思っています。 これはどのように組んだらよいのでしょうか? ちなみに、今はこのように組んで、(もちろんですが)失敗しています。。 ---------------------------------------------------------------- <?php mysql_connect('***','***','***'); mysql_select_db('***'); $sql = "select * from test"; $result = mysql_query($sql); $rows = mysql_num_rows($result); if($rows == 0){ echo "<p>該当データがありません。</p>"; } else { while($row = mysql_fetch_array($result)){ echo $row["maker"]; echo "<br />"; } } ?> ---------------------------------------------------------------- 初歩的な質問で大変恐縮ですが、よろしくお願いいたします!

    • ベストアンサー
    • PHP
  • 検索結果の分割表示時のSQLエラー

    PHP, MySQLで検索システムを作り、検索結果の分割表示をしようとしています。 その際、SQL文にエラーが生じるのですが、原因が調べてみてもわかりません。 検索条件のSQL文内のNUM_SHOPSという部分を数値に変えると1ページ目はきちんと分割表示されますが2ページ目以降が全件表示されてしまいます。 そして、NUM_SHOPSの部分をそのままにすると、SQLがエラーを起こします。var_dumpで$queryを確認すると、SQL文が二重に入ってしまっているのですが、どうしてこのような現象が起きるのかがいまいちわかりません。 アドバイス、ご指摘等いただけないでしょうか。 よろしくお願い致します。 以下に該当箇所のコードを記載します。 【result.php】 <?php require_once('config.php'); require_once('functions.php'); connectDb(); if (preg_match('/^[1-9][0-9]*$/', $_GET['page'])) { $page = (int)$_GET['page']; } else { $page = 1; } $offset = NUM_SHOPS * ($page - 1); //クエリ生成 $query = "SELECT * FROM テーブル名"; //検索条件抽出 $where = array(); if (isset($_GET['area'])and($_GET['area'] !== '')) { $where[] = sprintf("(area='%s')", mysql_real_escape_string($_GET['area'])); } if (count($where) <> 0) { $query .= ' where ' . implode(' and ', $where) . ' ORDER BY id DESC '; } if (count($where) <> 0) { $query .= "limit " . $offset . ", NUM_SHOPS" ; } var_dump($query); //Result $result = mysql_query($query) or die($query . '<br />' . mysql_error() . '<hr />'); //検索結果件数カウント $query = "SELECT COUNT(id) FROM テーブル名"; $where = array(); if (isset($_GET['area'])and($_GET['area'] !== '')) { $where[] = sprintf("(area='%s')", mysql_real_escape_string($_GET['area'])); } if (count($where) <> 0) { $query .= ' where ' . implode(' and ', $where) . ' ORDER BY id DESC'; } $total = mysql_result(mysql_query($query), 0); $from = $offset + 1; $to = ($offset + NUM_SHOPS) < $total ? ($offset + NUM_SHOPS) : $total; ?> 【config.php】 <?php define('DB_HOST', '*************'); define('DB_USER', '*************'); define('DB_PASSWORD', '*************'); define('DB_NAME', '*************'); //ページごとのショップ数 define('NUM_SHOPS', 10); //エラー表示 error_reporting(E_ALL & ~E_NOTICE); 【functions.php】 <?php function connectDb() { mysql_connect(DB_HOST, DB_USER, DB_PASSWORD) or die("can not connect to DB:".mysql_error()); mysql_select_db(DB_NAME) or die("can not select DB: ".mysql_error()); } function h($s) { return htmlspecialchars($s); }

    • ベストアンサー
    • PHP
  • phpでデータリスト作成

    php+PostgreSQLでデータのリスト作成をしています。 DB内にあるデータを条件に合うデータを30件ずつ表示させ、ページ切替をしています。 10ページあると、ページ切替のリンクが、 1~10まで全て表示されます。 これを5ページ目まで+次ページ 前ページ 6 7 8 9 10 が表示 どのようにすればよいでしょうか? よろしくお願い致します。 現時点でのソースです。 **************************************************DB接続後 $sql = "select count(*) from entry_user"; $result = pg_query($sql) or die("Failed to execute SQL\n"); $row = pg_fetch_result($result,0,0); $ln = 30; if ($row%$ln == 0){  //表示する件数(MAX) $pn = floor($row / $ln); } else{ $pn = floor($row / $ln)+1;  } pg_free_result($result); $data = "entry_id,entry_time,company,dept,sei,mei,post1,post2,pref,address2,address3,email,entry_flag"; $sort_key = "entry_id"; //ソート対象フィールド $sort ="desc"; //ソート desc:降順 $sql1 = "select $data from entry_user order by $sort_key $sort limit $ln offset " . ($pnn-1)*$ln ; //SELECT文 $result1 = pg_query($sql1) or die("Failed to execute SQL\n"); $row1 = pg_num_rows($result1); for ($i = 0; $i < $row1; $i++){ $table[$i] = pg_fetch_row($result1,$i); } 一覧表示後(省略) //ここからページ切替作成 for ($n = 1;$n<$pn+1;$n++){ if($pn != 1){ if($n != $pnn){ print(" <a href=list01.php?pnn=" . $n . ">"); print($n . "</a> \n"); } else{ // ページ数が、現在表示しているページと同じで有ればリンクなし print($n . " \n"); }} else{ print("1\n"); }}

    • ベストアンサー
    • PHP
  • php+MySqlでの検索結果について

    以下のソースで検索結果が表示されるのですが、検索結果が多数ある場合、例えば10件ずつ表示して「次へ」「前へ戻る」「最終頁」等のリンクを貼る方法が分かりません。 また、検索結果から並べ替え(データの更新日時等から)も出来ればと思い質問させていただきました。 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "ttp://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> <title>検索</title> </head> <body> <?php # 入力値に不正なデータがないかなどをチェック。 function checkInput($var) { if (is_array($var)) { return array_map('checkInput', $var); } else { if (get_magic_quotes_gpc()) { // magic_quotes_gpc対策 $var = stripslashes($var); } if (preg_match('/\0/', $var)) { // NULLバイト攻撃対策 die('不正な入力です。'); } if (!mb_check_encoding($var, 'UTF-8')) { // 文字エンコードの確認 die('不正な入力です。'); } return $var; } } function h($string) { // HTMLでのエスケープ処理をする return htmlspecialchars($string, ENT_QUOTES); } # POSTされたデータをチェック。 $_POST = checkInput($_POST); // データベース設定 $dbServer = 'localhost'; $dbUser = 'user'; $dbPass = 'password'; $dbName = 'sample'; $flag = TRUE; // MySQLデータベースに接続 if (!$link = mysql_connect($dbServer, $dbUser, $dbPass)) { $flag = FALSE; } // データベース選択 else if (!mysql_select_db($dbName, $link)) { $flag = FALSE; } // 文字エンコードの指定(PHP5以降かつMySQL 4.1以降) else if (!mysql_set_charset('utf8', $link)) { $flag = FALSE; } # $flagの値の判定 if ($flag === FALSE) { echo 'データベースエラー'; } else if (isset($_POST['data'])) { $data = $_POST['data']; $dataList = explode(' ', mb_convert_kana($data, 's')); $sql = 'SELECT * FROM search WHERE 1'; foreach ($dataList as $word) { if ($word == '') continue; $sql .= sprintf(" AND data LIKE '%s'", '%' . mysql_real_escape_string($word) . '%'); } echo '<p>SQL: ' . h($sql) . '</p>'; $query = mysql_query($sql, $link); if (!$query) { echo 'データベースエラー'; } else if (mysql_num_rows($query) == 0) { echo '<p>「' . h($data) . '」はデータベースに登録がありません。</p>'; } else { echo '<p>「' . h($data) . '」はデータベースに登録がありました。</p>'; echo '<p>検索結果</p>'; echo '<table border="1">'; echo ' <tr>'; echo ' <th>ID</th>'; echo ' <th>データ</th>'; echo ' </tr>'; while ($row = mysql_fetch_array($query, MYSQL_ASSOC)) { echo ' <tr>'; echo ' <td>' . h($row['id']) . '</td>'; echo ' <td>' . h($row['data']) . '</td>'; echo ' </tr>'; } echo '</table>'; } $sql = 'SELECT * FROM search'; $query = mysql_query($sql, $link); if (!$query) { echo 'データベースエラー'; } else { echo '<p>データベースの内容一覧</p>'; echo '<table border="1">'; echo ' <tr>'; echo ' <th>ID</th>'; echo ' <th>データ</th>'; echo ' </tr>'; while ($row = mysql_fetch_array($query, MYSQL_ASSOC)) { echo ' <tr>'; echo ' <td>' . h($row['id']) . '</td>'; echo ' <td>' . h($row['data']) . '</td>'; echo ' </tr>'; } echo '</table>'; } } ?> <form method="post" action=""> <p>検索ワードを入力して下さい</p> <input type="text" name="data" /> <input type="submit" value="検索する" /> </form> </body> </html> このソースのどの部分に記述してよいのか等も含めてご伝授頂きたく思います。 宜しくお願いします。

    • ベストアンサー
    • MySQL
  • PostgreSQLに書き込むことが出来ない

    環境→Windows XP Home Edition Apache→Apache 2.0.59 PostgreSQL→PostgreSQL8.1.6 PHP→PHP4.4.4 DBに書き込もうとしていますがなかなか上手くできません。 <?php //データベースに接続する $conn = pg_pconnect("user=postgres password=grjtf dbname=mytbl"); //データベースに接続出来るかチェック if(!$conn) { //エラーメッセージ echo "An error occured.\n"; exit; } else { //接続成功メッセージ print "DB(mytbl)に接続しました。<br>"; } //データベースに接続し、mytblからidとnameを取り出す $result = pg_query($conn,"SELECT id,name FROM mytbl"); //データベース(mytbl)からidとnameを取得する if (!$result) { //エラーメッセージ echo "An error occured.\n"; exit; } else { //接続成功メッセージ print "idとnameを取得しました。<br>"; } //データベースmytblに書き込む if(isset($_POST["action"]) && $_POST["sign"] == '書き込み') { //名前とスコアが何も書かれていなかった場合 if($_POST["id"] && $_POST["name"]) { //データベースに書き込む $sql="INSERT INTO mytbl(id,name) VALUES('$id','$name')"; pg_query($conn,$sql); //成功メッセージ print "DB(mytbl)に書き込みました。<br><br>"; } else { //エラーメッセージ print "書き込めませんでした。<br><br>"; } }

    • ベストアンサー
    • PHP
  • phpファイル間のデータのやり取りについて

    はじめまして。 PHP初心者です。 今、仕事でPHPを使っているのですが、どうしてもわからないところがあります。 SQLでテーブルに入っているデータを検索した後、その検索したものを表示し、さらにその表示した文字列の横にチェックボックスを設置しています。 for文で検索された件数分ループさせ、表示させています。 このチェックボックスにチェックを入れた、入れない、という情報を別のPHPファイルに送りたいのですが、どうしても検索された最後の文字列に対応したチェックボックスの内容しか送信されません。 (具体的にいうと45のデータを送りたいのですが・・・) ソースは以下のとおりです。 for($i=0; $i<$num; $i++){   $a = pg_fetch_array($result02,$i);   $name = $a['name'];   $id = $a['id'];   $sql = "select * from table where id = $id";   $result = pg_query($con,$sql);   $num = pg_numrows($result);   if($num == 0){    printf("<input type=\"checkbox\" name=\"id\" value=\"$id\"> ");    printf("%s",$name);   } if($num == 1){ printf("<input type=\"checkbox\" name=\"id\" value=\"$id\" checked> "); printf("%s",$name); } }  また、送信先のphpファイルで、送られてきたデータをどのように受け取ればよいのでしょうか? わかりづらいと思いますが、よろしくお願いいたします。

    • ベストアンサー
    • PHP

専門家に質問してみよう