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

SELECT 使用時の bindValue の使い方がよくわかりません。
ネットで調べるも、良い結果は得られず。
どのように書くべきなのでしょうか ?
そもそも MYSQL からデータの出力時には bindValue は必要がないのでしょうか ?
大変恐縮ですが、ご教授下さい。

宜しくお願い致します。


( HTML )
<select name="key_01" id="category_type_01">
<option value="0">0</option>
<option value="">すべて</option>
</select>

<select name="key_02" id="category_type_01">
<option value="0">0</option>
<option value="">すべて</option>
</select>

<input type="text" name="key_03" id="category_name">



( PHP )
try {

$pdo = new PDO(DSN, USERNAME, PASSWORD);

// SQL 文を準備
$sql = 'SELECT * FROM movie WHERE (
category_type_01 LIKE "%' . $_REQUEST['key_01'] . '%" AND
category_type_02 LIKE "%' . $_REQUEST['key_02'] . '%" AND
category_name LIKE "%' . $_REQUEST['key_03'] . '%"
)';

$prepare = $pdo->prepare($sql);
$prepare->bindValue(':category_type_01', XXX, PDO::PARAM_INT);
$prepare->bindValue(':category_type_02', XXX, PDO::PARAM_INT);
$prepare->bindValue(':category_name', XXX, PDO::PARAM_STR);

$prepare->execute();

$rows = $prepare->fetchAll(PDO::FETCH_ASSOC);
foreach ($rows as $i => $row) {
echo $row['category_name'];
}

質問者からの補足コメント

  • うーん・・・

    filter_input 便利ですね、ありがとうございます。

    なぜか、絞り込まれず、全件出力されるようになってしまいました。

    また、SQL 文の LIKE :key01 の意味が調べはしたのですが、わからずでした。
    LIKE "%' . $key03. '%" だと検索しているのはわかるのですが。

    No.1の回答に寄せられた補足コメントです。 補足日時:2019/07/08 16:32

A 回答 (2件)

おっと、先に絞り込みが必要ですね



if(!empty($key01) and !empty($key02) and !empty($key03)){
$sql = 'SELECT * FROM movie WHERE 1
AND category_type_01 LIKE :key01
AND category_type_02 LIKE :key02
AND category_name LIKE:key03';

$prepare = $pdo->prepare($sql);
$prepare->bindValue(':key01', '%'.$key01.'%', PDO::PARAM_INT);
$prepare->bindValue(':key02', '%'.$key02.'%', PDO::PARAM_INT);
$prepare->bindValue(':key03', '%'.$key03.'%', PDO::PARAM_STR);

$prepare->execute();
}

みたいにするとしないとすべてのkeyに値が入ってないときは弾きます
key01-03のどれかに値がはいってればいいなら

if(!empty($key01) or !empty($key02) or !empty($key03)){

みたいな書き方になります。
    • good
    • 0
この回答へのお礼

勉強になりました。
ご回答頂きありがとうございます。

お礼日時:2019/07/08 18:55

流れ的にはこうGETで渡す前提ですがPOSTで渡すならfilter_inputの第一引数は


INPUT_POSTになるので注意

$key01=filter_input(INPUT_GET,"key_01");
$key02=filter_input(INPUT_GET,"key_02");
$key03=filter_input(INPUT_GET,"key_03");

$sql = 'SELECT * FROM movie WHERE 1
AND category_type_01 LIKE :key01
AND category_type_02 LIKE :key02
AND category_name LIKE:key03';

$prepare = $pdo->prepare($sql);
$prepare->bindValue(':key01', '%'.$key01.'%', PDO::PARAM_INT);
$prepare->bindValue(':key02', '%'.$key02.'%', PDO::PARAM_INT);
$prepare->bindValue(':key03', '%'.$key03.'%', PDO::PARAM_STR);

$prepare->execute();

ただ、INT型の要素にLIKE %...%とするのはちょっとありえないです
もう少しきちんと仕様を固めたほうが良いでしょう。
この回答への補足あり
    • good
    • 0
この回答へのお礼

お礼の続きです。
ご回答頂きありがとうございます。

お礼日時:2019/07/08 18:55

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