【问题标题】:Number of bound variables does not match number of tokens PDO绑定变量的数量与令牌 PDO 的数量不匹配
【发布时间】:2014-08-05 03:28:35
【问题描述】:

对于 PDO(和一般的 OOP)相对较新,我的 3 命名参数给了我一个错误。这是我编写的用于检查数据库中是否已存在值的函数(因此我不会有重复的条目):

function checkTable($table, $column, $value, $con) {
    $stmt = $con->prepare("SELECT * FROM :tbl WHERE :col = :val");
    $stmt->execute(['tbl' => $table, 'col' => $column, 'val' => $value]);

    return $stmt->fetchAll();
}

当然 $con 是 PDO 连接(是的,我已经检查过了,它已连接,我可以在数据库上运行正常查询) 我用这段代码调用函数:

checkTable("posts", "title", "title", $con);

我希望看到 true 被返回,因为我输入的值确实存在于数据库中,但我得到的只是

'SQLSTATE[HY093]: Invalid parameter number: number of bound variables does not match number of tokens'

编辑:我已经在一个函数之外对此进行了测试,结果正如预期的那样:

$bind = ['tbl' => "posts", 'col' => "title", 'val' => "title"];
$query = query("SELECT * FROM :tbl WHERE :col = :val", $con, $bind);
var_dump($query);

query() 函数如下所示:

function query($query, $con, $bind = null) {
    try {
        $stmt = $con->prepare($query);
        $stmt->execute($bind);
        $stmt->setFetchMode(PDO::FETCH_ASSOC);
        $result = $stmt->fetchAll();

        return $result;
    } catch(Exception $e) {
        return false;
    }
}

【问题讨论】:

  • 您不能在查询需要标识符的情况下使用绑定变量。在您的情况下,:tbl 是一个表名 - 您不能将变量绑定到它。
  • "SELECT * FROM :tbl WHERE :col = :val") $tbl="tablename"; $col="column_name"; 然后 "SELECT * FROM $tbl WHERE $col = :val")
  • 占位符可以在查询中表示 ONLY 值。永远不要使用 sql 关键字或字段/表名。
  • 感谢弗雷德、迈克和马克!感谢你们,重写了我的代码以使其正常工作:)

标签: php pdo


【解决方案1】:

您不能在准备好的语句中使用表名和列名进行替换。 :tbl - 是一个表名。因此,您的查询中只有两个标记 :col, :val

:col 也将替换为 'column_name'(带引号)。条件看起来像'column_name'='value'

【讨论】:

  • 太好了,正是我正在寻找的答案!重写代码使其在没有命名参数的情况下工作,它就像一个魅力:-) 谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-07-31
  • 2014-07-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多