Postgresで検索キー以外の値がヒットする

このQ&Aのポイント
  • Postgresで検索キー以外の値がヒットすることに関する問題が発生しています。
  • 環境は、Fedora Core1, PHP4.3.3-6, Apache 2.0.47, Postgres 7.3.4-2です。
  • Turbo Linux8からこの環境に移行していますが、フォームから送った検索キーで目的通りのレコードが作成されなくなりました。
回答を見る
  • ベストアンサー

Postgresで検索キー以外の値がヒットする。

環境は、 Fedora Core1 PHP4.3.3-6 apache 2.0.47 postgres 7.3.4-2 Turbo Linux8からこの環境に移行しています。フォームから送った検索キーで、目的通りのレコードが作成されなくなりました。 ファイルは共にeuc-jpで保存してあります。OSとアプリのインストールは、Turbo Linux8は製品版、Fedora Core1はFTP版のCD-ROMからしています。 DB名=mydb、 table名=address、 検索フィールド=city です。 << address.html >>   <FORM METHOD = "get" ACTION = "address.phtml">    <FONT SIZE = 3>     市区郡名を入力してください。<BR>      <INPUT TYPE = "text" NAME = "city" VALUE="京都市"><br>      <INPUT TYPE = "submit" VALUE = "検索"><br>      <INPUT TYPE = "reset" VALUE = "Reset">   </FORM><BR><BR>       << address.phtml >>   $conn = pg_Connect ("", "", "", "", "mydb");   $sql = sprintf("select * from address where city='%s'",$_GET["city"]);   $num = pg_NumRows($result);   $i = 0;      echo ("<table border=\"1\">");   while ($i < $num) {     echo("<tr bgcolor=\"#666666\">");     echo ("<td>");     echo (pg_Result($result,$i,"code")." ");     echo("</td>");     echo("<td>");     echo (pg_Result($result,$i,"pref")." ");     echo (pg_Result($result,$i,"city")." ");     echo (pg_Result($result,$i,"town"));     echo("</td>");     $i++;     echo("</tr>\n");     }     echo("</table>"); よろしくお願いします。

  • PHP
  • 回答数2
  • ありがとう数1

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

  • ベストアンサー
  • proust
  • ベストアンサー率57% (62/108)
回答No.2

Fedoraって日本語のデフォルトの文字コードが UTF-8ですよね。 ということはApacheも、rpmで入れていると、 デフォルトでは httpd.confに AddDefaultCharset UTF-8 になってたりしないでしょうか。(先頭に#を入れてみるとか) ほかにもDBの文字コードも気になりますね。 素人といいつつ色々書いてすみません

参考URL:
http://fumika.jp/nikki/2004/02/mt_euc2utf8
abcxyz3000
質問者

お礼

ありがとうございました。 DB/html/phtml・・・全部、UTF-8に統一したら、正常に検索できました。 本当に助かりました。 ただ、今後、文字コードがどのように落ち着くか、ちょっと気になります。

その他の回答 (1)

  • proust
  • ベストアンサー率57% (62/108)
回答No.1

PHP素人ですので、アドバイスだけ・・・ なんとなく文字コードが怪しそうじゃないでしょうか? ・httpレスポンスヘッダ ・HTMLのmetaタグ ・PHPの設定 ・PostgreSQL-PHP間連携関数の設定 など。 phtmlの中で$_GETの代わりに"京都市"みたいな直値を 指定して挙動をみるとかどうでしょうか。 #素人なのでわかりませんが、サンプルコードには #$sqlを渡して$resultを得る関数の記述が抜けていませんか?

参考URL:
http://ml.postgresql.jp/pgsql-jp-old/pgsql-jp/2001May/msg00565.html
abcxyz3000
質問者

補足

こんにちは。 直に、次の通り書いてもダメでした。となると、フォームからのデータが影響しているわけではなさそうです。 困りました。 $sql=sprintf("select * from address where city='京都市'"); #$sqlを渡して$resultを得る関数の記述が抜けていませんか? 800文字に制約されているみたいで、いろいろカットしているうちに間違って消してしまったみたいでした。

関連するQ&A

  • PHP 検索PG

    いつもお世話になっております。 PHP勉強中の初心者です。今回検索PGの作成を試みているのですがうまく検索されません。わかる人がいましたらお力を貸して下さい。 ------------------------------- 環境 レンタルサーバー:カゴヤ PHP 5.2.6 Apache/1.3.41 MySQLバージョン 5.0.33 -------------PHP----------------- <?php $debug = false; //DB接続 require_once("DB.php"); // データベースとの接続情報を記述 //$dsn ="mysql://ユーザー名:pw@localhost/データベース名"; //$db =DB::connect($dsn); if($debug) print_r($HTTP_POST_VARS); //クエリ生成 $query = "SELECT * FROM search "; //検索条件生成 //名前 if(!empty($name)) { $name = addslashes($name); $where = "name = '$name'"; } 住所 if(!empty($address)) { $address = addslashes($address); $where .= "address REGEXP '$address' && "; } //性別 if(!empty($gender)) { $gender = addslashes($gender); $where .= "gender = '$gender' && "; } //スキル if(!empty($skill)) { foreach($skill as $value) { $value = addslashes($value); $temp_where .= "skill REGEXP '$value' || "; } $temp_where = substr($temp_where, 0, -4); $where .= "(". $temp_where. ") && "; } if(!empty($where)) { $where = substr($where, 0, -4); $where = "WHERE " . $where; } $query .= $where; if($debug) { print "<BR><BR>"; print $query; } $result = mysql_query($query); $num_rows = mysql_num_rows($result); if($num_rows == 0) $message = "該当するデータはありませんでした"; else $message = $num_rows . "件ヒットしました"; ?> 検索結果<br> <?=$message?> <table border=1> <tr><td>名前</td><td>住所</td><td>性別</td><td>スキル</td></tr> <? while($row = mysql_fetch_assoc($result)): ?> <tr><td><?=$row[name]?></td><td><?=$row[address]?></td><td><?=$row[gender]?></td><td><?=$row[skill]?></td></tr> <? endwhile; ?> </table> <a href="input.html">再検索</a> ------------------------------- ----------html----------------- <html> <body bgcolor="#FFFFFF" text="#000000"> <form name="" method="POST" action="search.php"> 検索条件を指定してください<br> <table width="500" border="1" cellspacing="1" cellpadding="0"> <tr> <td>名前</td> <td> <input type="text" name="name" size="40" maxlength="255"> </td> </tr> <tr> <td>住所</td> <td> <input type="text" name="address" size="40" maxlength="255"> </td> </tr> <tr> <td>性別</td> <td> <input type="radio" name="gender" value="男性"> 男性  <br> <input type="radio" name="gender" value="女性"> 女性<br> <input type="radio" name="gender" value="その他"> その他</td> </tr> <tr> <td>スキル</td> <td> <input type="checkbox" name="skill[0]" value="ワープロ"> ワープロ<br> <input type="checkbox" name="skill[1]" value="表計算"> 表計算<br> <input type="checkbox" name="skill[2]" value="プログラミング"> プログラミング<br> <input type="checkbox" name="skill[3]" value="営業"> 営業<br> <input type="checkbox" name="skill[4]" value="音楽"> 音楽</td> </tr> </table> <input type="submit" name="submit" value="検索"> <input type="reset" value="条件クリア"> </form> </body> </html> --------------------------------------------------- 名前で検索した際に違う名前でも全件表示されてしまいます。 完全に一致したら表示させたいのですがやりかたがわかりません。 だれかわかるかたいらっしゃいましたらご教授よろしくお願い 致します。

    • 締切済み
    • PHP
  • postgresのsumが表示されない。

    こんにちは postgresで合計値を取得したいのですが、以下のSQL文を書いても表示されません。 商品名|枚数|条件 s_name| clean_how| state あああ|50|0 いいい|50|0 ううう |50|0 あああ|50|0 えええ|100|1 条件は0が出荷中、1が在庫 $query = "SELECT s_name, sum(clean_how) FROM clean GROUP BY s_name "; $result = pg_query($db, $query); if (!$result) {echo "データベースの検索でエラーが発生しました<BR>$input";exit;} $row = pg_num_rows($result); //検索結果の行数を取得 for($i = 0; $i < $row; $i++){ $arr = pg_fetch_assoc($result, $i); //検索結果の一行分を連想配列に格納 extract($arr); echo "<p>商品名${s_name}の合計は${clean_how}枚です。</p>"; } 出荷中のみ表示したいので条件付けも入れたいのですが。そもそも合計値が取得できませんので、是非ご教授下さい。

    • ベストアンサー
    • PHP
  • pearのpagerに関しまして

    pearのpagerを使用してページングの機能を追加しようとしたのですが、 次のような警告がでて、データの出力がされません。 Notice: Undefined variable: res3 in /var/www/html/***.php on line 215 Warning: pg_fetch_result(): supplied argument is not a valid PostgreSQL result resource in /var/www/html/***.php on line 215 for文でsqlを回す際に、適切に変数が入っていないようなのですが、 原因がわかりません。 どなたか分かる方、教えていただけますでしょうか。 よろしくお願いいたします。 #SQLを実行する $res3 = pg_query($dbcon, "SELECT status, city, address, line, station, bus, walk, rent, floor_space, parking, remark FROM estates LEFT OUTER JOIN cities USING (city_id) LEFT OUTER JOIN stations USING (station_id) LEFT OUTER JOIN lines USING (line_id) WHERE prefecture_id = '{$prefecture_id}' and status = '{$status}' and floor_space >= '{$floor_space_lower}' and floor_space <= '{$floor_space_upper}' and rent >= '{$rent_lower}' and rent <= '{$rent_upper}' and parking >= '{$parking_lower}' and parking <= '{$parking_upper}' ORDER BY station_id"); #失敗したとき、どんなSQLが失敗したかをエラーとして出力する if (! $res3) { trigger_error("query fail: ". $sql3); exit; } if (pg_num_rows($res3) == 0) { echo("<tr align = \"center\"><td colspan=\"11\"><br><b>現在、該当する情報はありません。</b><br></td></tr>"); } else { require_once("Pager/Pager.php"); function showPage($start,$cnt){ #SQL実行結果の行数だけ繰り返し for ($i = $start; $i < $start+$cnt; $i++) { #SQL実行結果を取り出して、HTML用にエスケープ処理をする $status = pg_fetch_result($res3, $i, 'status'); $city = pg_fetch_result($res3, $i, 'city'); $address = pg_fetch_result($res3, $i, 'address'); $line = pg_fetch_result($res3, $i, 'line'); $station = pg_fetch_result($res3, $i, 'station'); $bus = pg_fetch_result($res3, $i, 'bus'); $walk = pg_fetch_result($res3, $i, 'walk'); $rent = pg_fetch_result($res3, $i, 'rent')/10000; $floor_space = pg_fetch_result($res3, $i, 'floor_space'); $acreage = pg_fetch_result($res3, $i, 'floor_space')*0.3025; $rent_per_acreage = pg_fetch_result($res3, $i, 'rent')*0.00033/pg_fetch_result($res3, $i, 'floor_space'); $parking = pg_fetch_result($res3, $i, 'parking'); $remark = pg_fetch_result($res3, $i, 'remark'); #取り出したデータを出力する echo("<tr align = \"center\"> <td nowrap>{$status}</td> <td nowrap>{$city}<br>{$address}</td> <td nowrap>{$line}<br>{$station}</td> <td nowrap>{$bus}分<br>{$walk}分</td> <td nowrap>{$rent}万円</td> <td nowrap>{$floor_space}m2<br>{$acreage}坪</td> <td nowrap>{$rent_per_acreage}万円</td> <td nowrap></td> <td nowrap>{$parking}台</td> <td nowrap>{$remark}</td> </tr>"); } } $perPage=15; $params=array( "perPage"=>$perPage, "tatalItems"=>pg_num_rows($res3), "firstPagePre"=>"{", "firstPageText"=>"先頭", "firstPagePost"=>"}", "lastPagePre"=>"{", "lastPageText"=>"先頭", "lastPagePost"=>"}"); $o_page=Pager::factory($params); $navi=$o_page->getLinks(); showPage(($o_page->getCurrentPageID()-1)*$perPage,$perPage); print($navi['all']); }

    • 締切済み
    • PHP
  • ページ間の値の受け渡しについて

    緊急でPHPを用いて開発しなければならず、値の受渡し方法が調べても 結果がうまく出来ないために教えて下さい。 説明がうまくできないので、ソースの一部を下記に記載しております。 【keikaku.php】 <?php $link = DB接続 $query = "SELECT (1) , (2) , (3) FROM KEIKAKU WHERE 営業所= '東京'"; $res_result = mysql_query($query,$link); echo ("<form action='keikaku_input.php' method='POST'>"); while($row = mysql_fetch_array($res_result)){  echo ("<table border=1>");  echo ("<tr>");  echo ("<td><input type='radio' name='name' value=''></td>");  echo ("<td>");  echo $row['(1)'];  echo ("</td><td>");  echo $row['(2)'];  echo ("</td><td>");  echo $row['(3)'];  echo ("</td>");  echo ("</tr>"); } echo ("<input type='submit' value='次へ'>"); echo ("</form>"); ?> というSQLで一覧を表示させて、対象行のラジオボタンが選択されると (1)と(2)の値を使い、【keikaku_input.php】で更に別のSQLを実行後に 結果を表示させる事を行ないたいのです。 【keikaku.php】→【keikaku_input.php】へ(1)と(2)の値を渡したい場合 はどのようにすれば良いかご教授願えませんでしょうか?

    • ベストアンサー
    • PHP
  • POSTを配列として送信し、キーと値を一覧で表示

    formに入力した値をPOSTを配列として送信し、 そのキーと値の一覧表を作ってみようとしたのですが、 思うように動いてくれません。何が間違っているのでしょうか。 <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" /> <title>POSTを配列で送信して取得する</title> </head> <body> <?php if($_SERVER[REQUEST_METHOD]=="POST"){ if(isset($_POST["submit_no"])){ echo "<table border=\"1\"><tr><td>番号</td><td>内用</td><tr>"; while($key_no = key($_POST[no])+1){ //+1は番号を1から表示させるため $values = htmlspecialchars($_POST[no],ENT_QUOTES); echo <<< EOS <tr> <td>$key_no</td> <td>$values</td> </tr> EOS; } echo "</table>"; } } ?> <form action="post_hairetu.php" method="POST" enctype="multipart/form-data"> 1<input type="text" name="no[]" value="" /><br /> 2<input type="text" name="no[]" value="" /><br /> 3<input type="text" name="no[]" value="" /><br /> <input type="submit" name="submit_no" value="送信" /> </form> </body> </html>

    • ベストアンサー
    • PHP
  • phpとmysqlの検索システムを作成しているのですが

    半角英数字で検索すると、ちゃんと検索できるのですが、日本語や全角で検索しようとすると 接続ID=Resource id #2データベースを選択しました Warning: mysql_num_rows(): supplied argument is not a valid MySQL result resource in C:\xampp\htdocs\php.php on line 54 検索結果 該当するデータはありませんでした 名前 メーカー Warning: mysql_fetch_array(): supplied argument is not a valid MySQL result resource in C:\xampp\htdocs\php.php on line 69 と出てしまいます。 phpのソース <html> <head> <title>検索結果</title> <meta http-equiv="Content-Type" content="text/html;charset=eucjp"> </head> <body> <?php $con=mysql_connect("","root",""); if(!$con){ echo ("MYSQL接続に失敗しました"); exit(); } else { echo ("接続ID=$con"); } mysql_query("SET NAMES sjis") or die("can not SET NAMES sjis"); $db=mysql_select_db("a05"); if(!$db) { echo ("データベースを選択できませんでした"); } else{ echo("データベースを選択しました"); } $name=$_POST["name"]; $meka=$_POST["meka"]; $mekanum=array("ミズノ","ヨネックス","ブリヂストン"); $meka=$mekanum[$meka]; $query = "select name,meka from test where"; if($name != "") { $query = $query . " name like '%$name%' "; } if($meka != ""){ $query = $query . " and meka like '%$meka%' "; } $result = mysql_query($query); $num_rows=mysql_num_rows($result); ?> <br>検索結果<br> <?php if($num_rows== 0){ $message="該当するデータはありませんでした"; } else $message=$num_rows ."件ヒットしました"; echo $message; ?> <br><table border=1><tr><td>名前</td><td>メーカー</td></tr><br> <?php while($row = mysql_fetch_array($result)):?> <tr><td><?php echo "$row[name]"; ?></td><td><?php echo "$row[meka]"; ?></td></tr> <? endwhile; ?> </table> <a href="html.html">再検索</a> </body> </html> htmlのソース <html> <head> <title>検索</title> <meta http-equiv="Content-Type" content="text/html;charset=eucjp"> </head> <body> <form method="POST" action="php.php"> <table border> <tr> <td height="30"><font size="5">&nbsp;ラケット名</font> <td height="30">&nbsp;<input type="text" name="name" size="40" maxlength="255"> </td></tr> </table> <table border> <tr> <tr> <td>メーカー</td> <td> <input type="radio" name="meka" value="ミズノ">ミズノ<br> <input type="radio" name="meka" value="ヨネックス">ヨネックス<br> <input type="radio" name="meka" value="ブリヂストン">ブリヂストン<br> <br> </td> </tr> </table> </SELECT> </td> </table> <input type="submit" name="submit" value="検索"> <input type="reset" value="条件クリア"> </tb> </body> </html> 分かる方がいたら教えていただきたいです、助言や指摘などありましたら、よろしくお願いします。

  • データ検索のエラーについて

    http://oshiete1.goo.ne.jp/qa3583661.htmlの質問の続きなのですが、条件分岐による検索のプログラムを書きたいのですが、 Parse error: syntax error, unexpected T_ENCAPSED_AND_WHITESPACE, expecting T_STRING or T_VARIABLE or T_NUM_STRING in C:\xampp\htdocs\iiko.php on line 61 というエラーが起こってしまいました。 いろいろとPHPのサイトを見て回って考えたのですが、解決策がわかりません。 フォームの構造は <html> <head> <title>abcde</title> </head> <body> <FONT size="4">abcde</FONT> <form action="iiko.php" method="post"> a<br> <br> ある<INPUT type="radio" name="a" value="ある"><br> ない<INPUT type="radio" name="a" value="ない"><br> <br> b<br> <br> ある<INPUT type="radio" name="b" value="ある"><br> 少しある<INPUT type="radio" name="b" value="すこしある"><br> ない<INPUT type="radio" name="b" value="ない"><br> <br> c<BR> ある<INPUT type="radio" name="c" value="ある"><BR> ない<INPUT type="radio" name="c" value="ない"><BR> <BR> d<br> ある<INPUT type="radio" name="d" value="ある"><br> ない<INPUT type="radio" name="d" value="ない"><br> <br> e<br> ある<INPUT type="radio" name="e" value="ある"><br> ない<INPUT type="radio" name="e" value="ない"><br> <br> <input type="submit" name="bottun1" value="送信"> </form> </body> </html> 検索リストのiiko.phpは、条件を選択すれば、デーブルのデータのID2~4番の人を表示させ様としています。 <html> <body> <?php $a_1 = $_POST["a"]; $b_1 = $_POST["b"]; $c_1 = $_POST["c"]; $d_1 = $_POST["d"]; $e_1 = $_POST["e"]; require_once("DB.php"); $dbUser = "sample"; $dbPass = "password"; $dbHost = "localhost"; $dbName = "sampledb"; $dbType = "mysql"; $dsn = "$dbType://$dbUser:$dbPass@$dbHost/$dbName"; $conn = DB::connect($dsn); //接続にしっぱいしたらメッセージを表示して終了します。 if (DB::isError($conn)) { die($conn->getMessage()); } $sql = <<<EOS SELECT * FROM member if($a_1 == "ある"and $b_1 == "ある"and $c_1 == "ない"and $d_1 == "ある" $e_1== "ある") { $sql = $sql . " WHERE id BETWEEN 2 AND 4;"; } $result = $conn->query($sql); if (DB::isError($result)) { die($result->getMessage()); } $count = $result->numRows(); print "検索結果は".$count."件です。<BR>"; if($count>0){ ?> <TABLE width="450" border="1" cellspacing="0" cellpadding="8"> <TBODY> <TR><TH>番号</TH><TH>氏</TH><TH>名</TH><TH>年齢</TH></TR> <?php while($rs = $result->fetchRow(DB_FETCHMODE_ASSOC)) { ?> <TR><TD align="center"><?=$rs['id']?></TD> <TD><?=$rs['last_name']?></TD> <TD><?=$rs['first_name']?></TD> <TD align="center"><?=$rs['age']?></TD></TR> <?php } ?> </TBODY></TABLE> <?php } $result->free(); $conn->disconnect(); ?> </body> </html> です。 解決策を教えて下さい。 よろしくお願いします。

    • ベストアンサー
    • PHP
  • 親ウィンドウに値が戻らない

    親ウィンドウから、子ウィンドウを開き、ラジオボタンで、選択された部分のコードを親ウィンドウにセットしたいのですが、決定ボタンを押しても、値が戻りません。JavaScript部分で、親ウィンドウの項目に値を代入 しているつもりなのですが・・・・。 <?php $tokum = ""; /* 得意先マスターの値をもらう配列 */ /* 初期画面の表示 */ $sql = "select * from tokump00 order by tatkcd asc limit 0,15"; $result = mysql_query($sql,$con); $num = mysql_num_rows($result); ?> <script type="text/javascript"> <!-- function ReturnCode() { for($i=0;$i<15;$i++) if(document.gamen.code.checked) window.opener.document.syoukai.tkcd.value=document.gamen.code.value; } --> </script> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=Shift_JIS"> <title>得意先コード検索</title> </head> <body bgcolor="#FFEEFF"> <form name="gamen" action="codekensaku.php" method="post"> <input type="button" value="決定" onClick="ReturnCode()"><br><br> <table border="1"> <tr> <th>チェック</th> <th>コード</th> </tr> <?php for($i=1;$i<16;$i++) { $tokum = mysql_fetch_array($result); ?> <tr> <td><input type="radio" name="code" value="<?php echo($tokum[tatkcd]); ?>"> <td><?php echo($tokum[tatkcd]); ?></td> </tr> <?php } ?> </table> </form> </body> </html>

  • postのタイムラグ

    以下のソースでPOSTの値が取れないときがあるので困っています。 具体的にはページを表示してから30秒程度待ってからの クリックじゃないとPOSTの値が取れません。 GETの場合はページ表示後すぐにボタンをクリックしても大丈夫でした。 原因が分からず途方に暮れています。 お知恵をお貸しください。 PHP Version 5.2.3 <?php $P_data = $_POST["pg"]; print("POST=>".$P_data."<BR>"); $G_data = $_GET["pg"]; print("GET=>".$G_data."<BR>"); print <<< DOC_END <html> <head> </head> <body> DOC_END; echo"<form action=test.php method=post>"; echo"<input type=hidden name=pg value=1>"; echo"<input type=submit value=あ>"; echo"</form>"; echo"<form action=test.php method=post>"; echo"<input type=hidden name=pg value=2>"; echo"<input type=submit value=い>"; echo"</form>"; echo"<form action=test.php>"; echo"<input type=hidden name=pg value=3>"; echo"<input type=submit value=う>"; echo"</form>"; echo"<form action=test.php>"; echo"<input type=hidden name=pg value=4>"; echo"<input type=submit value=え>"; echo"</form>"; print <<< END </body> </html> END; ?>

    • 締切済み
    • PHP
  • phpでのアンケート編集

    社員旅行のアンケート編集のphpです。 (???)のところがどうしてもわからなくて上手く動きません。 どなたか回答お願いします。 <?php session_start(); ?> <html> <head> <body> <font size=5><b>社員旅行アンケート集計</b></font><br><br> <?php $db = mysql_connect("localhost","",""); mysql_select_db("syain_db"); $query = "SELECT * FROM trvl_t"; $result = mysql_query($query); if(mysql_num_rows($result) == 0) print"<br>無し"; else{ for($i = 0;$i <4;$i++) $cnt[$i] = 0; while($row = mysql_fetch_array($result))(???) mysql_close($db); echo "<table border =1>"; echo "<tr><td>旅行先</td><td>希望者数</td></tr>"; for($i=0;$i<4;$i++){ echo "<tr align=center>"; if($i == 0) echo "<td>北海道</td>"; elseif($i == 1) echo"<td>沖縄</td>"; elseif($i == 2) echo"<td>韓国</td>"; elseif($i == 3) echo"<td>香港</td>"; echo "<td>".(???)."</td>"; echo"</tr>"; } echo "</table>"; } ?>

    • ベストアンサー
    • PHP

専門家に質問してみよう