循环中奇怪的mysqli_error行为

时间:2014-03-14 14:11:10

标签: php mysql mysqli

我有一个我正在处理的脚本,它解析CSV文件,然后将其放入MySQL数据库。除了在我正在开发的文件中有一个重复的主键,我有一切正常工作,这很好,因为这迫使我确保错误处理按预期工作。问题是我希望脚本抛出重复的错误并继续处理,这意味着"或者死亡"不是一种选择。我只是在测试一个" false"查询结果但是这会导致重复之后的每个插入都重复发生重复错误,从而发出数百或数千个重复键错误。

以下是有问题的代码部分...(更新:基本上包括整个脚本。)

$file = fopen("Temp/03132014all.csv","r");
$out_file = fopen("Temp/clean_ouput.csv",'w');
$cnt_IN = 0; $invalid = 0; $cnt_good = 0;
$inv_yr = "/^0000/";

while(! feof($file)) {
$lead = fgetcsv($file);
if ($lead[1] != "surname") {
    $dt = explode(" ",$lead[9]);
    $time = isset($dt[2]) ? $dt[2] : 0;
    $date = $dt[0];
    if (empty($lead[3]) || empty($lead[8]) || empty($lead[9]) || preg_match($inv_yr,$lead[9])) { // eliminate invalid leads first
        $invalid++;
    } elseif ($lead[6] == "IN") {  // Test for leads from Indiana 
        $cnt_IN++;
        $sql = "INSERT INTO indiana_leads 
                (First_Name, Last_Name, Email, Address, City, State, ZIP, Phone, Gender, Lead_Date, Lead_Time, Lead_IP)
                VALUES ('$lead[0]','$lead[1]','$lead[2]','$lead[4]','$lead[5]','$lead[6]','$lead[7]','$lead[8]','$lead[13]',STR_TO_DATE('$date','%m/%d/%Y'),STR_TO_DATE('$time','%H:%i'),'$lead[2]')";

    } else {
        $cnt_good++;
        $sql = "INSERT INTO vb_leads_test
                (First_Name, Last_Name, Email, Address, City, State, ZIP, Phone, Gender, Lead_Date, Lead_Time, Lead_IP)
                VALUES ('$lead[0]','$lead[1]','$lead[2]','$lead[4]','$lead[5]','$lead[6]','$lead[7]','$lead[8]','$lead[13]',STR_TO_DATE('$date','%m/%d/%Y'),STR_TO_DATE('$time','%H:%i'),'$lead[2]')";
        $out_array = array($lead[0],$lead[1],$lead[2],$lead[4],$lead[5],$lead[6],$lead[7],$lead[8],$lead[13],$date,$time,$lead[2]);
        fputcsv($out_file, $out_array);
    }
$result = mysqli_query($con,$sql); // or die(mysqli_error($con));;
if (!$result) {
    $error = mysqli_error($con);
    echo $error;
    //$result = true;
}
} 
}

正如你所看到的,我试图将$ result强制回到" true"在错误之后,但我仍然不断地将每个新插入的垃圾邮件发送到浏览器/日志。我认为我在这里做了一些简单的错事,但我不能为我的生活弄清楚它是什么。提前感谢您的帮助。

1 个答案:

答案 0 :(得分:-1)

- 更新

创建一个日志文件来记录重复的条目,而不是将它们打印到屏幕上。

在顶部:

$duplicate_key_file = fopen("Temp/duplicate_key.csv",'w'); 

然后用以下内容替换页面底部的“if”:

if (!$result) {
      $duplicate_key_array = array($lead[0],$lead[1],$lead[2],$lead[4],$lead[5],$lead[6],$lead[7],$lead[8],$lead[13],$date,$time,$lead[2]);
      fputcsv($duplicate_key_file , $duplicate_key_array);
}

注意:此部分来自您自己的代码