PDO参数化SELECT语句与循环条件

时间:2011-04-26 06:20:32

标签: php mysql loops pdo parameterized

我正在切换一个我正在处理PDO的Web应用程序(来自可怕且不安全的mysql_query),并且在如何使现有查询适应新格式方面遇到了一些困难。查询查找某些文件类型的媒体项:

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,然后再次循环绑定...但是想看看这里是否有人有不同方法的sage建议。

TL; DR:尝试找到参数化SQL条件动态列表的最佳方法。

提前致谢!

1 个答案:

答案 0 :(得分: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
}