Подготовьте заявление, не связывая с bindvalue

Я только недавно начал использовать PDO, не так много опыта с ним, но недавно я столкнулся с раздражающей проблемой.

Я пытаюсь использовать bindValue с оператором выборки для извлечения информации из базы данных. Переменные, которые я получаю, взяты из GET, с предыдущей страницы. Все идет хорошо, за исключением того факта, что он не присваивает, я думаю, правильное значение одному из bindValue.

PDO:

$stmt = $dbconnect->prepare('SELECT * FROM :table WHERE id=:id');

$stmt->bindValue(':table', $table);
$stmt->bindValue(':id', $id);

$stmt->execute();
$row = $stmt->fetch();

Я знаю разницу между bindValue и bindParam. Код работает нормально, когда я жестко кодирую значение таблицы. Я в течение короткого часа стучал головой о стену, но я не могу понять это. Может ли кто-нибудь, помимо предоставления мне правильного синтаксиса, объяснить, что пошло не так с моим мышлением, потому что в этот момент я не могу придумать причину, кроме, может быть, неправильной интерпретации строкового значения, почему это идет не так.

Также в будущем я хотел бы знать точное содержание команды SQL. Я пытался сделать это:

$SQL = 'SELECT * FROM :table WHERE id=:id';
$stmt = $dbconnect->prepare($SQL);

$stmt->bindValue(':table', $table);
$stmt->bindValue(':id', $id);

$stmt->execute();
$row = $stmt->fetch();

Но это не будет связывать значения переменных с переменной SQL. Ваша помощь очень ценится!

РЕДАКТИРОВАТЬ: я заметил, что мое сообщение является дубликатом из сообщения FAQ: FAQ. Таким образом, на мой вопрос ответили, однако, моего понимания PDO недостаточно для его проведения. Может ли кто-нибудь объяснить, что происходит со следующей строкой кода и почему это работает, по ссылке!

$field = "`".str_replace("`","``",$field)."`";
$sql   = "SELECT * FROM t ORDER BY $field";

Ответ: Благодаря шелковому огню я придумала починку. Перед вставкой строки SQL просто добавьте содержимое строки в строку SQL:

$SQL = 'SELECT * FROM '.$table.' WHERE id=:id';

1 ответ

Решение

PDO не позволяет именам таблиц или столбцов быть заполнителями. Просто создайте запрос с конкатенацией, но убедитесь, что пользователь предоставляет только допустимые значения. Это должно быть безопасно.

Другие вопросы по тегам