我正在尝试使用 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) 在第 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 行(长文件路径)中定义
为什么它不喜欢我准备好的陈述?
您无法将参数绑定到 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()
or bindValue()
。通常,将数组参数中的参数值传递给execute()
.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)