這是一個從這個答案下評論,但我真的不弄明白他的意思:PHP在準備好的語句中引用時需要什麼時候?
How to change from mysql to pdo using prepared statements in PHP?
這是一個從這個答案下評論,但我真的不弄明白他的意思:PHP在準備好的語句中引用時需要什麼時候?
How to change from mysql to pdo using prepared statements in PHP?
當使用預處理語句你從來沒有逃避/報價爲DBMS字符串參數(解析器)手動。
評論與http://docs.php.net/pdo.prepared-statements:
準備好的語句非常有用,它們是PDO將爲不支持它們的驅動程序模擬的唯一功能。即,如果驅動程序不支持預處理語句,則PDO仍將公開api的準備語句部分,並將它們「翻譯」爲包含參數的sql語句(例如
INSERT INTO foo (x,y,z) values(1,2,3)
)。但它會透明地實現,即它會自動處理報價。
準備好的語句準備好了,因爲您爲PDO插入值創建了標記,並且可以命名這些值(例如,:accountId,:url),PDO將在其中找到指定的標記或位置(具體而言,是一個問號(?)),其中PDO將按照標記的放置順序插入值。
例如:
$query = "SELECT user_id FROM users WHERE username = ?"; $statement = $pdo->prepare($query); $statement->execute(array("John Smith"));
通知的明顯缺乏命名參數(具體地,使用一個替代的:用戶名),和位置樣式來代替。儘管我發現在調試時使用命名參數更清晰,但純粹是個人選擇使用其中一種。
反正。這意味着如果您使用準備好的語句,則不必引用它,並且在使用準備好的語句時不必擔心SQL注入。
現在真正發生的是PDO要求數據庫驅動程序(MySQL,PostgreSQL,MS SQL,Oracle等)準備語句,但是如果數據庫驅動程序無法準備,PDO將模擬該功能。在這裏事情開始變得令人困惑,但你可以放心地忘記它,只記得使用帶有參數的準備好的語句。
MySQL **如何準備**它? – user198729
它解析語句,查找可以添加參數的位置,準備查詢計劃,....然後它向客戶端返回一個標識符。客戶端然後可以發送標識符+參數數據並執行語句。 – VolkerK
如果您使用$ dbh-> query(),您仍然需要引用它,因爲它不是準備好的語句(與PDO類相關) – axsuul