2012-06-06 4 views
-1

В настоящее время я работаю над импортом .csv, который импортирует элементы повестки дня (например, события) и помещает их в базу данных MySQL. У меня есть суть работы, но есть и неприятный кусок кода, который я, похоже, не могу обернуть вокруг себя тем, как его исправить или сделать его более эффективным/лучшим.Удаление записей DB, которые не находятся в .csv-файле - эффективность?

Часть кода, который является неприятной для меня, когда мероприятие проводится каждые --Позволяет сказать- tuesday и sunday от 2012-06-01 «до 2013-04-01 и вы хотите проверить, если некоторые из этих значений Allready в БД (поскольку пользователь может снова импортировать CSV-файл с некоторыми скорректированными значениями). Мой текущий код в конечном итоге реализует правильные значения в БД, но способ, которым это делается, является чем-то вроде хлопот. Если файл снова импортируется, все значения с воскресенья снова удаляются, потому что мой чек сначала проходит через foreach во вторник, где он проверяет соответствие значений DB со значениями, сгенерированными для вторника. После того, как проверки выполнены, и значения вставляются в БД, мой foreach проверяет все значения для воскресенья (tuesday не удаляется, потому что я сохраняю массив со всеми предыдущими вставленными значениями), а затем снова вставляет их. Так что, в основном, когда я импортирую CSV-файл, он удаляет, а затем вставляет те же значения, и мой вопрос: как я могу это предотвратить?

Кроме того, если вы видите какой-либо способ улучшить этот код вообще (потому что я действительно чувствую, что это не эффективно начинать с самого начала), пожалуйста, скажите так, это очень ценится.

Вот код, который проверяет для повторения событий, если вам нужна clarfication или другой код, пожалуйста, дайте мне знать:

//REPEAT DAYS OF THE WEEK 
if(!empty($repeatDayOfTheWeek) && $repeatDayOfTheWeek != '') 
{ 
    $daysOfTheWeek = explode(',', $repeatDayOfTheWeek); 

    foreach($daysOfTheWeek as $key => $dayOfTheWeek) 
    { 
     if(!is_numeric($dayOfTheWeek)) 
     { 
      continue; 
     } 

     unset($agendaI->agendaItemValues['stopDate']); 

     $beginDate = strtotime($tempStartDate); 
     $endDate = strtotime($tempStopDate); 

     $dayDates = array(); 
     $arrayDatesInDb = array(); 

     if(!isset($previousInserts)) 
     { 
      $previousInserts = array(); 
     } 

     if($beginDate != '' && $endDate != '') 
     { 
      while($beginDate <= $endDate) 
      { 
       if(date('N', $beginDate) == $dayOfTheWeek) 
       { 
        $dayDates[] = date('Y-m-d', $beginDate); 
       } 

       $beginDate = strtotime("+1 day", $beginDate); 
      } 

     $datesInDb = $agendaI->getAgendaItemsByExternId($externId); 

     if(empty($datesInDb)) 
     { 
      foreach($dayDates as $dayDate) 
      { 
       dump("Empty DB - INSERT: ".$dayDate); 
       $agendaI->setAgendaItemValue('startDate', $dayDate); 
       $agendaI->saveAgendaItem(); 
       $previousInserts[] = $dayDate; 
      } 
     } 
     else 
     { 
      dump('DB with records'); 
      foreach($datesInDb as $dateInDb) 
      { 
       if(!in_array($dateInDb->startDate, $dayDates) && !in_array($dateInDb->startDate, $previousInserts)) 
       { 
        dump("Not in Item-array, but in DB - DELETE: ".$dateInDb->startDate); 
        $agendaI->deleteAgendaItem($dateInDb->id); 
       } 
      } 

     foreach($dayDates as $dayDate) 
     { 
      foreach($datesInDb as $dateInDb) 
      { 
       if($dayDate == $dateInDb->startDate) 
       { 
        $arrayDatesInDb[] = $dateInDb->startDate; 
        dump("In array & in DB - UPDATE: ".$dateInDb->startDate); 
        $agendaI->setAgendaItemValue('id', $dateInDb->id); 
        $agendaI->saveAgendaItem(); 
        $previousInserts[] = $dayDate; 
       } 
      } 
     } 

    unset($agendaI->agendaItemValues['id']); 

    foreach($dayDates as $dayDate) 
    { 
     if(!in_array($dayDate, $arrayDatesInDb)) 
     { 
      dump("Not in DB-array but in Item-array - INSERT: ".$dayDate); 
      $agendaI->setAgendaItemValue('startDate', $dayDate); 
      $agendaI->saveAgendaItem(); 
      $previousInserts[] = $dayDate; 
     } 
    } 
} 

следующие поля в формате CSV:

"Datum" "Tijdstip" "Evenement" "Locatie" "Website" "Toelichting" "Duits" "engels" "startdatum" "stopdatum" "herhalen dag van de week" "externid" "categorie" "via" 

Другими словами
Мне нужно проверить, являются ли записи в БД такими же, как в .csv. Если у csv нет записи, которую имеет БД, мне нужно удалить ее из БД (что мой текущий код делает, просто не очень эффективно)

+0

Могу ли я спросить причину падения? – Bono

+0

Какие поля находятся в CSV? – eggyal

+0

@eggyal добавил к вопросу – Bono

ответ

0

В конце концов я решил его следующим образом без использования Еогеаспа для каждого $ daysoftheweek и использования array_diff:

  //REPEAT DAYS OF THE WEEK 
      if(!empty($repeatDayOfTheWeek) && $repeatDayOfTheWeek != '') 
      { 
       $daysOfTheWeek = explode(',', $repeatDayOfTheWeek); 

       $agendaI->setAgendaItemValue('stopDate', ''); 

       $beginDate = strtotime($startDate); 
       $endDate = strtotime($stopDate); 
       $dayDates = array(); 
       $dbValues = array(); 
       $dbValues['datum'] = array(); 
       $latestDbValues = array(); 
       $toBeDeletedKeys = array(); 

       while($beginDate <= $endDate) 
       { 
        if(in_array(date('N', $beginDate), $daysOfTheWeek)) 
        { 
         $dayDates[] = date('Y-m-d', $beginDate); 
        } 

        $beginDate = strtotime("+1 day", $beginDate); 
       } 

       $evenementenInDb = $agendaI->getAgendaItemsByExternId($externId); 

       if(!empty($evenementenInDb)) 
       { 
        foreach($evenementenInDb as $evenementInDb) 
        { 
         $dbValues['agendaid'][] = $evenementInDb->id; 
         $dbValues['datum'][] = $evenementInDb->startDate; 
        } 
       } 

       foreach($dayDates as $dayDate) 
       { 
        $key = array_search($dayDate, $dbValues['datum']); 
        if($key !== false && is_numeric($key)) 
        { 
         //UPDATE 
         $agendaI->setAgendaItemValue('id', $dbValues['agendaid'][$key]); 
         $agendaI->setAgendaItemValue('startDate', $dayDate); 
         $agendaI->saveAgendaItem(); 
         $latestDbValues[] = $dayDate; 
         dump('UPDATE'); 
        } 
        else 
        { 
         //INSERT 
         unset($agendaI->agendaItemValues['id']); 
         $agendaI->setAgendaItemValue('startDate', $dayDate); 
         $agendaI->saveAgendaItem(); 
         $latestDbValues[] = $dayDate; 
         dump('INSERT'); 
        } 
       } 

       $toBeDeleted = array_diff($dbValues['datum'], $latestDbValues); 
       foreach($toBeDeleted as $value) 
       { 
        $toBeDeletedKeys[] = array_search($value, $dbValues['datum']); 
       } 

       foreach($toBeDeletedKeys as $toBeDeletedKey) 
       { 
        //DELETE 
        $agendaI->deleteAgendaItem($dbValues['agendaid'][$toBeDeletedKey]); 
        dump('DELETE'); 
       } 
      } 
      else 
      { 
       //Normal, non repeating event 
       //INSERT 
       if(!empty($agendaItem) && is_numeric($agendaItem->id)) 
       { 
        $agendaI->setAgendaItemValue('id',$agendaItem->id); 
       } 

       $agendaId = $agendaI->saveAgendaItem(); 
      } 
1

Вместо того, чтобы выполнять свои проверки на PHP, вы можете определить индекс UNIQUE через startdatum, stopdatum и herhalen dag van de week колонок; затем использовать REPLACE с командой LOAD DATA заменить любую существующую запись, соответствующую на полях с новым:

ALTER TABLE events ADD UNIQUE INDEX (startdatum, stopdatum, dag); 

LOAD DATA INFILE '/path/to/foo.csv' 
    REPLACE 
    INTO TABLE events; 
+0

Да, полезно, но это не решает проблему удаления? (Или я не получаю его) Мне нужно проверить, являются ли записи в БД такими же, как в .csv.Если у csv нет записи, которую имеет БД, мне нужно удалить ее из БД – Bono

+0

@Bono: OH. Теперь я понимаю! Почему бы не «TRUNCATE TABLE events» перед выполнением «ЗАГРУЗНЫХ ДАННЫХ»? – eggyal

+0

Спасибо, я займусь этим;) – Bono

Смежные вопросы