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

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)の作りたいソース部分の書き方を教えて下さい。

上記の考え方より良い(短い)ソースが作れる場合はそのソースを教えて下さい。

A 回答 (2件)

可変変数を使えばいいと思います。



for($a = 0; $a <=$keywords_num; $a++) {
   ${'kw' . $a} = '%'.$keywords[$a].'%';
}
  :
  :
for($a = 0; $a <=$keywords_num; $a++) {
   $stmt->bindParam(':kw' . $a, ${'kw' . $a});
}
    • good
    • 0
この回答へのお礼

shimixさん

回答ありがとうございます。
可変変数というものを使うのですね。

可変変数を知らなかったので$a.$bのように普通に変数を連結したりしてみましたがどれもうまくいかない状態でした。

可変変数について調べて内容を理解することができました。

ソースだけでなく「可変変数」を使えば良いというキーワードを教えていただけることはとてもありがたいです。

プログラムを修正して動かしてみます。

お礼日時:2011/11/10 14:52

%付き文字列を変数に格納しなくても、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 構文を覚えるといろんなところに使える。
    • good
    • 0
この回答へのお礼

mpro-gramさん

ご回答ありがとうございます。
>%付き文字列を変数に格納しなくても、bind 時に連結すれば?
そうですね。プログラムをもっと覚えてシンプルに作れるようになりたいです。

連想配列、foreach構文についてもしっかり学習したいと思います。
本などで基本的なことは学んだつもりでしたが、実際に自分でソースを作ってみると使いこなせていないことを実感します。

お礼日時:2011/11/10 15:03

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