【问题标题】:PDO and Microsoft SQL: Must declare the table variable "@P1"PDO 和 Microsoft SQL:必须声明表变量“@P1”
【发布时间】:2010-07-23 16:36:43
【问题描述】:

我正在尝试使用 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);

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

警告:PDOStatement::bindValue() [pdostatement.bindvalue]: SQLSTATE[HY093]: Invalid parameter number: parameter was not defined in (long file path) on line 39

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

【问题讨论】:

    标签: php sql sql-server-2008 pdo parameterized


    【解决方案1】:

    您不能将参数绑定到 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() 通常更容易。

    【讨论】:

      猜你喜欢
      • 2020-04-08
      • 2021-06-28
      • 1970-01-01
      • 1970-01-01
      • 2012-05-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多