2011-03-18 76 views
4

看来不管我传递给$pdo->quote($value, $type);什么价值/数据类型对,它总是引用它作为一个字符串:的MySQL/PDO ::引号(),把周围的整数单引号

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

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

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

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

+0

什么内插查询字符串?您正在添加的功能(例如调试)? MySQL中编写的语句不会将值插入语句中;准备好的语句参数值从准备好的语句中概念地发送[带外](http://en.wikipedia.org/wiki/Out-of-band)。 – outis 2011-03-18 19:18:34

+0

是的,用于调试和缓存目的。 – Dan 2011-03-18 19:59:54

回答

5

OracleSQLiteMSSQL,并Firebird司机所有报价为PDO MySQL driver,忽略参数类型。 PostgreSQL driver只区分binary large objects和其他所有。 ODBC Driver不实施报价。您期望的(缺乏)行为是reported as a bug,并且以“伪造”的形式关闭,这意味着该行为是通过设计来实现的。也许,它指出该文档误导:

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

虽然这表明有可能情况下,当值AREN”被引号括起来,它并没有说明肯定存在,也没有说明这些实例是什么。如果您觉得这是文档中的错误,请提交一个bug report,最好有一个修复程序。

+0

好的,谢谢** outis **;我只是想确定,既然它是预期的功能,我不应该指望(m)任何问题。我相信这是PHP文档,特别是你引用的行,这让我想知道。 – Dan 2011-03-18 20:20:10

+0

这个问题有一个开放的错误报告。正如答案所暗示的,对于这是代码错误还是文档错误还是两者都没有争议。 https://bugs.php.net/bug.php?id=44639 – gerard 2012-10-28 20:48:15

+0

@gerard:看起来像一个不同的bug,因为它在'PDO :: bindValue'而不是'PDO :: quote'。另外,[PDO :: bindValue'中的类型转换](http://git.php.net/?p=php-src.git;a=blob;f=ext/pdo/pdo_stmt。c; h = 31932eb3c2a728439388cc004967d046dff6917c; hb = HEAD#l1647)看起来像在'PDO :: quote'中分开处理,因为前者使用['really_register_bound_param'](http://git.php.net/?p = PHP-src.git; A =斑点; F = EXT/PDO/pdo_stmt.c; H = 31932eb3c2a728439388cc004967d046dff6917c; HB = HEAD#L302)。 – outis 2012-11-03 05:58:33

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”,如果不同,你就知道存在问题或入侵企图。