- ベストアンサー
PHPの複数条件検索フォームのエラーについて
- PHPの複数条件検索フォームでエラーが発生しています。回答者のコードを参考にしていますが、カッコの数がおかしいためエラーが出ています。
- id名と商品名のどちらかまたは両方を入力すると、DBから検索して結果を表示するという目的です。
- エラーの原因を特定するために、19行目前後を確認しましたが、おかしな部分は見当たりません。
- みんなの回答 (7)
- 専門家の回答
質問者が選んだベストアンサー
> 同じエラーが出ています。どこがおかしいのでしょうか? ダンプしたSQL文やログに出ているエラーメッセージを確認されましたか? or exit() でエラーが出た際にプログラムを終わらせていますが、これだと画面にPHPが吐いたエラーメッセージが表示されませんが、ログファイルにはエラーメッセージが出ているはずなので確認しましょう。 DBの処理周りをデバッグする際は、ダンプしたSQL文をDBのコマンドラインで実行してみて目的の結果が得られるか確認しましょう。 コマンドラインで実行して目的の結果が得られなければSQL文が悪いですし、目的の結果が得られたらプログラムが悪いと言う事です。 また、本やホームページのコードを参考にする際は説明を細かく読みましょう。 参考にされた知恵袋の回答者は「プリペアド・ステートメント」を使った方法だと書いています。(ダンプしたSQL文は「・・・ like ? 」と言った感じで条件が書かれているはずの部分が ? になっているはずです) POSTされて来た値をSQL文に組み込む際にそのままの値を使うとSQLインジェクションの原因になるので、対策として値を全てエスケープ処理するかプリペアド・ステートメントを利用するのが正しい処理です。 値を全てエスケープ処理する場合、プログラムの変更・修正等で漏れる危険性があるのでプリペアド・ステートメントを使う方がいいかと思います。 mysqli_query() はプリペアド・ステートメント処理を行わないクエリー実行方法なので、プリペアド・ステートメントを利用した方法に修正しないとクエリーを実行出来ないと思います。 http://php.net/manual/ja/mysqli.prepare.php
その他の回答 (6)
- t_ohta
- ベストアンサー率38% (5246/13723)
> そのページのやり方は根本的に間違っているという事ですか? 参考にされたと言う知恵袋のページでは $sql = "SELECT * FROM xxxDB ".$where; という行がプログラムの中にあるので、これで SELECT 部分と WHERE 部分を結合してSQL文を完成させています。 写す際に必要な部分が抜け落ちていたと言う事じゃないですか。 > という文字数はスペースを含めて、引用符を抜いたら31文字ではありませんか? WHEREの前にスペースが1文字、最後の?の後にもスペースが1文字、全て合わせれば34文字あります。
補足
本当に何度もすいません。今度こそ行けると思ったのですが、 $where = ' WHERE ' . implode(' AND ', $ary_whr); $sql = "SELECT * FROM 自分の作ったテーブル名".$where; var_dump($sql); $result=mysqli_query($conn,$sql) or exit("データの抽出に失敗しました。"); としても同じエラーが出ています。どこがおかしいのでしょうか?
- t_ohta
- ベストアンサー率38% (5246/13723)
> string型の34文字? という意味ですか? そうです。 変数の中身は文字列で34文字、" WHERE exec LIKE ? AND id LIKE ? " という文字列が入っていたと言う事です。 DB検索をするSQL文の文法としては「SELECT」で始まり、抽出するカラム名、「FROM」に続いてテーブル名、そして「WHERE」に続いて検索条件が書かれていなければいけません。 しかし、ダンプした変数の中身には「SELECT * FROM hoge」と言うSQL文として必要な要素が全く入っていませんので、DBはSQL文の構文エラーと判断し何も検索してくれません。 なので、「データの抽出に失敗しました。」という結果になります。 正しいSQL文を記述するようにしましょう。
補足
SELECT文のやり方は知っていたので、すでに成功していたんですが、他の事を調べているうちにそのページを見つけたので、こういうやり方もあったのかと思っていたのですが、そのページのやり方は根本的に間違っているという事ですか? 近いやり方は無いですか? あまり手間がかかるようでしたら、もしどこかで近いやり方が載っているページをご存知なら教えてください。 ※すみません、 WHERE exec LIKE ? AND id LIKE ? という文字数はスペースを含めて、引用符を抜いたら31文字ではありませんか? 引用符を入れたら33文字
- t_ohta
- ベストアンサー率38% (5246/13723)
> ただ、修正した所今度はデータの抽出に失敗しました。と出てしまってます。$where辺りがおかしいんでしょうか? mysqli_query を実行する直前で var_dump($where); をやってみて下さい。 SQL文が間違っている事が判るかと思います。
補足
何度もレス有難うございます。 再度修正した所、 string(34) " WHERE exec LIKE ? AND id LIKE ? " データの抽出に失敗しました。 と出てしまい、少し調べたのですが、探し方が悪いのかあまりいい情報無くてアドバイスよろしくお願いします。 string型の34文字? という意味ですか?
- t_ohta
- ベストアンサー率38% (5246/13723)
> すみません、結構探したつもりですが・・・ もしかして、19行目の { の前のアンダースコアもそのままプログラムに書いていたりしませんか? 参考にされた知恵袋のページで書かれているアンダースコアは、インデントにスペースやタブを入れても表示されなくなるから、見やすくするためにスペースの代わりに書かれているモノですから、スペースに置き換えましょう。
補足
ご回答有難うございました。 1つ勉強になりました。 ただ、修正した所今度は データの抽出に失敗しました。 と出てしまってます。$where辺りがおかしいんでしょうか?
- t_ohta
- ベストアンサー率38% (5246/13723)
> この質問の前にも'{'を検索してみましたが、再度確かめました。それでもやはり余計なかっこは無いです。 { の数だけが問題とは限りません。 " や ; の位置、数が問題で { や } が本来狙った意味で解釈されていないと言った事もあります。 どうしても見つけられなければ、kensaku20.phpを途中省略せず丸っと補足に貼り付けて下さい。
補足
すみません、結構探したつもりですが・・・ ※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% (5246/13723)
> Parse error: syntax error, unexpected '{' これはカッコの数が合ってないと言う事ですね。 このエラーの場合、19行目でエラーが出るのは19行目に至った時点で辻褄が合わないと言う事なので、それ以前の行に問題がある事が多いです。
補足
この質問の前にも'{'を検索してみましたが、再度確かめました。それでもやはり余計なかっこは無いです。
お礼
何度も回答有難うございました。
補足
PODに関しては話が大きくなりそうなので、改めて別の機会にさせていただきます。