PDO и Microsoft SQL: необходимо объявить табличную переменную "@ P1" - PullRequest
0 голосов
/ 23 июля 2010

Я пытаюсь использовать привязку в PDO для выбора некоторых записей из базы данных Microsoft SQL.Код, который я использую, выглядит так, как будто я нашел в документации.Однако, когда я запускаю его, я получаю следующее предупреждение:

Предупреждение: PDOStatement :: execute () [pdostatement.execute]: SQLSTATE [42000]: синтаксическая ошибка или нарушение доступа: 1087 [Microsoft] [Собственный клиент SQL] [SQL Server] Необходимо объявить табличную переменную «@ P1».(SQLExecute [1087] в ext \ pdo_odbc \ odbc_stmt.c: 254) в (длинный путь к файлу) в строке 40

Вот соответствующий код:

$table = "[User Site]";
$user = "demo";
$sql = "SELECT * FROM ? WHERE user='?'"; 
$sth = $db->prepare($sql);
$sth->bindValue(1,  $table, PDO::PARAM_STR);
$sth->bindValue(2, $user, PDO::PARAM_STR);
$sth->execute(); //                         <-- line 40
$data = $sth->fetch(PDO::FETCH_ASSOC);

Это можетсвязаны.Когда я пытаюсь использовать маркеры именованных параметров (: table,: user) вместо вопросительных знаков, я получаю следующее:

Предупреждение: PDOStatement :: bindValue () [pdostatement.bindvalue]: SQLSTATE [HY093]: Неверный номер параметра: параметр не был определен в (длинный путь к файлу) в строке 39

Почему ему не нравится мое подготовленное утверждение?

1 Ответ

2 голосов
/ 23 июля 2010

Невозможно привязать параметры к именам таблиц в SQL. Это верно для любого языка, любой базы данных.

Вам придется интерполировать имя таблицы в строку запроса до prepare().

Также не следует помещать заполнитель параметра в кавычки, даже если это строка или значение даты. Заполнители параметров внутри кавычек интерпретируются как литеральные строки. Иначе как бы вы ввели буквальный знак вопроса?

Вот как бы я написал это:

$table = "[User Site]";
$user = "demo";
$sql = "SELECT * FROM $table WHERE user=?"; 
$sth = $db->prepare($sql);
$sth->execute(array($user));
$data = $sth->fetch(PDO::FETCH_ASSOC);

Я не беспокоюсь по поводу использования bindParam() или bindValue(). Обычно проще просто передать значения параметров в аргументе массива в execute().

...