Подготовьте заявление, не связывая с 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 не позволяет именам таблиц или столбцов быть заполнителями. Просто создайте запрос с конкатенацией, но убедитесь, что пользователь предоставляет только допустимые значения. Это должно быть безопасно.