- ベストアンサー
チェックボックスで受け取った値のPDOでの使い方
- PHPとSQLを使ってHPを作ろうとしている初心者のための、チェックボックスで選択された値のPDOでの使い方についての質問です。
- 現在作成中のプログラムの一部を抜粋し、チェックボックスの値を受け取る方法について説明しています。しかし、配列の観点をのちのSQL文含めどのように織り込めば良いかがわからず、解決策を求めています。
- チェックボックスの受け取り方が明らかにこれではできないとわかってはいるのですが、どのように修正すれば良いか分からずに悩んでいます。初心者でも理解しやすい説明や具体的なコードの修正例など、ご協力をお願いします。
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
>SELECT文の中で配列であるstcd[]をどのように書けばよいかがわからないのです。 (最初のソースのように)プリペアドステートメントを使わないのであれば $sql = ""SELECT * FROM property"; $where = array(); foreach ($stcd as $val) { $where[] = "(stcd ='" . $val . "')"; } if (count($where) > 0) { $sql .= " where " . implode('or', $where); } とかでしょうね。
その他の回答 (3)
- shimix
- ベストアンサー率54% (865/1590)
>query errorSELECT * FROM property WHERE stcd =Array7 >という表示が出てきました。 ということは、$stcdが配列なんですね(転記されたソースでは読み取れませんでしたが)。 WHERE stcd ={$stcd} はどう展開して欲しかったのでしょうか?
お礼
うぅ…説明が下手で申し訳ないです。 そもそもやりたいことは 今質問をさせて頂いている前のページに □1 □2 □3 □4 という風なチェックボックス(name=stcd)があって、 そのなかでチェックされたものを、SELECT文で検索したいのです。 なので必然的に配列になると思うのですが、SELECT文の中で配列であるstcd[]をどのように書けばよいかがわからないのです。 すみません…よろしくお願いします。
- shimix
- ベストアンサー率54% (865/1590)
$db->query($sql) の戻り値をチェックしてください。falseが返っていませんか? http://php.net/manual/ja/pdo.query.php デバッグ段階であれば、 $res=$db->query($sql) or die('query error' . $sql); とでもしておけばいいでしょう。 ちなみに列stcdは数値型ということでいいんですよね(文字列型であれば単引用符で括らないといけないので)。 (蛇足) せっかくPDOを使っているんだからプリペアドステートメントにすればいいのにとは思います。 $sql="SELECT * FROM property WHERE stcd=?"; $stmt=$db->prepare($sql); $stmt->execute(array($stcd)); $rows=$stnt->fetchAll(PDO::FETCH_ASSOC);
お礼
お返事頂きありがとうございます! ご推察の通りstcdは数字の変数です。 戻り値ですが return $db->query($sql);では何も表示されませんでした。 また、$res=$db->query($sql) or die('query error' . $sql);を試してみたところ query errorSELECT * FROM property WHERE stcd =Array という表示が出てきました。 SELECTで配列を使うな!ということなのでしょうか…? 正直本にも頼りになる内容が書いてなく行き詰ってしまっています。 もうすこしお付き合い頂けないでしょうか?
- NeilMania
- ベストアンサー率30% (40/131)
$stcd=$_POST["stcd"]; ←ここでチェックボックスの値を受け取っているつもりですが、配列の観点をのちのSQL文含めどのように織り込めば良いかがわかりません。 受け取っているつもりというのは、取得出来ているかどうか確認されていないと言う事でしょうか。 そこをはっきりさせた方が良いと思います。
お礼
お返事ありがとうございます。 すみません表現が不適切でした。 受け取れていることは確認済です。 現在はSELECTの中で条件で$stcdを使っているので下記のエラーが発生しているのだと思います。 Fatal error: Call to a member function fetchAll() on a non-object in C:\xampp\htdocs\Home_Search\src\search\result101.php on line 59 59行目の文章は以下の通りです。 $rows=$res->fetchAll(PDO::FETCH_ASSOC); 私の考えでは(外れてたらお恥ずかしいのですが)現状はSELECTの条件の中で変数の書き方がいまひとつなのだと思うのです。要は$stcdは複数のデータが入っているデータなのにそれをそのまま変数として使っているからエラーがでているのではないかなと? なんかめちゃくちゃで受け答えになってないのはわかっているのですが…すみません
お礼
わぁ!できましたぁ! ありがとうございます! 色んな本を調べてみてもどこにも書いてないので本当に助かりました! ちなみにとても厚かましいこととはわかっているのですが… プリぺアドステートメントを使うにはどのようにしたらよいのでしょうか? 知れば知るほどセキュリティの手を抜いた場合のリスクの高さにおびえるばかりです。 あと…さらにでとっても恐縮なのですが セレクト文の中で教えて頂いたチェックボックスと同時にbetweenでさらに条件を絞り込む場合はどのようにしたら良いのでしょうか? たとえばこのような条件を加える場合です。 SELECT ~省略~ AND plan BETWEEN $plan1 AND $plan2 質問の論点を絞ってみたものの、ここまで複雑とは思わず今となっては申し訳ない限りです。