Задать вопрос
gazes12
@gazes12

Почему sql запрос не определяет имя таблицы, если записывать имя через prepare?

Здравствуйте!
Так не работает:
$sql = $db->prepare("SELECT `row` FROM :table WHERE `row2` = :string");
	$sql->execute(['table' => 'имя таблицы', 'row2' => 'строка']);


Так работает:
$sql = $db->prepare("SELECT `row` FROM `имя таблицы` WHERE `row2` = :string");
	$sql->execute([ 'row2' => 'строка']);


В чем проблема? Помогите, пожалуйста, заранее спасибо!
  • Вопрос задан
  • 94 просмотра
Подписаться 1 Простой Комментировать
Решения вопроса 2
@pantsarny
Потому что подстановка не используется для имен таблиц, так как имя таблицы не может быть в одиночных кавычках
Ответ написан
@alexalexes
1. В качестве входных параметров никогда не использовались имена таблиц в подготовленных запросах - это попытка забивать микроскопом гвозди.
2. Метки для входных параметров - это не тип данных, это просто название места куда будет подставлено значение этой метки по ключу из массива значений.
Причем, именованные метки нужно связывать со значением с помощью специальной функции:
$stmt = $db->prepare("SELECT * FROM moya_tablitsa WHERE id = :metka_parametra_identifikatora");
$stmt->bindParam(':metka_parametra_identifikatora', 123);
$stmt->execute();

Но можно не использовать именованные метки (если их несколько в запросе, то нужно вставлять значения по порядку)
$stmt = $db->prepare("SELECT * FROM moya_tablitsa WHERE id = ?");
$stmt->execute([123]);

Можно использовать связывающую функцию, указав порядок метки.
$stmt = $db->prepare("SELECT * FROM moya_tablitsa WHERE id = ?");
$stmt->bindParam(1, 123); // 1 - это номер метки, 123 - значение параметра
$stmt->execute();
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы