アプリ版:「スタンプのみでお礼する」機能のリリースについて

現在PHPとSQLを使ってHPを作ろうとしている初心者です。
似たような質問は多くネットで見受けられるのですがうまくいかず悩んでます。
初歩的な質問で恐縮ですがご協力をお願いいたします。

やろうとしていることは、チェックボックスで選択された項目をMYSQLでSELECT文で抽出するというものです。
以下、現在作成中のプログラム(一部抜粋)です。

<?php
$stcd=$_POST["stcd"];  ←ここでチェックボックスの値を受け取っているつもりですが、配列の観点をのちのSQL文含めどのように織り込めば良いかがわかりません。

$db = new PDO("mysql:host=localhost;dbname=".$dbname,$username,$password);

$sql="SELECT * FROM property WHERE stcd ={$stcd}";
$res=$db->query($sql);
$rows=$res->fetchAll(PDO::FETCH_ASSOC);

echo '<br />検索結果は'.$res->rowCount().'件です<br/>';

foreach($rows as $r){
echo '<td>'.$r['price'].'円</td>';
echo '<td>'.$r['stname'].'</td>';
}
?>

チェックボックスの受け取り方が明らかにこれではできないとわかってはいるのですが、解決策がさっぱりわかりません。
ご協力をお願いいたします。

A 回答 (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); }

とかでしょうね。
    • good
    • 0
この回答へのお礼

わぁ!できましたぁ!
ありがとうございます!
色んな本を調べてみてもどこにも書いてないので本当に助かりました!

ちなみにとても厚かましいこととはわかっているのですが…
プリぺアドステートメントを使うにはどのようにしたらよいのでしょうか?
知れば知るほどセキュリティの手を抜いた場合のリスクの高さにおびえるばかりです。

あと…さらにでとっても恐縮なのですが
セレクト文の中で教えて頂いたチェックボックスと同時にbetweenでさらに条件を絞り込む場合はどのようにしたら良いのでしょうか?
たとえばこのような条件を加える場合です。
SELECT ~省略~ AND plan BETWEEN $plan1 AND $plan2
質問の論点を絞ってみたものの、ここまで複雑とは思わず今となっては申し訳ない限りです。

お礼日時:2012/12/05 22:23

>query errorSELECT * FROM property WHERE stcd =Array7


>という表示が出てきました。

ということは、$stcdが配列なんですね(転記されたソースでは読み取れませんでしたが)。

WHERE stcd ={$stcd}

はどう展開して欲しかったのでしょうか?
    • good
    • 0
この回答へのお礼

うぅ…説明が下手で申し訳ないです。

そもそもやりたいことは
今質問をさせて頂いている前のページに
□1 □2 □3 □4
という風なチェックボックス(name=stcd)があって、
そのなかでチェックされたものを、SELECT文で検索したいのです。
なので必然的に配列になると思うのですが、SELECT文の中で配列であるstcd[]をどのように書けばよいかがわからないのです。
すみません…よろしくお願いします。

お礼日時:2012/12/04 00:36

$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);
    • good
    • 0
この回答へのお礼

お返事頂きありがとうございます!
ご推察の通りstcdは数字の変数です。
戻り値ですが
return $db->query($sql);では何も表示されませんでした。

また、$res=$db->query($sql) or die('query error' . $sql);を試してみたところ
query errorSELECT * FROM property WHERE stcd =Array という表示が出てきました。
SELECTで配列を使うな!ということなのでしょうか…?
正直本にも頼りになる内容が書いてなく行き詰ってしまっています。
もうすこしお付き合い頂けないでしょうか?

お礼日時:2012/12/03 22:58

$stcd=$_POST["stcd"];  ←ここでチェックボックスの値を受け取っているつもりですが、配列の観点をのちのSQL文含めどのように織り込めば良いかがわかりません。




受け取っているつもりというのは、取得出来ているかどうか確認されていないと言う事でしょうか。
そこをはっきりさせた方が良いと思います。
    • good
    • 0
この回答へのお礼

お返事ありがとうございます。
すみません表現が不適切でした。
受け取れていることは確認済です。

現在は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は複数のデータが入っているデータなのにそれをそのまま変数として使っているからエラーがでているのではないかなと?
なんかめちゃくちゃで受け答えになってないのはわかっているのですが…すみません

お礼日時:2012/12/02 22:26

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!