2011-07-19 65 views
4

我將要切換我在幾個站點/項目中使用的數據庫類,從使用自定義的mysql_query方法*到使用PDO和預處理語句。不過,我首先有一個問題 - 我是否想使用準備好的語句無處不在?即使在查詢只會運行一次的地方?怎麼樣,我需要做的是這樣的情況:在PHP中使用預處理語句嗎? (PDO)

INSERT INTO `table` (`column`, `column`) VALUES ('value','value'), ('value','value'),('value','value'), etc. 

我應該使用一個單一的準備語句(而單個值),但與不同的變量執行它每一次,或者我應該使用上面的風格?如果我在這裏使用準備好的語句,我們在談論性​​能受到多大影響?我需要在這種情況下使用交易嗎?

*我的mysql_query方法與預先準備的語句類似,用戶可以撥打$mysql->Query("SELECT * FROM%s WHERE '%s'='%s'", $var, $var, $var),該方法會自動使用mysql_real_escape_string轉義所有內容。

+0

爲了您對質量插入的關注,請看下面這個:[PDO Prepared在單個查詢中插入多行](http://stackoverflow.com/questions/1176352/pdo-prepared-inserts-multiple-rows-in -single-query) – Jacob

回答

3

僅使用PDO參數將變量傳遞到查詢中。

您可以使用準備好的聲明中多個刀片以及:

$insertQuery = 'INSERT INTO table (col1, col2) VALUES '; 
$insertQueryData = array(); 
$insertData = array(); 

foreach ($data as $record) { 
    $insertQueryData[] = '(?, ?)'; 
    $insertData[] = $record['col1']; 
    $insertData[] = $record['col2']; 
} 

$insertQuery .= implode(', ', $insertQueryData); 

$statement = $db->prepare($insertQuery); 
$statement->execute($insertData); 
1

你應該每次做準備的語句。但是,您可能希望編寫一個小型幫助程序:準備,綁定和運行查詢,不需要多行代碼即可完成。

+3

這是我之前做的一個:[Simple PDO wrapper](http://stackoverflow.com/questions/6740153/simple-pdo-wrapper) – Mike

6

準備好的語句對SQL注入提供了很好的保護,它們還爲某些類型的查詢提供了性能優勢。就個人而言,我會在任何地方使用它們。

如果您發現特定的查詢導致性能問題,可以執行一些分析來追蹤問題的原因,然後根據需要優化代碼或查詢。但在出現問題之前不要試圖進行微觀優化。

至於交易,只需在需要時使用它們。例如,當您需要執行一系列全有或全無更新時,如果出現故障,整個批次必須失敗。這些對於像多對多關係這樣的事情很有用,其中必須更新三個表,並且如果發生故障,您不希望部分關係保持不變。