2013-04-08 78 views
0

我需要使用這樣毫無意義的SQL與PHP如果

foreach($items as $item) 
{ 
$sql = "UPDATE `siteims` SET refs = refs + 1 WHERE imid = '{$item->img}';"; 
$sql .= "UPDATE `lists` SET refs = refs + 1 WHERE lid = '{$item->lili}'"; 
$dbh->exec($sql); 
} 

代碼操作在MySQL表中的條目有可能是在$項目多達50項。此代碼的一個變種將是

foreach($items as $item) 
{ 
if ('z' != $img->img) 
$sql = "UPDATE `siteims` SET refs = refs + 1 WHERE imid = '{$item->img}';"; 
if ('z' != $item->lili) 
$sql .= "UPDATE `lists` SET refs = refs + 1 WHERE lid = '{$item->lili}'"; 
$dbh->exec($sql); 
} 

在這兩種情況下,我正在執行每個項目在$項目中的SQL語句序列。我的問題

  1. 這豈不是一大堆更有效的建立$ SQL爲項目然後執行它?
  2. 但是,如果$ items中的所有潛在的50個項目都會產生有意義的SQL,那麼這並不意味着一個非常慢的SQL語句批處理?
  3. 最後,如果的測試與我的代碼的第二版一樣,或者只是構建SQL並讓mySQL處理WHERE測試返回空行的事實,那麼執行PHP方面會更好嗎?

我非常感謝任何幫助。

+0

你當然可以構建測試來回答這些問題嗎?看來你的問題的答案在於另一個問題:你的瓶頸在哪裏? – 2013-04-08 04:16:09

+2

''z'!= strlen($ img-> img)' - 那是什麼? o_O – zerkms 2013-04-08 04:16:13

+0

看上去很好 - 那裏應該沒有strlen。我正在考慮放入另一個版本的代碼,因爲我放在這個 – DroidOS 2013-04-08 04:22:25

回答

3

您可以使用in子句,例如,

$sql = "UPDATE .... WHERE imid IN (" . implode($array_that_has_the_ids) . ")" 

並將自己減少到只有一個SQL查詢。但是,如果您嘗試使用HUGE aray,則可能會失敗 - 生成的查詢可能會超出max_allowed_pa​​cket設置並被終止。

至於你的strlen ...什麼是比較strlen結果與'z'? strlen返回一個整數,你可能會改爲if (apple == orange)

+0

strlen位是一個紅鯡魚。我正在考慮另一個版本的代碼,因爲我全部輸入了。 – DroidOS 2013-04-08 04:23:47

1

在第一個地方我建議你在子句中使用,只是2個獨立的查詢...... 您可能需要逃生者2個元素$用品 - > IMG和$用品 - >麗麗..

$ids = array("siteims"=>array(), "lists"=>array()); 
foreach($items as $item) 
{ 
    $ids['siteims'][] = "'" . $item->img . "'"; 
    $ids['lists'][] = "'" . $item->lili . "'" ; 
} 
if(!empty($ids['siteims'])){ 
    $sql = "UPDATE `siteims` SET refs = refs + 1 WHERE imid IN (".implode(',', $ids["siteims"]).")"; 
    $dbh->exec($sql); 
} 

if(!empty($ids['lists'])){ 
    $sql = "UPDATE `lists` SET refs = refs + 1 WHERE lid IN (".implode(',', $ids["lists"]).")"; 
    $dbh->exec($sql); 
} 
+0

謝謝!使用IN子句當然是一個好主意。 – DroidOS 2013-04-08 04:34:00

+0

我是「不接受」這個答案的原因。問題在於 - 如果存在重複的條目,IN子句無法正確處理refs列的調整。例如如果我的數組最終包含('idA','idB','idA','idC'),那麼idA行的參考列將只調整一次 - 而不是期望的結果。 – DroidOS 2013-04-08 07:25:31

+0

我不知道你的元素可以重複.. – Svetoslav 2013-04-08 08:09:48