Как динамически строить запросы с помощью PDO - PullRequest
9 голосов
/ 29 ноября 2011

Я использую PDO и хочу сделать что-то вроде этого:

$query = $dbh->prepare("SELECT * FROM :table WHERE :column = :value");
$query->bindParam(':table', $tableName);
$query->bindParam(':column', $columnName);
$query->bindParam(':value', $value);

Позволит ли PDO мне связать имя таблицы и имя столбца следующим образом? кажется разрешающим, но он помещает кавычки вокруг моих параметров, даже если я использую PDO :: PARAM_INT или PDO :: PARAM_BOOL в качестве типа данных.

Если это не сработает,Как я могу безопасно экранировать свои переменные, чтобы я мог интерполировать их в запросе?

Ответы [ 2 ]

13 голосов
/ 29 ноября 2011

К сожалению, вы не можете связать параметры по именам столбцов.

Что вы можете попробовать, это динамически создать команду SQL:

$sql = "SELECT * FROM $tableName WHERE $columnName = :value";
$query = $dbh->prepare($sql);
$query->bindParam(':value', $value);

Просто убедитесь, что ваши параметры / переменные очищены, если они поступают откуда-то еще, чтобы предотвратить SQL-инъекцию. В этом случае $value является безопасным до степени , но $tableName и $columnName - нет, опять же, особенно если значения для этих переменных не предоставлены you и вместо этого ваши пользователи / vistors / etc ...

Еще одна вещь; пожалуйста, избегайте использования * и назовите ваши столбцы вместо этого ... Укажите некоторые причины:

http://www.jasonvolpe.com/topics/sql/

Проблема производительности при использовании SELECT *?

Смотрите другие похожие посты здесь:

Почему параметр связывания в предложении ORDER BY не упорядочивает результаты?

Как установить параметры ORDER BY, используя подготовленный оператор PDO?

0 голосов
/ 23 декабря 2015

Из вашего вопроса непонятно, почему вы хотите связать имя таблицы.

Варианты привязки параметров PDO:

  • bindParam
  • bindValue
  • bindColumn

Создание переменной таблицы или представления отрицательно скажется на цели подготовки оператора.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...