2017-12-03 47 views
0

我試圖檢查某個記錄是否符合以下條件:狀態爲「文件已關閉」,not_visible =「0」且status_date早於14天或更早。如果發現多於1條記錄,則循環執行sql語句

如果條件滿足,將not_visible「0」更新爲「1」。

這是調用每當

問題在用戶登錄: 的SQL只運行一次發現即使10條記錄。我如何循環它來完成更新所有找到的記錄並在完成後退出語句?

global $conn; 
$strSQLExists = "select lead_id as a, status_date as b, not_visible as c from tbl_progress where status = 'File Closed' and not_visible = '0' and status_date <= DATE_ADD(CURDATE(), INTERVAL -14 DAY) "; 
$rsExists = db_query($strSQLExists,$conn); 
$data=db_fetch_array($rsExists); 
if($data) 
{ 
$sql = "UPDATE tbl_progress SET not_visible = '1' WHERE lead_id = '".$data["a"]."'"; 
CustomQuery($sql); 
return false; 
} 
else 
{ 
    // if dont exist do something else 
} 

當時勸,只是更新: 所以我們在這裏:

UPDATE tbl_progress SET not_visible = '1' WHERE status = 'File Closed' and not_visible = '0' and status_date <= DATE_ADD(CURDATE(), INTERVAL -14 DAY) 
+2

您的代碼易受SQL注入攻擊。另外,你爲什麼先「選擇」?只要做一個'更新'。 – melpomene

+0

不要使用字符串連接將值插入到SQL中,請使用參數。在這種情況下,避免了格式化該值的需要,更一般地說,當敵對數據滑過時它可以節省您的時間。 – Richard

+0

使其成爲一個語句(更新)的優點是它可以在一個語句中更新符合條件的所有記錄。這是現在學習有用的東西! –

回答

0

使用update語句只(根據您的編輯)應該解決這個問題做。事實上,使用更新修復

  1. 的循環問題,因爲它更新匹配的所有記錄,不只是一個
  2. SQL注入的問題,因爲沒有周圍傳遞的參數和SQL語句
  3. 沒有字符串連接
  4. 有什麼東西在選擇之間切換時可能出現與更新

這也將是會更有效,因爲它推向DB邏輯的競爭條件問題。

簡而言之:使用更新而不是選擇+更新將修復循環問題和其他一些您不知道的問題,所以請使用它。