2011-04-26 53 views
10

將參數綁定到SQL語句時,可以提供參數類型,如PDO::PARAM_STR。如果不這樣,請輸入默認值PDO::PARAM_STR。什麼可以是專門設置每個參數類型的原因?至少在MySQL中,PDO :: PARAM_STR與任何參數一起工作。我認爲即使使用PDO :: PARAM_STR也可以使用BLOB列。在PDO中強類型參數的原因是什麼?

PDO :: PARAM_STR不會引入任何SQL注入,因爲您仍然有準備好的查詢。

回答

7

使用PARAM_STR恰好始終在列值中工作,因爲MySQL的implicitly converts values to the correct type where it can,但它會在此查詢失敗,例如:

$limit = 1; 

$dbh->prepare("SELECT * FROM items LIMIT :limit"); 
$dbh->bindParam(":limit", $limit, PDO::PARAM_STR); 
    // Will throw "You have an error in your SQL syntax..." 

一個絕對應該使用PARAM_INT酌情 - 對於像上面的案例,準備除mySQL之外的數據庫引擎,這些引擎對他們的期望可能更爲嚴格。

+0

+1 from me,excellent example。這不僅僅是應該避免的SQL注入,向用戶顯示原始的MySQL錯誤消息並不真正具有吸引力,也不是專業的,所以開發者**應該始終強制執行類型安全。 – 2011-04-26 17:21:28

+0

@ N.B。對我來說太無聊了。我寧願簡潔的代碼重複一遍又一遍的這種綁定 – 2011-04-26 17:23:56

+0

太無聊做什麼? – 2011-04-26 17:25:00

5

我個人認爲沒有理由,只要你有這個屬性設置:

$dbh->setAttribute(PDO::ATTR_EMULATE_PREPARES, false); 

所以,它會檢測極限情況自動

反正我寧願在一個佔位符定義類型,沒有綁定功能。

但是,我的PDO經驗並不強。我只是試了一下,決定回到普通的mysql。

相關問題