2010-01-14 41 views
2

我正在用mysql和php做我的第一步,所以我對正確的代碼優化的基礎規則有所懷疑。關於關係型MySql表的UPDATE語句的基本規則:對於vs

我有一個情況,我的UPDATE語句需要在一定數量的行上執行,因爲它應該在關係表上執行,所以對於cicle而言是正確的?

<? 
// connection already created 
$data[] = array ("id" => 54, "enabled" => 1); 
$data[] = array ("id" => 33, "enabled" => 0); 
$data[] = array ("id" => 12, "enabled" => 0); 
$data[] = array ("id" => 58, "enabled" => 0); 
$data[] = array ("id" => 21, "enabled" => 1); 
$data[] = array ("id" => 10, "enabled" => 1); 
$data[] = array ("id" => 18, "enabled" => 0); 
$data[] = array ("id" => 32, "enabled" => 1); 
$data[] = array ("id" => 84, "enabled" => 0); 
$data[] = array ("id" => 80, "enabled" => 1); 

for (var $i = 0; $i < count ($data); $i ++) { 

    $id = $data[$i]["id"]; 
    $enabled = $data[$i]["enabled"]; 

    $sql = "UPDATE users SET user_enabled = '$enabled' WHERE user_id = '$id' LIMIT 1;"; 
    $res = mysql_query ($sql); 
    $num = mysql_num_rows ($res); 

} 


?> 

我應該使用whilefor循環? 這段代碼是否對多個UPDATE有效,或者確實存在一些更好的特定查詢這種操作?

+1

如果您需要更新的記錄數量足夠大時,它有時不如做一個批量插入到一個臨時表,然後通過與臨時表的JOIN更新目標表。 – 2010-01-14 18:43:29

回答

1

幾點意見:

  • 計算在循環的每次迭代count($data)是不必要的成本。開始循環count($data)並計數下降,或者@Ignacio建議,使用foreach

  • 這是一個很好的例子,它使用帶參數的準備好的查詢是一個好處。但是這個特性在PHP的普通mysql擴展中不被支持。你將不得不使用mysqli或最好是PDO

  • 您不必在SQL表達式中引用整數值。

  • mysql_num_rows()對於UPDATE查詢沒有意義。您可能打算使用mysql_affected_rows()

  • 我不知道你爲什麼在這個查詢使用LIMIT,因爲我猜想,user_idusers表的主鍵,所以你永遠不會無論如何更新多行。

這是我會怎麼寫代碼:

<?php 
// PDO connection already created 
$data[] = array ("id" => 54, "enabled" => 1); 
...etc... 

$sql = "UPDATE users SET user_enabled = :enabled WHERE user_id = :id"; 
$stmt = $pdo->prepare($sql); 

foreach ($data as $parameters) { 

    $success = $stmt->execute($parameters); 
    $num = $stmt->rowCount(); 

} 


?> 
+0

我喜歡這個網站只是爲了一件事,你學會了 – vitto 2010-01-14 18:32:26

3

對於有限長度的序列,應該使用foreach循環。

0

你可以使用一個RecursiveArrayIterator

<? 
// connection already created 
$data[] = array ("id" => 54, "enabled" => 1); 
$data[] = array ("id" => 33, "enabled" => 0); 
$data[] = array ("id" => 12, "enabled" => 0); 
$data[] = array ("id" => 58, "enabled" => 0); 
$data[] = array ("id" => 21, "enabled" => 1); 
$data[] = array ("id" => 10, "enabled" => 1); 
$data[] = array ("id" => 18, "enabled" => 0); 
$data[] = array ("id" => 32, "enabled" => 1); 
$data[] = array ("id" => 84, "enabled" => 0); 
$data[] = array ("id" => 80, "enabled" => 1); 

$data = new RecursiveArrayIterator($data); 

for (var $i = 0; $i < count ($data); $i ++) { 

    $id = $data[$i]["id"]; 
    $enabled = $data[$i]["enabled"]; 

    $sql = "UPDATE users SET user_enabled = '$enabled' WHERE user_id = '$id' LIMIT 1;"; 
    $res = mysql_query ($sql); 
    $num = mysql_num_rows ($res); 

} 


?>