PHPの複数条件検索フォームのエラーについて

このQ&Aのポイント
  • PHPの複数条件検索フォームでエラーが発生しています。回答者のコードを参考にしていますが、カッコの数がおかしいためエラーが出ています。
  • id名と商品名のどちらかまたは両方を入力すると、DBから検索して結果を表示するという目的です。
  • エラーの原因を特定するために、19行目前後を確認しましたが、おかしな部分は見当たりません。
回答を見る
  • ベストアンサー

PHPの複数条件検索フォーム

http://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q1134440526 の回答者の方のコードを参考にしたのですが、下記の通りにすると Parse error: syntax error, unexpected '{' in C:\Program Files\Apache\Apache24\htdocs\sample\kensaku20.php on line 19 と出ます、カッコの数がおかしいのでしょうか? 19行目前後を見てもおかしな所はないと思われるのです(秀丸を使っていてカーソルを合わせると色が変わる部分を見ました) やりたいこととしてはid名か商品名のどちらか・或いは両方とも入力したらDBより検索、表示させる事です。 HTML部 <form action ="http://localhost/sample/kensaku20.php" method="post"> id名:<input type="text" name="id"> 商品名:<input type="text" name="name"> <input type="submit" name="exec" value="検索"> </form> php部 中略 $ary_whr = array(); $ary_dat = array(); if (!empty($_POST['exec'])) __{ $ary_whr[] = 'name LIKE ? '; $ary_dat[] = '%'.$_POST['exec'].'%';} if (!empty($_POST['id'])) __{ $ary_whr[] = 'id LIKE ? '; $ary_dat[] = '%'.$_POST['id'].'%';} if (!empty($_POST['name'])) __{ $ary_whr[] = 'name LIKE ? '; $ary_dat[] = '%'.$_POST['name'].'%';} $where = ' WHERE ' . implode(' AND ', $ary_whr); 中略

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

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

  • ベストアンサー
  • t_ohta
  • ベストアンサー率38% (5071/13248)
回答No.7

> 同じエラーが出ています。どこがおかしいのでしょうか? ダンプしたSQL文やログに出ているエラーメッセージを確認されましたか? or exit() でエラーが出た際にプログラムを終わらせていますが、これだと画面にPHPが吐いたエラーメッセージが表示されませんが、ログファイルにはエラーメッセージが出ているはずなので確認しましょう。 DBの処理周りをデバッグする際は、ダンプしたSQL文をDBのコマンドラインで実行してみて目的の結果が得られるか確認しましょう。 コマンドラインで実行して目的の結果が得られなければSQL文が悪いですし、目的の結果が得られたらプログラムが悪いと言う事です。 また、本やホームページのコードを参考にする際は説明を細かく読みましょう。 参考にされた知恵袋の回答者は「プリペアド・ステートメント」を使った方法だと書いています。(ダンプしたSQL文は「・・・ like ? 」と言った感じで条件が書かれているはずの部分が ? になっているはずです) POSTされて来た値をSQL文に組み込む際にそのままの値を使うとSQLインジェクションの原因になるので、対策として値を全てエスケープ処理するかプリペアド・ステートメントを利用するのが正しい処理です。 値を全てエスケープ処理する場合、プログラムの変更・修正等で漏れる危険性があるのでプリペアド・ステートメントを使う方がいいかと思います。 mysqli_query() はプリペアド・ステートメント処理を行わないクエリー実行方法なので、プリペアド・ステートメントを利用した方法に修正しないとクエリーを実行出来ないと思います。 http://php.net/manual/ja/mysqli.prepare.php

KAIJI-000
質問者

お礼

何度も回答有難うございました。

KAIJI-000
質問者

補足

PODに関しては話が大きくなりそうなので、改めて別の機会にさせていただきます。

その他の回答 (6)

  • t_ohta
  • ベストアンサー率38% (5071/13248)
回答No.6

> そのページのやり方は根本的に間違っているという事ですか? 参考にされたと言う知恵袋のページでは $sql = "SELECT * FROM xxxDB ".$where; という行がプログラムの中にあるので、これで SELECT 部分と WHERE 部分を結合してSQL文を完成させています。 写す際に必要な部分が抜け落ちていたと言う事じゃないですか。 > という文字数はスペースを含めて、引用符を抜いたら31文字ではありませんか? WHEREの前にスペースが1文字、最後の?の後にもスペースが1文字、全て合わせれば34文字あります。

KAIJI-000
質問者

補足

本当に何度もすいません。今度こそ行けると思ったのですが、 $where = ' WHERE ' . implode(' AND ', $ary_whr); $sql = "SELECT * FROM 自分の作ったテーブル名".$where; var_dump($sql); $result=mysqli_query($conn,$sql) or exit("データの抽出に失敗しました。"); としても同じエラーが出ています。どこがおかしいのでしょうか?

  • t_ohta
  • ベストアンサー率38% (5071/13248)
回答No.5

> string型の34文字? という意味ですか? そうです。 変数の中身は文字列で34文字、" WHERE exec LIKE ? AND id LIKE ? " という文字列が入っていたと言う事です。 DB検索をするSQL文の文法としては「SELECT」で始まり、抽出するカラム名、「FROM」に続いてテーブル名、そして「WHERE」に続いて検索条件が書かれていなければいけません。 しかし、ダンプした変数の中身には「SELECT * FROM hoge」と言うSQL文として必要な要素が全く入っていませんので、DBはSQL文の構文エラーと判断し何も検索してくれません。 なので、「データの抽出に失敗しました。」という結果になります。 正しいSQL文を記述するようにしましょう。

KAIJI-000
質問者

補足

SELECT文のやり方は知っていたので、すでに成功していたんですが、他の事を調べているうちにそのページを見つけたので、こういうやり方もあったのかと思っていたのですが、そのページのやり方は根本的に間違っているという事ですか? 近いやり方は無いですか? あまり手間がかかるようでしたら、もしどこかで近いやり方が載っているページをご存知なら教えてください。 ※すみません、 WHERE exec LIKE ? AND id LIKE ? という文字数はスペースを含めて、引用符を抜いたら31文字ではありませんか? 引用符を入れたら33文字

  • t_ohta
  • ベストアンサー率38% (5071/13248)
回答No.4

> ただ、修正した所今度はデータの抽出に失敗しました。と出てしまってます。$where辺りがおかしいんでしょうか? mysqli_query を実行する直前で var_dump($where); をやってみて下さい。 SQL文が間違っている事が判るかと思います。

KAIJI-000
質問者

補足

何度もレス有難うございます。 再度修正した所、 string(34) " WHERE exec LIKE ? AND id LIKE ? " データの抽出に失敗しました。 と出てしまい、少し調べたのですが、探し方が悪いのかあまりいい情報無くてアドバイスよろしくお願いします。 string型の34文字? という意味ですか?

  • t_ohta
  • ベストアンサー率38% (5071/13248)
回答No.3

> すみません、結構探したつもりですが・・・ もしかして、19行目の { の前のアンダースコアもそのままプログラムに書いていたりしませんか? 参考にされた知恵袋のページで書かれているアンダースコアは、インデントにスペースやタブを入れても表示されなくなるから、見やすくするためにスペースの代わりに書かれているモノですから、スペースに置き換えましょう。

KAIJI-000
質問者

補足

ご回答有難うございました。 1つ勉強になりました。 ただ、修正した所今度は データの抽出に失敗しました。 と出てしまってます。$where辺りがおかしいんでしょうか?

  • t_ohta
  • ベストアンサー率38% (5071/13248)
回答No.2

> この質問の前にも'{'を検索してみましたが、再度確かめました。それでもやはり余計なかっこは無いです。 { の数だけが問題とは限りません。 " や ; の位置、数が問題で { や } が本来狙った意味で解釈されていないと言った事もあります。 どうしても見つけられなければ、kensaku20.phpを途中省略せず丸っと補足に貼り付けて下さい。

KAIJI-000
質問者

補足

すみません、結構探したつもりですが・・・ ※mysqli_connectのパスなどは割愛させてもらってます。 DBへの接続は前回の質問にて解決いたしました。 <!doctype html> <html> <head> <meta charset="utf-8"> <title>複数検索のフォーム</title> </head> <body> <?php $conn=mysqli_connect('省略','省略','省略') or exit("MySQLへ接続できません。"); line_select_db($conn,'uriage') or exit("データベース名が間違っています。"); $ary_whr = array(); $ary_dat = array(); if (!empty($_POST['exec'])) __{ $ary_whr[] = 'name LIKE ? '; $ary_dat[] = '%'.$_POST['exec'].'%';} if (!empty($_POST['id'])) __{ $ary_whr[] = 'id LIKE ? '; $ary_dat[] = '%'.$_POST['id'].'%';} if (!empty($_POST['name'])) __{ $ary_whr[] = 'name LIKE ? '; $ary_dat[] = '%'.$_POST['name'].'%';} $where = ' WHERE ' . implode(' AND ', $ary_whr); $result=mysqli_query($conn,$where) or exit("データの抽出に失敗しました。"); ?> <table border="1"> <tr> <th>id</th><th>userName</th> <?php while($userid=mysqli_fetch_array($result,MYSQL_ASSOC)){ ?> <tr> <td><?= $userid['id'] ?></td><td><?= $userid['name'] ?></td> </tr> <?php } mysqli_close($conn); ?> </table> </body> </html>

  • t_ohta
  • ベストアンサー率38% (5071/13248)
回答No.1

> Parse error: syntax error, unexpected '{' これはカッコの数が合ってないと言う事ですね。 このエラーの場合、19行目でエラーが出るのは19行目に至った時点で辻褄が合わないと言う事なので、それ以前の行に問題がある事が多いです。

KAIJI-000
質問者

補足

この質問の前にも'{'を検索してみましたが、再度確かめました。それでもやはり余計なかっこは無いです。

関連するQ&A

  • phpでDBを検索したい

    最近PHP+mysqlの勉強を始めて、入門書片手に試行錯誤している状況です。 phpで検索ボックスを作って、データベースから名前を引っ張ってきたいのですが、うまくいきません… 因みに同じページに表示したいと思っています。 あと、多分使っている関数が古いとは思いますが、PDOやmysqliとかにすると今より更に知識不足でエラーになってしまうので、とりあえず古いままで使っていますが気にしないでください… データベース名:mydb テーブル名:table id | name | ---+------------+-- 1 | 名前太郎 | 2 | 氏名太郎 | 3 | 名字一郎 | 4 | 名前五郎 | 5 | 氏名花子 | こういうテーブルがあったとして、 名前 というキーワードで検索したときに、セレクトボックスに 名前太郎と名前五郎の2つが表示できたらと思っています。 根本的に間違っているのかもしれませんが、どのように変えればいいのかご教示いただけると幸いです。 何卒よろしくお願い致します。 <?php ちょっとした別の処理~省略 print <<<_FORM_ <label for="name_search">名前検索</label> <form action="" method="post"> <input name="u_name" type="text" id="u_namae" value="" /> <input type="submit"> </form> _FORM_; if (isset($_POST['u_name'])){ $kensaku = htmlspecialchars($_POST['u_name']); $kensaku = "'%". $kensaku ."%'"; require_once('dbconnect.php'); $sql = sprintf("SELECT * FROM table WHERE name LIKE $kensaku "); $recordSet = mysql_query($sql); print <<<_FORM_ <select name="u_name"> _FORM_; while ($kekka = mysql_fetch_assoc($recordSet)) { $val=htmlspecialchars($kekka['name']); ?> <option value="<?php print(htmlspecialchars($kekka['id'])); ?>"> <?php print(htmlspecialchars($kekka['name'])); ?> </option> <?php } print <<<_FORM_ </select> _FORM_; } ?>

    • 締切済み
    • PHP
  • 【PHP】複数語検索について

    お世話になります。 PHPにて複数語検索を行いたいのですが、うまく検索できずに困っています。 テーブル名はinformation、 レコード名はnameとして、スペース区切りで検索します。 $st = $db->prepare("SELECT * FROM information"); $where = array(); if($arr['name']){ $name_ary = explode(" ", $name); $name_count = count($name_ary); $where = ""; for( $i = 0; $i < $name_count; $i++ ){ if( $i != 0 ){ $where = ($where . " or"); } $where = $where . " name LIKE '%{$name_ary[$i]}%'"; } } $query= sprintf("SELECT * FROM information WHERE $where"); $st = $db->prepare($query); どなたかご教授いただけないでしょうか? 他の質問など見て真似たり、下記サイトを参考にしたりしているのですが、 うまくいかず困っております。 http://blog.olivesystem.com/824.html 何卒宜しくお願い致します。

    • 締切済み
    • PHP
  • PHPのフォームの複数選択で。。。

    すいません当方PHPかなりの初心者で。。。。 入力→確認→送信のような流れのフォームを作成しているのですが。。。 メールフォームで複数選択が可能な場合フォームの受け取り側のPHPはどのように記載すればいいのでしょうか? □A □B □C □D □E □F ↑のようなフォームを作りチェックされたものを 【フォーム側】 <input type="checkbox" value="A" name="is[]">A <input type="checkbox" value="B" name="is[]">B <input type="checkbox" value="C" name="is[]">C <input type="checkbox" value="D" name="is[]">D <input type="checkbox" value="E" name="is[]">E <input type="checkbox" value="F" name="is[]">F 【確認画面のPHP】 // フォームの値を取得します。 if ($_SERVER["REQUEST_METHOD"] == "POST") { foreach($_POST as $k => $v){ // 「magic_quotes_gpc = On」のときはエスケープ解除 if (get_magic_quotes_gpc()) { $v = stripslashes($v); } $v = htmlspecialchars($v); $$k = $v; } } else { exit(); } //中略// // 確認画面表示箇所 <? $is_value = $_POST["is"]; foreach($is_value as $v){ echo $v ." <br> "; } ?> //中略// // 送信PHPへの受け渡し場所 <input type="hidden" name="service" value="<?= $is_value ?>"> ↑この部分の記載の仕方がわかりません。。。 確認画面で表示させたものを関数に格納して送信PHPの方に受け渡ししたいのですが。。。 どのようにどのあたりに記載したらいいのでしょうか? わかりにくい質問かもしれません。。。 なにとぞなにかお気づきの点がありましたらご教授ねがえると助かります。。。 よろしくお願いします。

    • 締切済み
    • PHP
  • PHPでの検索機能がうまく動きません

    PHPでの検索機能が動かなくて困っています。 <form>で入力した値を、MySQLのWHEREで条件付けて取り出したいのですがうまくいきません....。 最終的に、 1、formに検索ワードを入力 2、DBから条件にあったレコードを持ってくる 3、持ってきた値を表示 という機能にしたいのですが....。 --- --- --- --- --- --- --- --- --- --- --- --- <?php //データベースに接続 mysql_connect('xxx', 'xxx', 'xxx') or die(mysql_error()); mysql_select_db('xxx'); mysql_query('SET NAMES UTF8'); //フォームで送られてきた条件を元にSELECT文を作成 if (!empty($_POST['nm'])) { $q = $_POST['nm']; $sql = 'select * from test_tb where name like "%$q%"'; $record = mysql_query($sql) or die(mysql_error()); } ?> <html> <body> <form action="" method="post">    名前:<input type="text" name="nm">    <input type="submit" name="exec" value="検索"> </form> <?php while($row = mysql_fetch_assoc($record)): ?> <?php echo $row['id']; ?> <?php echo $row['name']; ?> <?php endwhile ?> </body> </html> --- --- --- --- --- --- --- --- --- --- --- --- エラーは表示されないのですが、結果も表示されません。 さまざまなサイトや他の方の質問、MySQLやPHPの本を参考にしたのですが うまくいかなかったのでご質問させていただきました。 プログラミング初心者の上、はじめての質問で不備があると思いますが、 どうぞよろしくお願いいたします。

    • ベストアンサー
    • PHP
  • <?php

    <?php if(isset($_POST['name'])){ $name = htmlspecialchars($_POST['name']); if (empty($name)) { $message = '未入力があります'; } } if(isset($_POST['regist'])) { $regist = htmlspecialchars($_POST['regist']); if($message) { header('Location:regist2.php'); } } ?> <html> <form action="regist2.php" name="form" method="post"> <div align=left> 名前<input type="text" name="name" maxlength="16" istyle="1" format="M" mode="hiragana" style="-wap-input-format:&quot;*&lt;ja:h&gt;&quot;; -wap-input-format:*M;" /><br /> <input type="submit" name="regist" value="送信" /> </form> と携帯サイトを作成してるのですが、空白でもそのままregist2にいってしまい困っております。 空白の場合はsubmit押してもエラーを表示させたいのです 問題がなければ、そのままregist2.phpへいかせる方法はないでしょうか? ご教授お願い致します。

    • 締切済み
    • PHP
  • LIKE述語/SQLとPHPを使った検索フォーム

    SQLを使って、「名前」(カラム名=name)と「コメント」(カラム名=comment)のテーブルを作りました。 このテーブルに対して、検索フォームを作りました。 このフォームに名前を入力すると、該当する行が検索されるようにしました。 ◆入力フォーム form.php <form action = "kensaku.php" method="post"> 名前:<input type="text" name="name"> <input type="submit" name="submit" value="検索"> </form> ◆検索結果 search.php <?php function connect() { return new PDO("mysql:dbname=★;host=★","★","★", array( PDO::MYSQL_ATTR_INIT_COMMAND => "SET CHARACTER SET `utf8`")); } $pdo = connect(); $st = $pdo->query("SELECT * FROM table WHERE name='" . $_POST["name"] . "' "); $address = $st->fetchAll(); ?> <?php foreach ($table as $g) { ?> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <meta name="GENERATOR" content="IBM WebSphere Studio Homepage Builder Version 14.0.8.0 for Windows"> <p>名前<?php echo $g['name'] ?></p> <p>コメント<?php echo $g['comment'] ?></p> <?php } ?> ここで、該当する文言の一部でも検索できるようにしたいです。 ※例えば、「山田太郎」を検索する場合に「山」だけでも検索できるように。 LIKEを使えばよいかと思い、 $st = $pdo->query("SELECT * FROM table WHERE name='" . $_POST["name"] . "' ");を $st = $pdo->query("SELECT * FROM table WHERE name LIKE='%" . $_POST["name"] . "%' "); と、記述してみましたがだめでした。 どのように記述すればよいか教えていただけないでしょうか。 何卒お願いします。

    • ベストアンサー
    • MySQL
  • 複数条件での検索について教えてください

    PHPとMySQLで構築するという内容の参考書2冊を読んだ程度の知識レベルです。しばらくPHPと離れていたので、さらに退化しているかもしれません。。。 環境はWindowsXP、PHP4.3.2.2です。 ぜひ、皆さんの知恵をお借りできればと思い、質問をさせていただきます。 DBには  発売日(outday) お菓子名(name) 発売店(shop) などが入っております。 発売日やお菓子名、発売店など1つ~3つの条件で検索することが目的です。 例えば、お菓子名のみの検索をしようとして、 HTMLフォーム <INPUT size="44" type="text" name="name" maxlength="100"> ↑に検索したいお菓子名を記入して、 $sql="select * from okashi where (name like '%$name%') order by outday; ↑でnameのデータを受けとって、欲しいお菓子データを取り出すことはできたのですが、 ↓のように <INPUT size="44" type="text" name="shop" maxlength="100">; <INPUT size="44" type="text" name="name" maxlength="100">; フォームを2つ作り $sql = "select * from okashi where (shop like '$%shop%') and (name like '%$name%')by outday; ↑のように2つ以上の検索条件が重なると、 「0件」みつかりました。と検索が出来なくなってしまいます。 検索条件は、検索項目が1つでも2つでも同じ同一です。   本に書いてあるまま、名前を換えて動かしているつもりなのですが、 どこが間違っているか本当に分かりません。 文字制限で全体を載せることができず、はしょってしまいましたが、 わからない点がありましたらおっしゃってください。 お忙しい中恐れ入りますが、ぜひ皆さんのお知恵をお借りしたいのです。 よろしくお願いします。

    • ベストアンサー
    • PHP
  • PHPで検索画面を作成していますが上手に動きません

    PHP超!初心者です。よろしくお願いいたします。 行いたい事は、 HTML上にあるドロップダウンリストから項目を選択し実行すると、一致する項目をPHPMysql DBより抽出し表形式で表示したい。です。 PHPmysql→ ユーザー名:user パスワード:passwd データベース名:dbnameテーブル名:table_nm 検索画面→kensaku.html 検索結果→kensaku.php ●kensaku.html <html> <head> <title>検索</title> </head> <body> <br> <h1>種類</h1> <br> <form action = "http://localhost/lesson/kensaku.php" method="POST"> <p> 種類:<br /> <select name="betu" style="width:200" id="search_process"> <option value="" selected="selected">一覧から選択</option> <option value="あ">あ</option> <option value="い">い</option> <option value="う">う</option> <option value="え">え</option> <option value="お">お</option> </select></p> <p>    <input type="submit" name="exec" value="検索"> </form> </body> </html> ●kensaku.php <html> <body> <? if (!$con = mysql_connect("localhost", "user", "passwd")) {    print "接続エラー" ;    exit ; } mysql_select_db("dbname", $con) $sql = "select sid, name, price, betu, area, memo from table_nm" ; $sql . = "where betu like '$betu'" ; if (!$res = mysql_query($sql)) {    print "SQLエラー<BR>" ;    exit } <table border=1> <tr> <th>NO</th><th>名前</th><th>金額</th><th>種別</th> /tr> while($row = mysql_fetch_array($res)){    <tr>    <td><?php ($row['sid']); ?></td>    <td><?php ($row['name']); ?></td>    <td><?php ($row['price']); ?></td>    <td><?php ($row['betu']); ?></td>    </tr> } </table> </body> </html> 説明不足の部分がありましたら、申し訳ございません。 よろしくご教授お願いいたします。

    • ベストアンサー
    • PHP
  • PHP 送信されたフォームについて

    HTMLから送信されたフォームがうまくうけとれないので質問させていただきます。 HTML側でチェックボックスを用いてphp側に送ったところうまく結果が反映されません。 HTML側で以下のソースを書き <input type="checkbox" name="kaitouran321" value="a">a <input type="checkbox" name="kaitouran322" value="b">b <input type="checkbox" name="kaitouran323" value="c">c php側で <?php print(htmlspecialchars($_POST['kaitouran321'], ENT_QUOTES, 'UTF-8')); ?> <?php print(htmlspecialchars($_POST['kaitouran322'], ENT_QUOTES, 'UTF-8')); ?> <?php print(htmlspecialchars($_POST['kaitouran323'], ENT_QUOTES, 'UTF-8')); ?> および <?php if($_POST['kaitouran321'] == 'a' && $_POST['kaitouran322'] == 'b' && $_POST['kaitouran323'] == 'c') ?> $i++; と書きました。htmlキャラはしっかり受け取ってくれるのですが、if文で書いた方は反応してくれません(iが+1されない)。選択肢がひとつの時、if文は反応するので条件の書き方がおかしいのでしょうか? 回答お願いします。

    • 締切済み
    • PHP
  • PHPで日付の範囲検索

    PHPを使って日付の範囲検索を実装しています。日付をセレクトフォームで選択し、該当する日時をSELECT文で記述するという流れです。イメージは以下のような感じですが、大体合っていますか? <? php if (!empty(filter_input(INPUT_POST, 'day'))) { $day = filter_input(INPUT_POST, 'day'); ・・・・ SELECT 文   ・・・・ ?> <html> <div class="search"> <form method="post"> <select name="year"> <?php for ($i=2000; $i <= 2021; $i++) { $year .= '<option value="'.$i.'">'.$i.'年</option>'; } ?> </select> <select name="month"> <?php for ($i=1; $i <= 12; $i++) { $month .= '<option value="'.$i.'">'.$i.'月</option>'; } ?> </select> <select name="day"> <?php for ($i=1; $i <= 31; $i++) { $day .= '<option value="'.$i.'">'.$i.'日</option>'; } ?> </select> <input type="hidden" name="search" value="<?php echo $_POST['year'].'-'. $_POST['month'].'-'. $_POST['date']; ?>"> <input type="submit" value="検索"> </form> </div> </html>

    • ベストアンサー
    • PHP

専門家に質問してみよう