Как динамически строить запросы с помощью PDO

Я использую 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 в качестве типа данных.

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

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

Вы можете попробовать динамически создать команду 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?

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

Параметры привязки параметров PDO

  • bindParam
  • bindValue
  • bindColumn

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