Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/284.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/66.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PHP MYSQL导入CSV,然后比较并删除冗余条目_Php_Mysql_Csv_Import_Compare - Fatal编程技术网

PHP MYSQL导入CSV,然后比较并删除冗余条目

PHP MYSQL导入CSV,然后比较并删除冗余条目,php,mysql,csv,import,compare,Php,Mysql,Csv,Import,Compare,我在这里遇到了一个特殊的问题。我有一个脚本,基本上使用php中的fgetcsv()将CSV文件导入数据库。这样做完全没有问题,我也可以在重复密钥更新中使用MySQL语法(我不是MySQL专家,因此我在这里提问) 以下是该部分代码: $handle = fopen($file,"r"); fgetcsv($handle, 1000, ",");//skip first row since they are headers while(($fileop = fgetcsv($handle, 1000

我在这里遇到了一个特殊的问题。我有一个脚本,基本上使用php中的
fgetcsv()
将CSV文件导入数据库。这样做完全没有问题,我也可以在重复密钥更新中使用MySQL语法
(我不是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中不再存在的条目

这意味着,如果CSV中的
$key
消失,也会删除数据库表中的该行。我想在MySQL表上运行Insert/Update查询之前,我会这样做吗


如果有人能帮我,我将不胜感激。

只要记下你的钥匙就行了

在while中的数组中保存每个
$key
,最后运行一个查询

DELETE FROM tabel WHERE key NOT IN (listofcommaseparatedkeysgoeshere)


我在一个附属网站上做了类似的事情——拥有不到50万个产品

在数据库中,只需添加另一个名为“update_flag”或类似内容的列。将默认值设置为0。从CSV文件添加项目时,请将update_标志设置为“1”。在“重复声明”中,将字段设置为“2”。我还添加了另外两个字段:“添加日期”和“更新日期”

导入完成后,可以统计旧项目(要删除)、新添加的项目和已更新的项目。然后可以从update_flag=0的表中简单删除


我希望这能有所帮助。

我理解你想法背后的逻辑。你能不能再重复一点,告诉我代码是什么样子的?我是php新手,写这样的扩展性代码对我来说有点陌生。好吧,这应该没有那么难,所以我不想给你代码,因为你可能只是剪切粘贴它,而我现在没有真正的测试方法和/或时间。但是很快。请注意。你应该用它来理解应该发生什么,而不是复制它!谢谢我不想复制/粘贴我想对它有更深入的了解。到目前为止,我从人们提供的语法描述和示例中学到了我所知道的一切。对于我自己来说,最简单的学习方法是通过做/看示例,然后复制和扩展我所学的内容。巧合的是,我只是在看数组内爆的语法,而你把代码放在这里:)我会开始工作的,很棒的东西,非常感谢。没问题,只需确保在将其放入删除之前执行一些
echo
/
var\u dump
检查,因为您不想删除所有
$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);