Php 删除不在.csv文件中的DB记录-效率?

Php 删除不在.csv文件中的DB记录-效率?,php,mysql,oop,csv,Php,Mysql,Oop,Csv,我目前正在处理一个.csv导入,它导入议程项目(如事件)并将它们放在MySQL数据库中。我已经掌握了它工作的要点,但是有一段很麻烦的代码,我似乎不知道如何修复它或使它更有效/更好 对我来说,代码中最麻烦的部分是,从2012-06-01”到2013-04-01,每周二和周日都会举行一次活动,您需要检查这些值中的一些是否已在数据库中准备就绪(因为用户可能会再次导入带有一些调整值的.csv文件)。我当前的代码最终在DB中实现了正确的值,但它的实现方式有点麻烦。如果再次导入文件,那么来自星期天的所有值都

我目前正在处理一个.csv导入,它导入议程项目(如事件)并将它们放在MySQL数据库中。我已经掌握了它工作的要点,但是有一段很麻烦的代码,我似乎不知道如何修复它或使它更有效/更好

对我来说,代码中最麻烦的部分是,从
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();
            }