【问题标题】:PDO execute with array returns null使用数组执行 PDO 返回 null
【发布时间】:2014-08-17 01:34:33
【问题描述】:

我尝试像往常一样使用好的 PDO,几乎一切正常,但只有一个查询:

$primary = 'my_id';
$table = 'my_table';
// This or...
$statement = $this->conn->prepare("SELECT MAX(:id) AS id FROM :table");
        $statement->bindParam(':id', $primary, PDO::PARAM_STR);
        $statement->bindParam(':table', $table, PDO::PARAM_STR);
        $statement->setFetchMode(PDO::FETCH_ASSOC);
        $statement->execute();

// This one. Both doesn't work.

$statement = $this->conn->prepare("SELECT MAX(:id) AS id FROM :table");
        $statement->setFetchMode(PDO::FETCH_ASSOC);
$arr = array(
            ':id' => 'my_id',
            ':table' => 'my_table',
        );
        $statement->execute($arr);

这些只是返回一个空数组。我感到很困惑。所以我试过了:

$statement = $this->conn->prepare("SELECT MAX(".$primary.") AS id FROM ".$table);
        $statement->setFetchMode(PDO::FETCH_ASSOC);
        $statement->execute();

而且它有效。我觉得我错过了一些东西,但无法弄清楚。很明显,绑定存在问题,我尝试了不同的变体,例如手动编写变量之一,但到目前为止没有运气。

提前感谢您的帮助...

【问题讨论】:

  • @Fabio 我从没想过。这就是我所缺少的。非常感谢...
  • 是的!不客气,伙计
  • 如果我只用正则表达式检查表或列名称字符串并像“SELECT * FROM $table”一样使用它,会有副作用吗?

标签: php pdo


【解决方案1】:

您不能在 PDO 中使用参数作为表名,因此您必须更改它以避免这种情况。这不是 PDO 的限制,而是 MySQL 的直接限制。 manual 声明

参数标记只能在数据值应该出现的地方使用, 不适用于 SQL 关键字、标识符等。

表名和列名是标识符,因此不支持为它们使用占位符。请参阅this question 了解替代方法。

【讨论】:

  • 这不可能是一个答案
  • @Fabio:为什么不呢?即使您链接到的问题中已接受的答案也说明了这一点……
  • 这就是为什么我发表评论而你给出答案的原因。评论与答案不同。无论如何,这个答案解释了原因,你只说:you can't use, read here
  • 虽然此链接可能会回答问题,但最好在此处包含答案的基本部分并提供链接以供参考。如果链接页面发生更改,仅链接的答案可能会失效。
  • @RetoKoradi 怎么样?
猜你喜欢
  • 1970-01-01
  • 2017-11-28
  • 2012-05-03
  • 1970-01-01
  • 2011-12-01
  • 2019-01-29
  • 2015-04-15
  • 2015-10-04
  • 2014-02-02
相关资源
最近更新 更多