2017-12-03 1 views
0

ステータスが "File Closed"、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 
} 

はちょうど更新するadvicedた: はので、ここで私たちは、次のとおりです。

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

1つのステートメント(UPDATE)を作成する利点は、1つのステートメント内の条件に一致するすべてのレコードを更新することです。これは今学ぶのに役立つものです! –

答えて

0

だけ(あなたの編集あたりなど)の問題を修正する必要があります更新ステートメントを使用してそれをやって。それが一致するすべてのレコードを更新して周りに渡さはパラメータおよびSQL文の無い文字列の連結が存在しないとして、実際に、アップデートを使用すると、ちょうど1

  • SQLインジェクションの問題ではありません、

    1. ループ問題を修正し
    2. 何かが選択の間で変更された場合に発生し、それがデシベルにロジックをプッシュするとそれはまた、もう少し効率的になります

    を更新する可能性がある競合状態の問題が。

    要するに、select + updateの代わりに更新を使用すると、ループの問題やあなたが知りませんでしたその他の問題が修正されるので、それを使用してください。