我试图在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行的(长文件路径)中未定义参数
为什么不喜欢我准备好的陈述?
您无法在SQL中将参数绑定到表名。在任何语言,任何数据库中都是如此。
您必须在之前将表名称插入查询字符串中prepare()。
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()。
bindParam()
bindValue()
execute()