Как bindValue для имени таблицы?
Можно ли сделать bindvalue для имени таблицы? Похоже, мой не подхватывает его, в основном вторые 2 привязки работают нормально, если я удаляю таблицу: и добавляю вместо нее имя таблицы, но я хочу использовать это для более чем одной таблицы из одной формы.
Поле для таблицы в форме определяется на основе результата предыдущего запроса, поэтому имя таблицы отображается в форме в виде значения $table, которое отображается правильно, так что при этом следует поместить значение $table в привязку таблицы???
try {
$sql = 'UPDATE :table SET
archive = :archive
WHERE id = :id';
$s = $pdo->prepare($sql);
$s->bindvalue('table', $_POST['table']);
$s->bindvalue('archive', $_POST['archive']);
$s->bindvalue('id', $_POST['id']);
$s->execute();
}
1 ответ
Поскольку подготовленные заявления "немного" больше, чем sprintf
, не имеет смысла устанавливать таблицу по переменной.
Подготовленный оператор передается в БД до того, как будут установлены фактические значения. Таким образом, БД может искать способ ответить на запрос. После этой подготовки устанавливаются фактические искомые значения. Ответ на запрос, когда execute()
называется.
Итак, чтобы подготовить "способ ответа на запрос" (как я его назвал), имя таблицы является важной информацией. Вот почему нет смысла передавать его как переменную. Вот почему это не работает.
Итак, вам нужно объединить имя таблицы в строку:
$sql = 'UPDATE '. $table .' SET
archive = :archive
WHERE id = :id';
Как подсказывает @zerkms, вы должны внести в белый список возможные имена таблиц.