- 締切済み
php,postgreSQLについて
こんにちわ。初めて投稿します。よろしくお願いします。 現在、postgreSQLで作ったテーブルのデータをつくり、検索フォームで指定した条件(この場合はお店のコード) を、指定先のページに表示させたいのです。 SQLに直接、表示させたいコード番号を入力すれば出るのですが、フォームに入力された値を変数として格納し、SQL文の中に自動にあてはめる方法がわかりません・・。 どうかよろしくお願いします。 phpは4.1です。inp_store_cdは検索フォ-ムでのinput名です。 *表示画面 <?php $conn = pg_connect ("host=localhost port= 5432 dbname=test ); if ($conn == false) { print("データベースに接続できませんでした。"); exit; } $sql = "select * from store_basic where store_cd=$_POST["inp_store_cd"]"; if (!empty($inp_store_cd)) { $sql = $sql. "and sotre_cd =" .$_POST["inp_store_cd"]; } $result = pg_exec($sql); // selectを実行 if ($result == false) { printf("SQL:\"$sql\"の実行に失敗しました。"); exit; } $rows = pg_numrows($result); // 行数を取得 $columns = pg_numfields($result); // 列数を取得 print("<table border>\n"); for ($j = 0;$j < $rows;$j++) { if ($j == 0) { print("<tr>"); for ($i = 0;$i < $columns;$i++) { $str = pg_fieldname($result,$i); // 列名の取り出し print("<th>$str</th>"); } print("</tr>\n"); } print("<tr>"); for ($i = 0;$i < $columns;$i++) { $str = pg_result($result,$j,$i); // データの取り出し print("<td>$str</td>"); } print("</tr>\n"); } pg_freeresult($result); // 検索結果の解放 print("</table>\n"); ?>
- みんなの回答 (4)
- 専門家の回答
みんなの回答
- arisa5
- ベストアンサー率54% (6/11)
コンボボックスというのは、選択できるボックスですよね? それでしたら、HTML側の<form ~>から</form>の間 <input type=submit ~>の直前に <input type="text" name="inp_store_name" size=12><br> <select name="inp_store_area"> <option value="エリア1">エリア1 <option value="エリア2">エリア2 <option value="エリア3">エリア3 |(エリアの記述) </select><br> を追加して、PHP側では $in_code = $_POST['inp_store_cd']; と同じように $in_name = $_POST['inp_store_name']; $in_area = $_POST['inp_store_area']; を追加して、 if(empty($in_cord) and enpty($in_name) and enpty($in_area)) { exit; //3つとも空の時はぬける } $sw = 0; $sql = "select * from store_basic where"; if(!empty($in_cord)){ $sql .= " store_cd='$in_cord'"; $sw = 1; } if(!empty($in_name)){ if($sw=1){ //cd が指定されている時、and で繋ぐ $sql .= " and"; } $sql .= " store_name='$in_name'"; $sw = 1; } if(!empty($in_area)){ if($sw=1){ //cd または name が指定されている時、and で繋ぐ $sql .= " and"; } $sql .= " store_area='$in_area'"; } //以下、DBの検索 ".="イコールの前のピリオドが見ずらいと思いますが、ピリオドは必要です。 ちょっと長ったらしいですが、ひとつひとつの値を確認して、 sql文を作ったほうが手堅いと思います。 試してみてください。
- arisa5
- ベストアンサー率54% (6/11)
あわてて書いたので、ミスがありました。大変申し訳ありません。 もう一度、HTMLのほうから <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=EUC-JP"> </head> <body> <form name="get_cord" action="disp.php" method="POST"> <input type="text" name="inp_store_cd" size=4> <input type=SUBMIT value="送信"> <input type=reset value="リセット"> </form> </body> </html> disp.phpのプログラム <html><head> <meta http-equiv="Content-Type" content="text/html; charset=EUC-JP"> </head><body> <?php $in_code = $_POST['inp_store_cd']; if (isset($in_code)) { $conn = pg_connect ("host=localhost port= 5432 dbname=test"); if ($conn == false) { print("データベースに接続できませんでした。"); exit; } $sql = "select * from store_basic where store_cd=$in_cord"; $result = pg_exec($sql); // selectを実行 if ($result == false) { printf("SQL:\"$sql\"の実行に失敗しました。"); exit; } $rows = pg_numrows($result); // 行数を取得 $columns = pg_numfields($result); // 列数を取得 print("<table border>\n"); for ($j = 0;$j < $rows;$j++) { if ($j == 0) { print("<tr>"); for ($i = 0;$i < $columns;$i++) { $str = pg_fieldname($result,$i); // 列名の取り出し print("<th>$str</th>"); } print("</tr>\n"); } print("<tr>"); for ($i = 0;$i < $columns;$i++) { $str = pg_result($result,$j,$i); // データの取り出し print("<td>$str</td>"); } print("</tr>\n"); } pg_freeresult($result); // 検索結果の解放 print("</table>\n"); } ?> </body></html> うまくいかない場合は、また補足などに記入してください。
- arisa5
- ベストアンサー率54% (6/11)
#1です。 $sql = "select * from store_basic where store_cd=$in_cord; の行は、"を付け忘れました。 $sql = "select * from store_basic where store_cd=$in_cord"; です。それと、 >if (!empty($inp_store_cd)) >{ >$sql = $sql. "and sotre_cd =" .$_POST["inp_store_cd"]; >} は必要ないかと思います。
お礼
回答ありがとうございます。 if~の文は、テキストボックスに入力されていた場合に 検索するといったことを行いたかったのですが、うまくいかないみたいです。。 何か良い書き方はあるのですか?
- arisa5
- ベストアンサー率54% (6/11)
プログラムを2本に分けたほうがわかりやすいと思います。 1本目はコードをフォームで入力します。(HTML形式でOK) <html><head> <META http-equiv=Content-Type content="text/html; charset=EUC-JP"> <form name="get_cord" action="disp.php" method=POST> <input type=text name=inp_store_cd size=4> <input type=submit value=送信> <input type=reset value=リセット> </form> </body></html> 2本目(仮名:disp.php)で、DBを検索して表示させます。 そのコーディングは、すでにmmngaさんの書いた通りでいいと思います。 変更する点としては、 >$sql = "select * from store_basic where store_cd=$_POST["inp_store_cd"]"; の前に、 $in_cord=$_POST["inp_store_cd"]; を追加して、 $sql = "select * from store_basic where store_cd=$in_cord; とすればうまくいくと思います。
お礼
回答ありがとうございます。 さっそく2つにわけてやりましたがParse error: parse error, unexpected T_STRING というエラーが★印のところで出てしまいます。ソースは以下の通りです。 すみませんが、ご教授ください。 $conn = pg_connect ("host=localhost port= 5432 dbname=test"); if ($conn == false) { print("データベースに接続できませんでした。"); exit; } $in_cord=$_POST["inp_store_cd"]; $sql = "select * from store_basic where store_cd=$in_cord; $result = pg_exec($sql); // selectを実行 if ($result == false) { ★printf("SQL:\"$sql\"の実行に失敗しました。"); exit; } $rows = pg_numrows($result); // 行数を取得 $columns = pg_numfields($result); // 列数を取得 print("<table border>\n"); for ($j = 0;$j < $rows;$j++) { if ($j == 0) { print("<tr>"); for ($i = 0;$i < $columns;$i++) { $str = pg_fieldname($result,$i); // 列名の取り出し print("<th>$str</th>"); } print("</tr>\n"); } print("<tr>"); for ($i = 0;$i < $columns;$i++) { $str = pg_result($result,$j,$i); // データの取り出し print("<td>$str</td>"); } print("</tr>\n"); } pg_freeresult($result); // 検索結果の解放 print("</table>\n"); ?>
補足
arisa5さん、お手数かけてもうしわけありません。 先ほどの件ですが、 $sql = "select * from store_basic"; $in_cord=$_POST["inp_store_cd"]; if(!empty($in_cord)){ $sql = $sql." where store_cd='$in_cord'"; } と、したところ、値が取得できました、 本当にありがとうございました。 if文を使っているのにはわけがありまして、検索する条件が store_cd の他に、store_name (店の名前),area (エリア),などがありまして、値が入っているもののみを条件にしたいからです。 ただ、1つだけの条件ならうまくいくのですが、2つ以上の条件を入れると、うまく反映できません。 おそらく同じようにして、sql文のところに複数の変数をあてはめればいいと思うのですが・・・・ よろしければこちらの方のご教授ください。 ちなみに area はコンボボックスです。 よろしくお願いいたします。