
PDOでプリペアードステートメントを使って複数キーワードで検索する方法を教えて下さい。
プリペアードステートメントは「?」形式ではなく、$stmt->bindParam(':sample', $samle);の形を使った方法を知りたいです。
環境
PHP:5.1.6
MySQL:5.0.77
処理の流れを作ってみました。途中から不明な点があるので変数化しないで記載してあります。
/*--PDOのプリペアードステートメントのbindParamを用いた場合--*/
$dbh = new PDO($DSN , $DBUSER , $DBPASS);
$query = 'SELECT * FROM table WHERE ';
$keyword_str = 'キーワードA キーワードB キーワードC';
//全角スペースを半角スペースに変換する処理(省略)
$keywords = split(' ',$keyword_str);
for($a = 0; $a <$keywords_num; $a++)
{
$kw[]=' 列名 like :kw'.$a;
}
$query.= join('AND', $kw);
//キーワードごとに「%キーワード%」の形を作る。
$kw0='%'.$keywords[0].'%';
$kw1='%'.$keywords[1].'%';
$kw2='%'.$keywords[2].'%';
$stmt = $dbh->prepare($query);
$stmt->bindParam(':kw0', $kw0);
$stmt->bindParam(':kw1', $kw1);
$stmt->bindParam(':kw2', $kw2);
$stmt->execute();
/*-----------------------------------------------------------*/
上記ソースの後半部分、
(1)
//キーワードごとに「%キーワード%」の形を作る。
のところを変数を使って実現しようと思うのですが、うまくいきません。
$keywords_num=count($keywords);
でキーワードの数を取得して
for($a = 0; $a <=$keywords_num; $a++) {
//作りたいソース
}
の形にすることは予想がつくのですが。
(2)
$stmt->bindParam(':kw0', $kw0);
$stmt->bindParam(':kw1', $kw1);
$stmt->bindParam(':kw2', $kw2);
の部分も上記と同じ形を考えていますが
$keywords_num=count($keywords);
でキーワードの数を取得して
for($a = 0; $a <=$keywords_num; $a++) {
//作りたいソース
}
「//作りたいソース」の部分がうまく作れません。
(1)(2)の作りたいソース部分の書き方を教えて下さい。
上記の考え方より良い(短い)ソースが作れる場合はそのソースを教えて下さい。
No.1ベストアンサー
- 回答日時:
可変変数を使えばいいと思います。
for($a = 0; $a <=$keywords_num; $a++) {
${'kw' . $a} = '%'.$keywords[$a].'%';
}
:
:
for($a = 0; $a <=$keywords_num; $a++) {
$stmt->bindParam(':kw' . $a, ${'kw' . $a});
}
shimixさん
回答ありがとうございます。
可変変数というものを使うのですね。
可変変数を知らなかったので$a.$bのように普通に変数を連結したりしてみましたがどれもうまくいかない状態でした。
可変変数について調べて内容を理解することができました。
ソースだけでなく「可変変数」を使えば良いというキーワードを教えていただけることはとてもありがたいです。
プログラムを修正して動かしてみます。
No.2
- 回答日時:
%付き文字列を変数に格納しなくても、bind 時に連結すれば?
<?php
// prepare 後
for($a = 0; $a <$keywords_num; $a++) {
$stmt->bindParam(':kw'.$a, '%'. $keywords[$a] .'%');
}
別解:名前付きホルダーにするなら連想配列を使う方法もある
<?php
// キーワードを配列に格納済みのところから
$holder_list = array();
$keywords_num = count($keywords);
for($a = 0; $a <$keywords_num; $a++) {
$kw[]=' 列名 like :kw'.$a;
//キーワードごとに「%キーワード%」の形を作る。 ホルダー名とも対応させる
$holder_list[':kw'.$a] = '%'. $keywords[$a] .'%';
}
$query.= join(' AND ', $kw);
var_dump($query, $holder_list);// debug 出力 本番ではコメントアウト
$stmt = $dbh->prepare($query);
foreach($holder_list as $holder => $word){
$stmt->bindParam($holder, $word);
}
$stmt->execute();
// 連想配列と、foreach 構文を覚えるといろんなところに使える。
mpro-gramさん
ご回答ありがとうございます。
>%付き文字列を変数に格納しなくても、bind 時に連結すれば?
そうですね。プログラムをもっと覚えてシンプルに作れるようになりたいです。
連想配列、foreach構文についてもしっかり学習したいと思います。
本などで基本的なことは学んだつもりでしたが、実際に自分でソースを作ってみると使いこなせていないことを実感します。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Perl RSSにdiv,ul classを付けたいのですがどのようにつけるのかわからないです 2 2022/03/28 01:53
- PHP 重複を防ぐ記述について教えて下さい。 3 2023/04/03 14:35
- PHP DBのハッシュ化したパスワードをpassword_verifyで戻し照合したのですが上手く行きません 2 2023/02/06 13:24
- PHP PHP MySql ページング 2 2022/09/20 06:38
- PHP PHP一覧表示した項目にリンクをはりたい 1 2023/07/12 17:08
- 環境・エネルギー資源 電力会社のCO2係数の計算根拠が、いまいち理解できなかったので、ここに質問させていただきます。 1次 1 2022/10/04 13:05
- 電気・ガス・水道業 事務所ビルの電気料金についてご教示ください。 4 2022/09/13 11:24
- 物理学 教えてください。 二次入力が5615wになります。 問題は、定格出力7.5(kW),定格周波数60( 1 2023/04/12 17:15
- Excel(エクセル) セルの値をグーグルで検索するエクセルVBAについて! 2 2022/08/01 21:41
- 化学 すいません。苦手な誘導機おしえてください。 問題は、4極,1000(kW),3300(V),60(H 2 2023/04/07 19:18
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
教えて下さい。
-
SQlite
-
connectを使ったSQL実行でエラー
-
where以下の条件文
-
like検索の複数キーワードで、...
-
VB勉強中
-
配列データのレコード登録
-
MySQL 複数の同じような命令が...
-
データベースに存在するデータ...
-
プリぺアドステートメントで変...
-
PHPでMySQLのテーブルからcount...
-
mysql php 複数のクエリ
-
下記エラーメッセージ解決について
-
RFC822形式での日時の取得
-
ループ内に任意行を差し込む処...
-
MySQLでの売上集計
-
MySQLの日付データについて
-
PHPの画像表示関連(?)プログラ...
-
MySQLのエラー出力
-
警告を出さないコードの書き方
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
insert1つの処理でもトランザ...
-
<VB.NET>INSERT文でDBにデータ...
-
JAVA SQLServerException 列名 ...
-
Pro*Cの構文エラー
-
VBA ACCESS SQL...
-
PHP&MySQLでの文字列+数列の一...
-
【初歩】配列の格納データ数だ...
-
mysqliを使ってデータベースを...
-
配列で受け取った値がUPDATEで...
-
MySQLのINSERT時にたまに重複に...
-
一度検索されたものに対するソ...
-
cakePHPでSQLが実行できない。
-
PHP4とORACLE接続について
-
phpでforeach ($stmt as $row)...
-
phpmyadminにタグを格納するには
-
zendframework
-
データベースに存在するデータ...
-
データに「,」があると「"」で...
-
Q&Aサイトを作成していてURLの...
-
PHP+PDO+MYSQL で実行されたSQ...
おすすめ情報