MySQL / PDO :: quote(),在整数周围加上单引号

时间:2011-03-18 18:19:17

标签: mysql types pdo querystringparameter

无论我传递给$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 */

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

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

2 个答案:

答案 0 :(得分:5)

OracleSQLiteMSSQLFirebird驱动程序都引用为PDO MySQL driver,忽略了参数类型。 PostgreSQL driver仅区分binary large objects和其他所有其他内容。 ODBC Driver没有实现引用。您期望的(缺乏)行为是reported as a bug并且关闭为“虚假”,这意味着行为是设计的。也许文档在说明时会产生误导:

  

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

虽然这表明可能是值不被引号括起来的实例,但它并没有确实存在,也没有说明这些实例是什么。如果您认为这是文档中的错误,请提交bug report,最好提供修复。

答案 1 :(得分: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"对于这两个变量,如果存在差异,则表示存在问题或入侵企图。