2013-05-31 51 views
1

我改變現有的數據存儲PHP代碼從mysql_*功能PDO以及從程序改變它OOB編程。我在注意到某些事情時更新了SQL語句,這與重寫過程相差甚遠。對PDO數組插入值的順序有限制嗎?

我正在設置爲多個表INSERTUPDATE查詢的陣列,因爲我定義數組作爲我注意到結合值的工作,該順序,其中結合值稱爲將來自UPDATE不同到INSERT,這裏是一個簡單的例子:

$bound_values = array(
    ':column_aa' => 'aa', 
    ':column_ab' => 'ab', 
    ':column_ac' => 'ac' 
    ) 
); 

例如,SQL爲INSERT

INSERT INTO `table_a` 
    (`id`, `column_aa`, `column_ab`, `column_ac`) 
VALUES 
    ('', :column_aa, :column_ab, :column_ac); 

UPDATE

UPDATE `table_a` SET 
    `column_ab` = :column_ab, `column_ac` = :column_ac, `column_aa` = :column_aa; 

示例PHP PDO:

$pdo = new PDO('mysql:host=localhost;dbname=example', 'root', ''); 
// The second parameter of the PDO cursor is what I saw that raised the flag 
$sth = $pdo->prepare($sql, array(PDO::ATTR_CURSOR => PDO::CURSOR_FWDONLY)); 
$sth->execute($boud_values); 

所以我的問題是,我可以不停地前進使用這種方法沒有問題,至於是什麼爲了使SQL語句與$bound_values數組相匹配,還是我很關心並需要做出一些更改?

請注意,我正在使用的現有代碼並不是附近的,就像我上面顯示的SQL語句一樣簡單。

+3

只要您使用命名的標識符,而不是簡單'?'那麼也不要緊什麼順序排列是英寸 – Sammitch

+1

好消息,這就是爲什麼我開始使用命名的標識符,但每一個例子,我看到了他們然後看到'CURSOR_FWDONLY'我開始擔心。謝謝@sammitich,如果你會如此友善,請發表您的評論作爲答案,我會接受它。再次感謝。 –

+0

只要接受,@ robert-widdick's。這也是對的,他可以使用一些觀點。; D – Sammitch

回答

3

使用命名佔位符(:col_name),您可以按照您的請求以任意順序放置它們。但是,使用位置佔位符(?) - 您需要按順序放置它們。

2

只要您使用命名參數(:somename),則無關緊要。的結合只是告訴你的數據庫引擎「裏我寫的佔位符:abc,填補這個值。我在哪裏寫的佔位符:xyz,把這個其它的值」。

想想代碼會是什麼樣子,如果你是在一次在執行

$sth->bindParam(':abc', 'value1', PDO::PARAM_STR); 
$sth->bindParam(':xyz', 'value2', PDO::PARAM_STR); 
$sth->execute(); 

切換bindParam()命令不會有任何影響,結合每個值分別代替所有。

此外,請注意在INSERT和UPDATE sql查詢中設置列的順序無關緊要,所以如果這確實會使您錯誤(或者如果您喜歡將某些事情標準化),您可以訂購在兩個查詢中以相同的方式列。

UPDATE table SET col2 = 'xyz', col1 = 'abc' 
// is the same as 
UPDATE table SET col1 = 'abc', col2 = 'xyz' 
+0

缺乏標準化或一致性是我的一個大寵物,所以最終'UPDATE'語句將反映列/ INSERT語句的順序,但是查詢太多而且時間太少。感謝您的回答和解釋+1 –