За последние 24 часа нас посетил 57231 программист и 1809 роботов. Сейчас ищут 893 программиста ...

Импорт данных из CSV в Базу

Тема в разделе "PHP для новичков", создана пользователем kikosik, 10 авг 2017.

  1. kikosik

    kikosik Активный пользователь

    С нами с:
    13 апр 2017
    Сообщения:
    60
    Симпатии:
    0
    Здравствуйте, у меня такая проблема. Код импортирует данные CSV файла в таблицу на базе. Каждая строка CSV составляет из 7 данных которые разделены запятыми.

    Например

    CHECKID,NAME,SURNAME,MIDDLENAME,POSITION,WORKPLACE,WORKTIME
    14877,Ivan,Petrov,Aleksandrovich,Acountant,Office,9 hour


    Каждый день импортируется новый CSV файл и в каждом файле CHECKID может повтарится. Как сделать чтобы код проверял в базе и в CSV файле, если в таблице(база) уже есть такой CHECKID он не импортировал данную страку из CSV файла, а все остальные строки импортировал? То есть если есть в базе такой запись - 14877, он не импортировал строку из CSV)

    Заранее спасибо))

    Вот код.

    <?php
    error_reporting(0); // Выключаем показ ошибок. Чтобы их видеть - вместо 0 поставьте E_ALL
    include('db_conn.php');
    $max_file_size = 5; // Максимальный размер файла в МегаБайтах
    if($_POST['update']=='OK'){
    // СТАРТ Загрузка файла на сервер
    if($_FILES["filename"]["size"] > $max_file_size*1024*1024){
    echo 'Размер файла превышает '.$max_file_size.' Мб!';
    include('form_file_load.php');
    exit;
    }
    if(copy($_FILES["filename"]["tmp_name"],$path.$_FILES["filename"]["name"])){
    echo("Добавлен "."<b>".$_FILES["filename"]["name"]."</b>"." !<br />");
    }
    else{
    echo 'Errorլ<br>';
    include('form_file_load.php');
    exit;
    }

    $file = fopen('php://memory', 'w+');
    fwrite($file, iconv('UTF-8', 'UTF-8', file_get_contents($_FILES["filename"]["name"])));
    rewind($file);

    $r = 1;
    while (($row = fgetcsv($file, 1000, ",")) != FALSE) {
    $r++;
    if($r == 2) {continue;} // Не дает записать в БД Заголовки Прайс-листа
    $ins="INSERT INTO `Table1` (`CHECKID`,`NAME`,`SURNAME`,`MIDDLENAME`, `POSITION`, `WORKPLACE`,`WORKTIME`
    )VALUES('$row[0]','$row[1]','$row[2]', '$row[3]', '$row[4]', '$row[5]', '$row[6]', '$row[7]' )";
    $query = mysql_query($ins);
    if(!$query) die('Error!!!');
    }
    fclose($file);
    echo 'Refresh page - '.$r;
    header('Location: my_panel.php');

    }
    else{
    include('form_file_load.php');
    }
    ?>
     
  2. Dmitriy A. Arteshuk

    Dmitriy A. Arteshuk Активный пользователь

    С нами с:
    19 янв 2012
    Сообщения:
    2.445
    Симпатии:
    66
    Адрес:
    Зеленоград
    Никогда, вообще нигде и никогда не делай запросы к БД в цикле...
     
  3. Ganzal

    Ganzal Суперстар
    Команда форума Модератор

    С нами с:
    15 мар 2007
    Сообщения:
    9.893
    Симпатии:
    965
    Иногда всё же можно, @Dmitriy A. Arteshuk, но с головой при этом дружить.
     
  4. kikosik

    kikosik Активный пользователь

    С нами с:
    13 апр 2017
    Сообщения:
    60
    Симпатии:
    0
    А как решить этот вопрос?
     
  5. Ganzal

    Ganzal Суперстар
    Команда форума Модератор

    С нами с:
    15 мар 2007
    Сообщения:
    9.893
    Симпатии:
    965
    выбрать известные из базы, пометить в импортируемом файле, импортировать не помеченные из файла в базу
     
  6. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.600
    Симпатии:
    1.764
    CHECKID сделать в таблице уникальным ключём, и Insert ignore, если база mysql
     
  7. kikosik

    kikosik Активный пользователь

    С нами с:
    13 апр 2017
    Сообщения:
    60
    Симпатии:
    0
    А если нужна проверить если CHECKID,NAME,SURNAME,MIDDLENAME поля в CSV файле совпадают со строкой в таблице базы данных, то не импортировал, а все остальные импортировал
     
  8. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.600
    Симпатии:
    1.764
    Составной уникальный ключ
     
  9. kikosik

    kikosik Активный пользователь

    С нами с:
    13 апр 2017
    Сообщения:
    60
    Симпатии:
    0
    Я пробовал, но не помагает
     
  10. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.600
    Симпатии:
    1.764
    Отлаживай. Совет правильный
     
  11. Abyss

    Abyss Старожил

    С нами с:
    12 дек 2015
    Сообщения:
    1.298
    Симпатии:
    218
    Адрес:
    Default city
    Читай файлик построково, сгенерируй массив данных, если слишком много - отпартицируй, сгенерируй запрос для каждой порции и воспользуйся ON DUPLICATE KEY.
    5 комментов ниочем.