为什么我的数据被插入两次?PHP / MySQL


Why is my data getting inserted twice? PHP/MySQL

我就是想不明白。我有一个有174638行的CSV。下面是一个示例:

015826136@domain.com,2010-11-08 14:10:35
01DETAIL@domain.com,2011-11-01 20:14:21
01krisp10@domain.com,2010-11-08 15:00:09
01luis@domain.com,2010-11-08 15:00:09
01tthomas@domain.com,2010-11-08 15:09:13
02570734@domain.com,2011-10-10 11:44:54
02arman02@domain.com,2010-11-08 14:53:26
03091980@domain.com,2010-11-08 14:45:09
03331025@domain.com.com,2010-11-08 14:45:09

我不需要或使用第二列(日期),只需要第一列(电子邮件)。

我正在读取CSV并通过行循环,并将电子邮件地址插入数据库表中。当我运行另一个文件时,我保存了4000条相同的记录,它运行得很好。当我运行完整的代码时,每一行都会被插入两次。全部,然后再全部。当然php页面也会超时。如果我注释掉插入并回显每个电子邮件,它们只回显一次到屏幕。

下面是PHP代码:
if ( isset($_POST["step"]) && $_POST["step"] == '2' ) {
    if ( isset($_FILES["file"])) {
            if ($_FILES["file"]["error"] == 0) {
                $name = $_FILES['file']['name'];
                $ext = strtolower(end(explode('.', $_FILES['file']['name'])));
                $type = $_FILES['file']['type'];
                $tmpName = $_FILES['file']['tmp_name'];
                // check the file is a csv
                if($ext === 'csv'){
                    if(($handle = fopen($tmpName, 'r')) !== FALSE) {
                        $field = $_POST['field'];
                        //clear the import table
                        mysql_query("TRUNCATE table iContact_import");
                        //loop through the CSV
                        while(($data = fgetcsv($handle, 300, ',')) !== FALSE) {
                            //$info = explode(",", $line);
                            //echo $info[0].'<br/>';
                            mysql_query("INSERT iContact_import (email,field) values ('".$data[0]."','".$field."')");                                   
                        }
                        echo '<h3 style="color:green;">Database is prepped for new subscribers</h3>';
                        echo '<p><a href="icontact_process.php?step=3">Click here to update subscriptions</a></p>';
                    }
                } else {
                    echo '<p>File is not a CSV. Please use another field with CSV values and extension.</p>';
                }
            } else {
                echo "Error: " . $_FILES["file"]["error"] . "<br />";
            }
    } else {
        echo '<p>Please upload a CSV file with email addresses to import.</p>';
    }
}

由于没有跟踪已经输入到数据库中的内容,因此遇到了重复行。如果您想确保不会发生这种情况,您可以向数据库的电子邮件列添加唯一键,这将确保只添加唯一的电子邮件地址。

然而,你必须添加一些错误处理,否则你的脚本将停止当它试图插入一个副本。

ALTER TABLE `my_table` ADD UNIQUE KEY (`email`);

但是你必须添加一些错误处理当您的脚本试图插入一个副本时,它将停止。

如果你使用的是MySQL5,你可以使用INSERT IGNORE

您可能还想使用带有IGNORE选项的LOAD DATA INFILE。它将帮助您使用一个MySQL命令从CSV文件加载数据,并忽略重复;你只应该使email字段唯一(如建议的数字精度)。

另一种方法是将数据加载到第二个表(或临时表),然后使用INSERT将数据复制到第一个表…SELECT语句。

我猜它运行两次,因为HTTP连接和输出缓冲区问题。如果您的请求运行时间太长(超过10分钟)而无法完成,那么浏览器将向服务器发送相同的请求。现代浏览器就是这样做的。所以我猜这是你的问题……

试着把这些放在你的代码上面;

ob_end_clean();
header("Connection: close'r'n");
header("Content-Encoding: none'r'n");
ignore_user_abort(true); // optional
ob_start();
echo ('Process running...');
$size = ob_get_length();
header("Content-Length: $size");
ob_end_flush();     // Strange behaviour, will not work
flush();            // Unless both are called !
ob_end_clean();
//PUT YOUR CODES HERE

此代码在请求后关闭HTTP连接。所以你的代码只安全运行一次。