PDO 和 Microsoft SQL:必须声明表变量“@P1”

Jam*_*mes 2 php sql pdo parameterized sql-server-2008

我正在尝试使用 PDO 中的绑定从 Microsoft SQL 数据库中选择一些条目。我使用的代码看起来与我在文档中找到的相似。但是,当我运行它时,我收到以下警告:

警告:PDOStatement::execute() [pdostatement.execute]:SQLSTATE[42000]:语法错误或访问冲突:1087 [Microsoft][SQL Native Client][SQL Server]必须声明表变量“@P1”。(SQLExecute[1087] at ext\pdo_odbc\odbc_stmt.c:254) in (long file path) on line 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);
Run Code Online (Sandbox Code Playgroud)

这可能是相关的。当我尝试使用命名参数标记 (:table, :user) 而不是问号时,我得到以下信息:

警告:PDOStatement::bindValue() [pdostatement.bindvalue]:SQLSTATE[HY093]:无效的参数号:参数未在第 39 行的(长文件路径)中定义

为什么它不喜欢我准备好的声明?

Bil*_*win 5

您不能在 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);
Run Code Online (Sandbox Code Playgroud)

我不介意使用bindParam()or bindValue()。通常将数组参数中的参数值传递给execute().