2010-02-06 59 views

回答

1

當使用預處理語句你從來沒有逃避/報價爲DBMS字符串參數(解析器)手動。
評論與http://docs.php.net/pdo.prepared-statements

準備好的語句非常有用,它們是PDO將爲不支持它們的驅動程序模擬的唯一功能。
即,如果驅動程序不支持預處理語句,則PDO仍將公開api的準備語句部分,並將它們「翻譯」爲包含參數的sql語句(例如 INSERT INTO foo (x,y,z) values(1,2,3))。但它會透明地實現,即它會自動處理報價。

1

準備好的語句準備好了,因爲您爲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將模擬該功能。在這裏事情開始變得令人困惑,但你可以放心地忘記它,只記得使用帶有參數的準備好的語句。

+0

MySQL **如何準備**它? – user198729

+0

它解析語句,查找可以添加參數的位置,準備查詢計劃,....然後它向客戶端返回一個標識符。客戶端然後可以發送標識符+參數數據並執行語句。 – VolkerK

相關問題