Php 删除不在.csv文件中的DB记录-效率?
我目前正在处理一个.csv导入,它导入议程项目(如事件)并将它们放在MySQL数据库中。我已经掌握了它工作的要点,但是有一段很麻烦的代码,我似乎不知道如何修复它或使它更有效/更好 对我来说,代码中最麻烦的部分是,从Php 删除不在.csv文件中的DB记录-效率?,php,mysql,oop,csv,Php,Mysql,Oop,Csv,我目前正在处理一个.csv导入,它导入议程项目(如事件)并将它们放在MySQL数据库中。我已经掌握了它工作的要点,但是有一段很麻烦的代码,我似乎不知道如何修复它或使它更有效/更好 对我来说,代码中最麻烦的部分是,从2012-06-01”到2013-04-01,每周二和周日都会举行一次活动,您需要检查这些值中的一些是否已在数据库中准备就绪(因为用户可能会再次导入带有一些调整值的.csv文件)。我当前的代码最终在DB中实现了正确的值,但它的实现方式有点麻烦。如果再次导入文件,那么来自星期天的所有值都
2012-06-01
”到2013-04-01
,每周二和周日都会举行一次活动,您需要检查这些值中的一些是否已在数据库中准备就绪(因为用户可能会再次导入带有一些调整值的.csv文件)。我当前的代码最终在DB中实现了正确的值,但它的实现方式有点麻烦。如果再次导入文件,那么来自星期天的所有值都会再次被删除,因为我的检查首先在星期二通过foreach,它将检查DB值是否与为星期二生成的值匹配。检查完成并将值插入DB后,my foreach将检查星期天的所有值(星期二不会被删除,因为我保留了一个包含所有先前插入值的数组),然后再次插入它们。
所以基本上,当我导入一个.csv文件时,它会删除然后插入相同的值,我的问题是如何防止这种情况发生
此外,如果您看到任何改进此代码的方法(因为我真的觉得从一开始就没有效率),请这样说,非常感谢
以下是检查事件重复的代码,如果您需要任何说明或其他代码,请告诉我:
//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中的记录相同。如果csv没有DB拥有的记录,我需要将其从DB中删除(我当前的代码是这样做的,只是效率不高)而不是在PHP中执行检查,您可以在
startdatum
、stopdatam
和herhalen dag van de week
列中定义一个唯一的索引;然后使用REPLACE
和LOAD DATA
命令,将与这些字段匹配的任何现有记录替换为新记录:
altertable事件添加唯一索引(startdatum、stopdatum、dag);
加载数据填充“/path/to/foo.csv”
代替
进入表格事件;
我最终以以下方式解决了这个问题,没有使用foreach for every$daysoftheweek和array\u 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();
}
//重复一周中的几天
如果(!empty($RepeatDayOfWeek)&&$RepeatDayOfWeek!='')
{
$daysOfTheWeek=爆炸(“,”,$RepeatDayOfWeek);
$agendaI->setAgendaItemValue('stopDate','';
$beginDate=STROTTIME($startDate);
$endDate=strottime($stopDate);
$dayDates=array();
$dbValues=array();
$dbValues['datum']=array();
$latestDbValues=array();
$toBeDeletedKeys=array();
而($beginDate getAgendaItemsByExternId($externId);
如果(!空($evenementenInDb))
{
foreach($evenementInDb作为$evenementInDb)
{
$dbValues['agendaid'][]=$evenementInDb->id;
$dbValues['datum'][=$evenementInDb->startDate;
}
}
foreach($dayDate作为$dayDate)
{
$key=array_search($dayDate,$dbValues['datum']);
如果($key!==false&&is\u为数字($key))
{
//更新
$agendaI->setAgendaItemValue('id',$dbValues['agendaid'][$key]);
$agendaI->setAgendaItemValue('startDate',$dayDate);
$agendaI->saveAgendaItem();
$latestDbValues[]=$dayDate;
转储(“更新”);
}
其他的
{
//插入
未设置($agendaI->agendaItemValues['id']);
$agendaI->setAgendaItemValue('startDate',$dayDate);
$agendaI->saveAgendaItem();
$latestDbValues[]=$dayDate;
转储(“插入”);
}
}
$toBeDeleted=array_diff($dbValues['datum',$latestDbValues);
foreach($删除为$值)
{
$toBeDeletedKeys[]=数组搜索($value,$dbValues['datum']);
}
foreach($toBeDeletedKey作为$toBeDeletedKey)
{
//删除
$agendaI->deleteAgendaItem($dbValues['agendaid'][$toBeDeletedKey]);
转储(“删除”);
}
}
其他的
{
//正常、非重复事件
//插入
如果(!empty($agendaItem)&&是数值($agendaItem->id))
{
$agendaI->setAgendaItemValue('id',$agendaItem->id);
}
$agendaId=$agendaI->saveAgendaItem();
}
我可以问一下投票被否决的原因吗?@eggyal在问题中补充道@the Downvorters,你能提供一个评论,让我至少知道什么是“缺乏研究努力/不清楚/没有用处”?感谢您澄清,如果CSV包含具有相同的startdatum
、stopdatum
和herhalen dag van de week
的新记录,您希望替换表中存在的记录?eggyal是的,但是还有其他值可能已更改。但这不是我问题的原因,原因是“因此,基本上,当我导入.csv文件时,它会删除并插入相同的文件
//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();
}