0

私が取り組んでいる Web アプリを (恐ろしく安全でない mysql_query から) PDO に切り替えており、既存のクエリを新しい形式に適応させる方法に問題があります。クエリは、特定のファイル タイプのメディア アイテムを検索します。

GET は次のようにフォーマットされます: jpg,png,gif

(以下のコードはエスケープしていましたが、この例では簡略化されています)

$query   = "SELECT * FROM `media` WHERE `active` = '1' AND `thumb` IS NULL ";
if($_GET['extensions']){
    $extensions = array_filter(explode(',',str_replace(' ','',strtolower($_GET['extensions']))));
    foreach($extensions as $extension){
        $extension_sql[] = "`type` = '$extension' ";
    }
    if(count($extension_sql) > 0){
        $query .= 'AND (' . implode('OR ', $extension_sql) . ')';
    }
}
$query .= "ORDER BY `created` DESC ";
$result = mysql_query($query);
while($media = mysql_fetch_array($result)){     
    // Do stuff
}

おそらく私はこれを完全に逆の方法で行っていたので、IN() 関数を使用する必要がありますが、とにかく、これを次のようなパラメーター化された PDO ステートメントに変換する必要があります。

$sth = $dbh->prepare("SELECT * FROM `media` WHERE `active` = '1' AND `thumb` IS NULL AND `type` IN(:set) ORDER BY `created` DESC ");
$types = implode(',', array_filter(explode(',',str_replace(' ','',strtolower($_GET['extensions']))));
$sth->bindParam(':set', $types);
$sth->execute();
while($datatype_option_row = $sth->fetch()){
    // Do stuff
}

明らかにこれは機能しません...しかし、私は効率的かつ安全にしようとしていますが、ほとんど成功していません。ファイルタイプをループしてSQLを作成し、バインドを再度ループできるかもしれません...しかし、ここで誰かが別のアプローチについて賢明なアドバイスを持っているかどうかを確認したかったのです。

TL;DR: SQL 条件の動的リストをパラメーター化する最善の方法を見つけようとしています。

前もって感謝します!

4

1 に答える 1

0

FIND_IN_SETそれを理解した、それはタイプの短いリストであるため、キーは関数でした:

$type_sql = ($_GET['extensions'])? "AND FIND_IN_SET(`type`, :type)" : "";
$sth = $dbh->prepare("SELECT * FROM `media` WHERE `active` = '1' AND `thumb` IS NULL $type_sql ORDER BY `created` DESC ");
$sth->bindParam(':type', $_GET['extensions']);
$sth->execute();
while($media = $sth->fetch()){
    // Do stuff
}
于 2011-04-26T07:12:35.117 に答える