Заполнитель для таблицы SQLite в PHP - PullRequest
0 голосов
/ 17 августа 2011

У меня есть запрос, который я хотел бы использовать, и который я хотел бы использовать повторно для других запросов на выборку.
Возможно ли иметь запрос на выборку, подобный этому:

SELECT * FROM ? WHERE id = ?;

И затем связатьзначения как это:

$stmt->bindValue(1, $table, PDO::PARAM_STR);  
$stmt->bindValue(2, $id, PDO::PARAM_INT);

Проблема в том, что когда я делаю это, я получаю это $database->errorInfo() из PDOException

HY000 1 рядом с "?"ошибка синтаксиса.

Я попытался удалить заполнитель таблицы, и он работает.Можно ли сделать это по-своему или мне нужно иметь отдельные функции?

1 Ответ

2 голосов
/ 17 августа 2011

Краткий ответ: NO .


Длинный ответ:

См. Руководство PDO :: prepare .Существует оператор: This must be a valid SQL statement for the target database server. Это означает, что ваш сервер БД должен поддерживать синтаксис подготовленного оператора, который вы используете.

Насколько я знаю, ни mysql, ни любая другая БД не допускают возникновения переменных привязкив FROM пункте.Причина этого кроется в концепции подготовленного заявления.Подготовленный оператор готовится внутри БД, когда вы звоните prepare.Это означает, что планировщик БД создает план для запроса, поэтому его можно выполнить несколько раз с различными параметрами , не создавая его снова и снова .Чтобы построить план, планировщик должен знать затронутые таблицы, вызываемые функции, возможности использовать различные стратегии выборки и объединения (сканирование индекса / вложенные циклы / и т. Д.) И т. Д.

Итак, вы не можете «связать»имя таблицы в подготовленный оператор в тот момент, когда вы хотите, чтобы он выполнялся, потому что БД нужны имена таблиц в тот момент, когда вы prepare оператор.Вот почему вы получаете это сообщение: БД требует, чтобы все имена таблиц присутствовали в подготовительном запросе.

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