PDO Параметризованный оператор SELECT с зацикленным условным выражением - PullRequest
0 голосов
/ 26 апреля 2011

Я переключаю веб-приложение, над которым я работаю, на PDO (из ужасного и небезопасного 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, а затем снова зацикливаться на связываниях ... но хотел посмотреть, есть ли у кого-нибудь здесь советы мудрецов для другого подхода.

TL;ДР: Попытка найти лучший способ параметризации динамических списков условных выражений SQL.

Заранее спасибо!

1 Ответ

0 голосов
/ 26 апреля 2011

Понял, клавиша была функцией 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
}
...