2011-07-21 2 views
3

Для простоты предположим, что у нас есть это довольно надуманный таблицу:Использование PDO, чтобы выбрать, когда Param столбцы неизвестны/переменная

[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 для использования параметров для столбцов? или параметры могут использоваться только для значений?

ответ

3

Похоже, у вас уже есть половина ответа - не делают 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; 
} 
+0

'/ face palm' ** duh! ** Я уже определяю столбцы в методах, нет причин не продолжать делать это, за исключением значений через PDO ... немного увлекся с моим преобразованием PDO кажется! Спасибо за удар в голову. – Drew

3

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

$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"; 
+2

Действительно. Белый список - лучший способ поместить имена столбцов извне. – zerkms

+0

+1 для идеи белого списка – Drew

Смежные вопросы