admin

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

sql

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

警告:PDOStatement :: execute()[pdostatement.execute]:SQLSTATE
[42000]:语法错误或访问冲突:1087 [Microsoft] [SQL Native Client] [SQL Server]必须声明表变量“
@ P1”。(第40行上的(长文件路径)中的(SQLExecute [1087]在ext \ pdo_odbc \ odbc_stmt.c:254处)

以下是相关代码:

$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行的(长文件路径)中未定义参数

为什么不喜欢我准备好的陈述?


阅读 351

收藏
2021-07-01

共1个答案

admin

您无法在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()

2021-07-01