Использование PDO для выбора, когда столбцы параметров неизвестны / переменные - PullRequest
3 голосов
/ 21 июля 2011

Для простоты, скажем, у нас есть довольно надуманная таблица:

[ID]  [Weekday]  [Weather]
 1      Sun        Cloudy
 2      Mon        Sunny
...     ...         ...
 8      Sun        Cloudy
...     ...         ...
15      Sun        Windy

И я бью эту таблицу за наборы данных. Иногда мне нужны данные на основе дня недели, иногда на основе погоды. Поэтому я создаю этот класс:

class weather {

    public static function reportByDay($weekday) {
        return self::weatherServer('Weekday',$weekday);
    }

    public static function reportByWeather($weather) {
        return self::weatherServer('Weather', $weather)
    }

    private static function weatherServer($reportType, $value) {
        $q = "SELECT ID, Weekday, Weather
                FROM table
                WHERE $reportType = $value";
        $r = mysql_query($q);
        etc etc.
        return $results;
    }
}

Итак, я хотел преобразовать это в PDO, но обнаружил сегодня утром, что структура WHERE :field = :thing не работает ... по крайней мере, я не могу заставить ее работать.

Если я выделю столбец, то WHERE Weather = :thing, тогда он будет работать хорошо ... но я просто потерял удобство исходной структуры класса, потому что мне пришлось бы печатать все эти специализированные запросы ... и Есть много для моего реального набора данных и структуры таблицы.

Есть ли в PDO способ использования параметров для столбцов? или параметры могут использоваться только для значений?

Ответы [ 2 ]

3 голосов
/ 21 июля 2011

Похоже, у вас уже есть половина ответа - не заставляйте PDO связывать столбец, делайте это "вручную", как вы делали:

private static function weatherServer($reportType, $value) {
    // you may want to sanitize reportType, but because this is private, you 
    // might not need to
    $q = "SELECT ID, Weekday, Weather
            FROM table
            WHERE $reportType = :value";
    // no idea where $pdo would be declared in your framework. It's up to 
    // what you feel best meets your need.
    $stmt = $pdo->prepare($q);
    $stmt->bindParam(":value",$value);
    etc etc.
    return $results;
}
3 голосов
/ 21 июля 2011

Сохраняйте безопасный список и используйте конкатенацию строк или интерполяцию, чтобы поместить туда имя столбца.

$validColumns = array(
   'Weather',
   'Weekday'
);

if ( ! in_array($reportType, $validColumns)) {
   throw new Exception('Not a valid column name.');
}

$q = "SELECT ID, Weekday, Weather
                FROM table
                WHERE `$reportType` = :value";
...