2015-12-29 54 views
-1

我有一些數據與用戶名和日期。SQL插入或更新超時循環中的大日期

有時候會有大量數據需要循環並更新sql數據庫,但數據庫超時。

有沒有更好的方法可以做到這一點,請在下面的示例代碼。

foreach($time[$re->userid][$today] as $t){ 

       if(($re->time >= $t->in_from) && ($re->time < $t->in_to) 
        && md5($t->WorkDay."_in".$re->date) != $in){//in 

        $tble = tools::sd("{$t->WorkDay} in"); 
       } 

       if(($re->time >= $t->out_from) && ($re->time < $t->out_to) 
        && md5($t->WorkDay."_out".$re->date) != $out){//out 

        $tble = tools::sd("{$t->WorkDay} out"); 

        if($tble =='nout'){ 
         $re->date2 = tools::ndate($re->date . "- 1"); 
        } 
       } 

       if(!empty($tble)){ 
        $q = array(
         "id" => $re->userid 
         , "dt" => $re->date2 
         , "{$tble}" => $re->time 
        ); 

        dump($q); // insert into sql 
       } 
      } 

轉儲功能:::

function dump($d ='') 
{ 
    if(!empty($d)){ 
    end($d); 
    $tble = key($d); 
    $d['ld'] = "{$d['dt']} {$d[$tble]}"; 

     $r = $GLOBALS['mssqldb']->get_results(" 
      IF NOT EXISTS (select id,ld,dt,{$tble} from clockL 
       WHERE id = '{$d['id']}' 
       AND dt ='{$d['dt']}') 
       INSERT INTO clockL (id,ld,dt,{$tble}) 
       VALUES ('{$d['id']}','{$d['ld']}','{$d['dt']}' 
       ,'{$d[$tble]}') 
      ELSE IF EXISTS (select id,{$tble} from clockL 
       WHERE id = '{$d['id']}' 
       AND dt ='{$d['dt']}' 
       AND {$tble} = 'NOC' 
       ) 
       update clockL SET {$tble} ='{$d[$tble]}', ld ='{$d['ld']}' WHERE id = '{$d['id']}' 
       AND dt ='{$d['dt']}' AND {$tble} ='NOC' 
      "); 

      //print_r($GLOBALS['mssqldb']); 
    } 
} 

謝謝。

+0

這是在循環內部執行的很多條件邏輯。另一種方法是將所有內容放入臨時表中並從臨時表寫入主表。 –

回答

0

您是否知道一個名爲set_time_limit()的PHP函數? 你可以找到詳細的文件here...

這可以操縱執行時間,這是30秒的默認值。 如果將其設置爲0,例如set_time_limit(0),則不會有執行時間限制。 希望這可能會幫助你...

-1

可能會循環是超時的原因。 因爲在循環中執行插入/更新操作時,與數據庫的連接將處於打開狀態,直到循環終止,這可能會導致超時問題。

嘗試在循環之外執行插入/更新操作。

0

在循環之外進行插入/更新。將其包含在事務中,以便在腳本過早死亡時不會獲得不一致的數據庫狀態。使用一個大查詢通常比製作大量小查詢要快。您也可以設置更高的時間和內存限制值,但要注意這些影響。