【问题标题】:PHP PDO prepared query refuses to execute properly - escaping problem?PHP PDO 准备好的查询拒绝正确执行 - 转义问题?
【发布时间】:2009-06-29 22:53:21
【问题描述】:

我在使用 PDO 在 PHP 中准备的查询时遇到问题。代码:

$link = new PDO("mysql:dbname=$dbname;host=127.0.0.1",$username,$password);
$link->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$query = $link->prepare("SELECT locality_name FROM :passedday GROUP BY locality_name ORDER BY locality_name DESC");
$query->bindParam(":passedday",$day); //Where day is, well, a day passed to the script elsewhere
$query->execute();
$result = $query->fetchAll();
$link = null;
//Do things with the $result.

我得到的错误信息是:

SQLSTATE[42000]:语法错误或访问冲突:1064 您的 SQL 语法有错误;检查与您的 MySQL 服务器版本相对应的手册,以在第 1 行的 ''05_26_09' GROUP BY locality_name ORDER BY locality_name DESC' 附近使用正确的语法

当我直接在服务器上执行查询时,它会毫无问题地返回适当的结果集。任何想法我做错了什么?

TIA。

编辑:

$day 作为 GET 参数传递。所以,http://127.0.0.1/day.php?day=05_26_09 导致$day = $_GET['day'];

【问题讨论】:

    标签: php mysql pdo


    【解决方案1】:

    如果05_26_09 应该赌桌的名字,那么我猜你有一个逃避问题。您的本地操作系统与实时服务器不同吗?

    我认为您不能将bindValue()/bindParam() 用于值以外的其他内容(例如表名、字段名)。所以我有点惊讶,它可以在你的本地系统上运行。

    【讨论】:

    • 刚刚在 Google 上发现了这一点。谢谢。
    【解决方案2】:

    PDO 使用 mysql 的 C-API 来准备语句。
    http://dev.mysql.com/doc/refman/5.0/en/mysql-stmt-prepare.html 说:

    标记仅在 SQL 语句中的某些位置是合法的。 [...] 但是,它们不允许用于标识符(例如表名或列名)
    根据经验,我使用:“如果您不能将其包装在 ad-hoc 中的单引号中查询字符串,您不能在准备好的语句中对其进行参数化”

    【讨论】:

      猜你喜欢
      • 2015-12-08
      • 2014-09-16
      • 2011-06-02
      • 1970-01-01
      • 2012-05-16
      • 2011-06-21
      • 1970-01-01
      • 1970-01-01
      • 2011-07-13
      相关资源
      最近更新 更多