現在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>';
}
?>
チェックボックスの受け取り方が明らかにこれではできないとわかってはいるのですが、解決策がさっぱりわかりません。
ご協力をお願いいたします。
No.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); }
とかでしょうね。
わぁ!できましたぁ!
ありがとうございます!
色んな本を調べてみてもどこにも書いてないので本当に助かりました!
ちなみにとても厚かましいこととはわかっているのですが…
プリぺアドステートメントを使うにはどのようにしたらよいのでしょうか?
知れば知るほどセキュリティの手を抜いた場合のリスクの高さにおびえるばかりです。
あと…さらにでとっても恐縮なのですが
セレクト文の中で教えて頂いたチェックボックスと同時にbetweenでさらに条件を絞り込む場合はどのようにしたら良いのでしょうか?
たとえばこのような条件を加える場合です。
SELECT ~省略~ AND plan BETWEEN $plan1 AND $plan2
質問の論点を絞ってみたものの、ここまで複雑とは思わず今となっては申し訳ない限りです。
No.3
- 回答日時:
>query errorSELECT * FROM property WHERE stcd =Array7
>という表示が出てきました。
ということは、$stcdが配列なんですね(転記されたソースでは読み取れませんでしたが)。
WHERE stcd ={$stcd}
はどう展開して欲しかったのでしょうか?
うぅ…説明が下手で申し訳ないです。
そもそもやりたいことは
今質問をさせて頂いている前のページに
□1 □2 □3 □4
という風なチェックボックス(name=stcd)があって、
そのなかでチェックされたものを、SELECT文で検索したいのです。
なので必然的に配列になると思うのですが、SELECT文の中で配列であるstcd[]をどのように書けばよいかがわからないのです。
すみません…よろしくお願いします。
No.2
- 回答日時:
$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で配列を使うな!ということなのでしょうか…?
正直本にも頼りになる内容が書いてなく行き詰ってしまっています。
もうすこしお付き合い頂けないでしょうか?
No.1
- 回答日時:
$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は複数のデータが入っているデータなのにそれをそのまま変数として使っているからエラーがでているのではないかなと?
なんかめちゃくちゃで受け答えになってないのはわかっているのですが…すみません
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- PHP PHP MySql ページング 2 2022/09/20 06:38
- PHP DBのハッシュ化したパスワードをpassword_verifyで戻し照合したのですが上手く行きません 2 2023/02/06 13:24
- MySQL SQL任意に並び替えをしたい 2 2023/08/28 10:47
- PHP 重複を防ぐ記述について教えて下さい。 3 2023/04/03 14:35
- Excel(エクセル) PHPプログラムをエクセルに張り付けると検索ボックスがでてくる! 3 2022/05/08 07:10
- PHP PHP一覧表示した項目にリンクをはりたい 1 2023/07/12 17:08
- PHP ここでの ②if($su_d<>"")の比較演算子 を使う理由は 1 2022/03/26 02:33
- PHP if(preg_match("/[^0-9]/",$gu_d)){意味を教えてください。 1 2022/05/06 05:37
- PHP PHPSpreadsheetによる書き出し時のページネーション方法について 1 2023/03/20 10:35
- PHP クエリObjectをforeachで回す時に、次のレコードへ移動せずに次のレコードを取得したい 2 2022/07/28 15:29
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
<VB.NET>INSERT文でDBにデータ...
-
JAVA SQLServerException 列名 ...
-
Pro*Cの構文エラー
-
ResultSetインターフェイスでの...
-
CakePHPでquery()を使うときに...
-
PHP初心者です。syntax error, ...
-
PHPのUndefined index や varia...
-
php postgres Insert と updat...
-
insert1つの処理でもトランザ...
-
phpでforeach ($stmt as $row)...
-
VB.NETでSQLを作る時のカンマの...
-
MySQLでデータベースにデータin...
-
実行時エラー3131 FROM 句の構...
-
VBAをつかってクエリの情報を抽...
-
テキストボックスに入れた内容...
-
VB.NET
-
SQL文が実行できません
-
while文の中にwhile文を書きた...
-
in 'where clause'のエラーの理由
-
SQL文2つ実行
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
JAVA SQLServerException 列名 ...
-
insert1つの処理でもトランザ...
-
Pro*Cの構文エラー
-
<VB.NET>INSERT文でDBにデータ...
-
データベースに存在するデータ...
-
ResultSetインターフェイスでの...
-
C# で発生したException.Messag...
-
Q&Aサイトを作成していてURLの...
-
VBA ACCESS SQL...
-
MySQLのINSERT時にたまに重複に...
-
INSERT,DELETEを同時に
-
【初歩】配列の格納データ数だ...
-
PHP&MySQLでの文字列+数列の一...
-
php postgres Insert と updat...
-
VB.NET エラーになる箇...
-
OR検索を実装したい
-
PHP初心者です。syntax error, ...
-
mysqliを使ってデータベースを...
-
like検索の複数キーワードで、...
-
CakePHPとMySqlを使用していま...
おすすめ情報