將參數綁定到SQL語句時,可以提供參數類型,如PDO::PARAM_STR
。如果不這樣,請輸入默認值PDO::PARAM_STR
。什麼可以是專門設置每個參數類型的原因?至少在MySQL中,PDO :: PARAM_STR與任何參數一起工作。我認爲即使使用PDO :: PARAM_STR也可以使用BLOB列。在PDO中強類型參數的原因是什麼?
PDO :: PARAM_STR不會引入任何SQL注入,因爲您仍然有準備好的查詢。
將參數綁定到SQL語句時,可以提供參數類型,如PDO::PARAM_STR
。如果不這樣,請輸入默認值PDO::PARAM_STR
。什麼可以是專門設置每個參數類型的原因?至少在MySQL中,PDO :: PARAM_STR與任何參數一起工作。我認爲即使使用PDO :: PARAM_STR也可以使用BLOB列。在PDO中強類型參數的原因是什麼?
PDO :: PARAM_STR不會引入任何SQL注入,因爲您仍然有準備好的查詢。
使用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之外的數據庫引擎,這些引擎對他們的期望可能更爲嚴格。
我個人認爲沒有理由,只要你有這個屬性設置:
$dbh->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);
所以,它會檢測極限情況自動
反正我寧願在一個佔位符定義類型,沒有綁定功能。
但是,我的PDO經驗並不強。我只是試了一下,決定回到普通的mysql。
+1 from me,excellent example。這不僅僅是應該避免的SQL注入,向用戶顯示原始的MySQL錯誤消息並不真正具有吸引力,也不是專業的,所以開發者**應該始終強制執行類型安全。 – 2011-04-26 17:21:28
@ N.B。對我來說太無聊了。我寧願簡潔的代碼重複一遍又一遍的這種綁定 – 2011-04-26 17:23:56
太無聊做什麼? – 2011-04-26 17:25:00