2011-03-18 38 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」,如果不同,你就知道存在問題或入侵企圖。