Почему мои данные вставляются дважды?PHP / MySQL - PullRequest
3 голосов
/ 09 декабря 2011

Я просто не могу понять это. У меня есть CSV с 174638 строк. Вот образец:

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>';
    }
}

Ответы [ 3 ]

0 голосов
/ 09 декабря 2011

Однако в противном случае вам придется добавить какую-то обработку ошибок. Ваш скрипт остановится, когда попытается вставить дублирование.

Если вы используете MySQL5, вы можете использовать INSERT IGNORE для этого

0 голосов
/ 09 декабря 2011

Вы также можете использовать INFILE LOAD DATA с опцией IGNORE.Это поможет вам загрузить данные из файла CSV с помощью одной команды MySQL и игнорировать дубликаты;Вам нужно только сделать поле email УНИКАЛЬНЫМ (как предложено Digital Precision).

Другой способ - загрузить данные во вторую (или временную таблицу), а затем скопировать данные в первую таблицу, используя INSERT. SELECT оператор.

0 голосов
/ 09 декабря 2011

У вас возникают двойные строки, потому что вы не отслеживаете то, что уже было введено в базу данных.Если вы хотите, чтобы этого не произошло, вы можете добавить уникальный ключ в столбец электронной почты базы данных, это обеспечит добавление только уникальных адресов электронной почты.

Однако вам придется добавить какую-то ошибкув противном случае ваш скрипт остановится, когда попытается вставить дублирование.

ALTER TABLE `my_table` ADD UNIQUE KEY (`email`);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...