PHP MYSQL импортирует CSV, а затем сравнивает и удаляет лишние записи - PullRequest
0 голосов
/ 26 марта 2012

Я застрял здесь со специфической проблемой. У меня есть скрипт, который в основном импортирует файл CSV в базу данных, используя fgetcsv() в php. В этом нет никаких проблем, и я могу также обновить старые записи, используя синтаксис MySQL ON DUPLICATE KEY UPDATE (я ни в коем случае не эксперт MySQL, поэтому я спрашиваю здесь).

Вот эта часть кода:

$handle = fopen($file,"r");
fgetcsv($handle, 1000, ",");//skip first row since they are headers
while(($fileop = fgetcsv($handle, 1000, ",")) !== false) //read line by line into $fileop
{
  //read array values into vars
  $item1 = $fileop[0];
  $item2 = $fileop[1];
  $key = $fileop[2];
  // and a couple more

  // now INSERT / UPDATE data in MySQL table
  $sql = mysql_query("INSERT INTO table (item1,item2,key) 
    VALUES ('$item1','$item2','$key') 
    ON DUPLICATE KEY UPDATE item1='$item1',item2='$item2'");

}

Это все отлично работает. Что я застрял в том, что некоторые записи могут быть удалены из фактического CSV (как в ключе, возможно, больше не существует). То, что я хотел бы сделать, это удалить записи из таблицы MySQL, которых больше нет в CSV.

Значение, если $key ушел из CSV, также удалить эту строку в таблице базы данных. Я полагаю, я бы сделал это до того, как запустил запрос вставки / обновления для таблицы MySQL?

Буду признателен за любую помощь, ребята.

Ответы [ 2 ]

0 голосов
/ 23 сентября 2012

Я делаю что-то очень похожее с партнерским сайтом, имея чуть менее 500 000 товаров.

В вашей базе данных просто добавьте еще один столбец с именем "update_flag" или что-то подобное. Установите значение по умолчанию равным 0. При добавлении элементов из файла CSV установите для параметра update_flag значение «1». В вашем «на дубликате заявления» установите значение «2». Я также пошел и добавил 2 других поля: «date_added» и «date_updated».

После завершения импорта вы можете сосчитать старые элементы (подлежащие удалению), новые добавленные элементы и те, которые были обновлены. Затем вы можете просто удалить из таблицы, где update_flag = 0

Надеюсь, это поможет.

0 голосов
/ 26 марта 2012

Просто ведите учет ваших ключей.

Сохраняйте каждый $key в массиве в то время как, и в конце запустите запрос, который говорит

DELETE FROM tabel WHERE key NOT IN (listofcommaseparatedkeysgoeshere)

$arrayThatYouNeedToTest = array();
$handle = fopen($file,"r");
fgetcsv($handle, 1000, ",");//skip first row since they are headers
while(($fileop = fgetcsv($handle, 1000, ",")) !== false) //read line by line into $fileop
{
  //read array values into vars
  $item1 = $fileop[0];
  $item2 = $fileop[1];
  $key = $fileop[2];
  // and a couple more

  // now INSERT / UPDATE data in MySQL table
  $sql = mysql_query("INSERT INTO table (item1,item2,key) 
    VALUES ('$item1','$item2','$key') 
    ON DUPLICATE KEY UPDATE item1='$item1',item2='$item2'");

   $arrayThatYouNeedToTest[] = $key;    

}

$stringThatYouNeedToInspect = implode(",",$arrayThatYouNeedToTest);
$queryYouREALLYneedToCheckFirst = "DELETE FROM tabel WHERE key NOT IN  (".$stringThatYouNeedToInspect.")";

//$result = mysql_query($queryYouREALLYneedToCheckFirst);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...