5

无论我传递给什么值/数据类型对$pdo->quote($value, $type);,它似乎总是将它作为字符串引用:

echo $pdo->quote('foo', PDO::PARAM_STR); /* 'foo', as expected */

echo $pdo->quote(42, PDO::PARAM_INT);    /* '42', expected 42 unquoted */

我只是想知道这是否是预期的功能。我使用准备好的语句来执行实际的查询,但我试图获取 创建最终的查询字符串(用于调试/缓存),并手动构建它们。

正如标题所示,这是$pdo使用 MySQL 驱动程序创建的时间。由于不可用,我没有尝试过其他人。

4

2 回答 2

6

OracleSQLiteMSSQLFirebird驱动程序都引用为PDO MySQL 驱动程序,忽略参数类型。PostgreSQL 驱动程序只区分二进制大对象和所有其他对象。ODBC 驱动程序不实现引用器。您期望的(缺少)行为被报告为错误并被关闭为“虚假”,这意味着该行为是设计使然。也许文档在说明时具有误导性:

PDO::quote() 在输入字符串周围放置引号(如果需要)

虽然这表明可能存在值没有被引号包围的情况,但它并没有说肯定存在,也没有说明这些实例是什么。如果您认为这是文档中的错误,请提交错误报告,最好带有修复程序。

于 2011-03-18T19:16:13.167 回答
0
  public static function quote($value, $pdotype = PDO::PARAM_STR)
    {
        if ($pdotype == PDO::PARAM_INT)
            return (int)$value;
        return Db::pdo()->quote($value, $pdotype);
    }

根据 PDO 开发人员的说法,这是他们的代码和文档中的故意错误。
他们似乎不打算纠正它,因此您可以通过包装他们的错误函数并根据需要替换行为来自己完成。
您实际上别无选择,因为在某些情况下您需要正确的数字引用行为,您不能在任何地方都使用字符串引用,因为 SQL 可能不会接受它。

作为旁注,上述函数会将任何非法数据设为 0。
SQL 注入是不可能的,但它不会抛出错误。如果您想捕获错误,您可以对两个变量执行“strlen”,如果不同,您就知道存在问题或入侵尝试。

于 2016-10-17T19:34:19.587 回答