За последние 24 часа нас посетили 17973 программиста и 1700 роботов. Сейчас ищут 1527 программистов ...

Выгрузка данных из ODBC в MySQL

Тема в разделе "PHP для новичков", создана пользователем graf_vorontsov, 16 фев 2013.

  1. graf_vorontsov

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

    С нами с:
    12 фев 2011
    Сообщения:
    183
    Симпатии:
    1
    Адрес:
    Украина, Харьков
    база ODBC содержит 37миллионов строк
    из ODBC мне нужно выгрузить эти данные в MySQL, делаю таким способом. Всё работает как надо.
    Но очень медленно!!! я понимаю что у меня комп не супер, но всётаки.. прикинул при такой скорости как идёт выгрузка.. 100тысяч строк в час .....моя быза будет перекачиваться просто нереально долго?
    как оптимизировать? что я не правильно написал в коде или так и должно быть?
    Код (Text):
    1.     set_time_limit(0);
    2.    
    3.     $host = "localhost";
    4.     $user = "root";
    5.     $password = "";
    6.  
    7.     // Производим попытку подключения к серверу MySQL:
    8.     if (!mysql_connect($host, $user, $password)){
    9.        
    10.         echo "<h2>MySQL Error!</h2>";
    11.         exit;
    12.     }
    13.    
    14.     $db = 'forever';
    15.    
    16.     // Выбираем базу данных:
    17.    
    18.     mysql_select_db($db);
    19.  
    20.     $dsntd = "DSN=TECDOC2013;Database=TECDOC_CD_1_2013;Server=localhost;Port=;UID=tecdoc;PWD=tcd_error_0";
    21.    
    22.     $id = odbc_connect($dsntd, "", "");
    23.    
    24.     echo $id;
    25.    
    26.     echo odbc_tables($id);
    27.  
    28.     $res = odbc_exec($id, "select * FROM TOF_ART_LOOKUP");
    29.    
    30.     $r = odbc_fetch_array($res);
    31.    
    32.     //Создаём таблицу с полями, если не существует
    33.                
    34.     mysql_query("CREATE TABLE IF NOT EXISTS `TOF_ART_LOOKUP`(
    35.         `ARL_ART_ID` integer(11) NOT NULL,
    36.         `ARL_SEARCH_NUMBER` varchar(25) NOT NULL,
    37.         `ARL_BRA_ID` smallint(6) NOT NULL,
    38.         `ARL_DISPLAY_NR` varchar(30) NOT NULL        
    39.         ) ENGINE=InnoDB");
    40.                
    41.     do {        
    42.  
    43.         $query = mysql_query("INSERT INTO `tof_art_lookup` (`ARL_ART_ID`, `ARL_SEARCH_NUMBER`, `ARL_BRA_ID`, `ARL_DISPLAY_NR`) VALUES ('$r[ARL_ART_ID]', '$r[ARL_SEARCH_NUMBER]', '$r[ARL_BRA_ID]', '$r[ARL_DISPLAY_NR]')");
    44.  
    45.         }
    46.          
    47.     while ($r = odbc_fetch_array($res));
     
  2. sobachnik

    sobachnik Старожил

    С нами с:
    20 апр 2007
    Сообщения:
    3.380
    Симпатии:
    13
    Адрес:
    Дмитров, МО
    Попробуй так, должно быстрее пойти по идее:
    Код (PHP):
    1. <?php
    2.  
    3. $host = "localhost";
    4. $user = "root";
    5. $password = "";
    6.  
    7. // Производим попытку подключения к серверу MySQL:
    8. if(!mysql_connect($host, $user, $password)) {
    9.     echo "<h2>MySQL Error!</h2>";
    10.     exit;
    11. }
    12.  
    13. $db = 'forever';
    14. // Выбираем базу данных:
    15.  
    16. $dsntd = "DSN=TECDOC2013;Database=TECDOC_CD_1_2013;Server=localhost;Port=;UID=tecdoc;PWD=tcd_error_0";
    17. $id = odbc_connect($dsntd, "", "");
    18. echo $id;
    19. echo odbc_tables($id);
    20.  
    21. $res = odbc_exec($id, "SELECT * FROM TOF_ART_LOOKUP");
    22.  
    23. //Создаём таблицу с полями, если не существует
    24. mysql_query("CREATE TABLE IF NOT EXISTS `TOF_ART_LOOKUP`(
    25.     `ARL_ART_ID` integer(11) NOT NULL,
    26.     `ARL_SEARCH_NUMBER` varchar(25) NOT NULL,
    27.     `ARL_BRA_ID` smallint(6) NOT NULL,
    28.     `ARL_DISPLAY_NR` varchar(30) NOT NULL        
    29. ) ENGINE=InnoDB");
    30.  
    31. $data = array();
    32. $i = 0;
    33. while($r = odbc_fetch_array($res)) {
    34.     $data[] = "('{$r['ARL_ART_ID']}', '{$r['ARL_SEARCH_NUMBER']}', '{$r['ARL_BRA_ID']}', '{$r['ARL_DISPLAY_NR']}')";
    35.     ++$i;
    36.     if($i > 3000) {
    37.         mysql_query('INSERT INTO `tof_art_lookup` (`ARL_ART_ID`, `ARL_SEARCH_NUMBER`, `ARL_BRA_ID`, `ARL_DISPLAY_NR`) VALUES ' . implode(', ', $data));
    38.         $i = 0;
    39.         $data = array();
    40.     }
    41. }
    42. if(count($data)) {
    43.     mysql_query('INSERT INTO `tof_art_lookup` (`ARL_ART_ID`, `ARL_SEARCH_NUMBER`, `ARL_BRA_ID`, `ARL_DISPLAY_NR`) VALUES ' . implode(', ', $data));
    44. }
    45. ?>
     
  3. graf_vorontsov

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

    С нами с:
    12 фев 2011
    Сообщения:
    183
    Симпатии:
    1
    Адрес:
    Украина, Харьков
    абалдеть!!! скорость выше намного.
    попробовал за минуту выгрузило:
    ваш скрипт -- 30338
    мой -- 1736

    спасибище огромное за подсказку!!! завтра разберу код подробнее чтоб понять от чего так получается.
    И посчитаю за сколько выгрузится база при такой скорости....... посчитал .. вроде как за 20 часов справлюсь.. найти бы комп пошустрее......
     
  4. Ganzal

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

    С нами с:
    15 мар 2007
    Сообщения:
    9.893
    Симпатии:
    965
    а если еще и индексы на время вставки отрубить...
     
  5. Your

    Your Старожил

    С нами с:
    2 июл 2011
    Сообщения:
    4.074
    Симпатии:
    7
    graf_vorontsov, вы по чаще попова смотрите =)))
    Код (PHP):
    1. do {}
    2. while();
    Вот на <матное слово> оно тут нужно?
    Код (PHP):
    1. <?php
    2. $host='localhost';
    3. $user='root';
    4. $password='';
    5. // Производим попытку подключения к серверу MySQL:
    6. $con=mysql_connect($host,$user,$password);
    7. if(!$con) {
    8.     exit('<h2>MySQL Error '.mysql_error($con).'!</h2>');
    9. }
    10. $db='forever';
    11. // Выбираем базу данных:
    12. if(!mysql_select_db($db,$con)) {
    13.     exit('<h2>MySQL Error '.mysql_error($con).'!</h2>');
    14. }
    15. $dsntd='DSN=TECDOC2013;Database=TECDOC_CD_1_2013;Server=localhost;Port=;UID=tecdoc;PWD=tcd_error_0';
    16. $id=odbc_connect($dsntd,'','');
    17. echo $id;
    18. echo odbc_tables($id);
    19. $res=odbc_exec($id,"SELECT * FROM TOF_ART_LOOKUP");
    20. //Создаём таблицу с полями, если не существует
    21. mysql_query("CREATE TABLE IF NOT EXISTS `TOF_ART_LOOKUP`(
    22.     `ARL_ART_ID` integer(11) NOT NULL,
    23.     `ARL_SEARCH_NUMBER` varchar(25) NOT NULL,
    24.     `ARL_BRA_ID` smallint(6) NOT NULL,
    25.     `ARL_DISPLAY_NR` varchar(30) NOT NULL        
    26. ) ENGINE=InnoDB",$con);
    27. $data=array();
    28. $i=0;
    29. while($r=odbc_fetch_array($res)) {
    30.     $data[]='ARL_ART_ID='.$r['ARL_ART_ID'].',ARL_SEARCH_NUMBER='.$r['ARL_SEARCH_NUMBER'].',ARL_BRA_ID='.$r['ARL_BRA_ID'].',ARL_DISPLAY_NR='.$r['ARL_DISPLAY_NR'];
    31.     ++$i;
    32.     if(3000<$i) {
    33.         mysql_query("INSERT INTO `tof_art_lookup` SET ".join(',',$data));
    34.         $i=0;
    35.         $data=array();
    36.     }
    37. }
    38. if(sizeof($data)) {
    39.     mysql_query("INSERT INTO `tof_art_lookup` SET ".join(',',$data));
    40. }
    41. ?>
    Mysql больше не надо использовать... Используйте Mysqli.
     
  6. graf_vorontsov

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

    С нами с:
    12 фев 2011
    Сообщения:
    183
    Симпатии:
    1
    Адрес:
    Украина, Харьков
    Это то что радио изобрёл ? :)
    Если на хостинге установлен MySQL как я могу пользовать другую БД(Mysqli)?

    эти ж функции равнозначны как я понинимаю... а какие предпочтительней использавать и почему, можете рассказать...?
    sizeof == count
    join == implode
     
  7. igordata

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

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    ой бяда
     
  8. Ganzal

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

    С нами с:
    15 мар 2007
    Сообщения:
    9.893
    Симпатии:
    965
    СУБД остается прежней - mySQL, меняется расширение. разрабы пыха улучшили механизмы работы библиотеки. отсюда название i - improved - усовершенствованный. переходить на mysqli это не просто полезный совет, это одно из основных действий. потому что в какой-то релиз php, устаревшая версия mysql не будет включена и все кто пользовался mysql_* функциями с горящими задницами дружно сядут переписывать под mysqli_ вместо того чтоб сейчас спокойно перетащить весь код.
    это не функции а библиотеки и они не равнозначны. подробно описано в документациях
    это алиасы для разрабов пришедших с других яп
     
  9. graf_vorontsov

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

    С нами с:
    12 фев 2011
    Сообщения:
    183
    Симпатии:
    1
    Адрес:
    Украина, Харьков
    спасибо Ganzal за подробное разъяснение.

    Добавлено спустя 44 минуты 16 секунд:
    не хочет так работать, не выгружает ничего
     
  10. Ganzal

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

    С нами с:
    15 мар 2007
    Сообщения:
    9.893
    Симпатии:
    965
    по мне так и не должно =) задумка использовать буффер правильная. а вот реализация какая-то странная. при такой байде каждую исходную строку мы конкатенируя запятой кладем в массив а потом элементы этого массива конкатенируя запятой отправляем как SET для INSERT'а. мне бы очень хотелось увидеть текст ошибки которым мускул отвечает на попытку выполнения такого запроса.
    по мне так вставку нужно переписать на VALUES ибо я сильно сомневаюсь что SET поддерживает множественный ввод.
     
  11. graf_vorontsov

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

    С нами с:
    12 фев 2011
    Сообщения:
    183
    Симпатии:
    1
    Адрес:
    Украина, Харьков
    51064: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'ARL_DISPLAY_NR=,ARL_ART_ID=2,ARL_SEARCH_NUMBER=DIESELLEICHTL10W40,ARL_BRA_ID=,AR' at line 1
     
  12. Ganzal

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

    С нами с:
    15 мар 2007
    Сообщения:
    9.893
    Симпатии:
    965
    ну как и заказывал, спасибо =)

    давайте немного перепишем. порядок полей, я так понимаю, согласно описанию таблицы
    Код (Text):
    1. `ARL_ART_ID` integer(11) NOT NULL,
    2. `ARL_SEARCH_NUMBER` varchar(25) NOT NULL,
    3. `ARL_BRA_ID` smallint(6) NOT NULL,
    4. `ARL_DISPLAY_NR` varchar(30) NOT NULL
    меняем
    первое - буфферные данные.
    $data[]=sprintf( "(%d, '%s', %d, '%s)', $r['ARL_ART_ID'], $r['ARL_SEARCH_NUMBER'], $r['ARL_BRA_ID'], $r['ARL_DISPLAY_NR'] );
    то есть мы будем хранить готовую конструкцию для VALUES ()...()...()

    второе (дважды) - запросы.
    в них во-первых надо поменять имя таблицы - оно у вас же создается заглавным регистром
    во-вторых - для надежности указать порядок полей
    и в-третьих - собственно SET на VALUES
    mysql_query("INSERT INTO `TOF_ART_LOOKUP` (`ARL_ART_ID`,`ARL_SEARCH_NUMBER`,`ARL_BRA_ID`,`ARL_DISPLAY_NR`) VALUES ".join(', ',$data));

    пока все
     
  13. Your

    Your Старожил

    С нами с:
    2 июл 2011
    Сообщения:
    4.074
    Симпатии:
    7
    При хороших системных настройках компов, эти функции отрабатывают быстрее, почему-то, хотя там хоть и не большой отрыв, ну все равно, заметно станет подальше:)


    А сработает ли вообще запрос INSERT INTO SET у вас?

    Код (PHP):
    1. <?php
    2. $host='localhost';
    3. $user='root';
    4. $password='';
    5. $dsntd='DSN=TECDOC2013;Database=TECDOC_CD_1_2013;Server=localhost;Port=;UID=tecdoc;PWD=tcd_error_0';
    6. if(!$mysql=mysql_connect($host,$user,$password)) {
    7.     exit('<h2>MySQL Error '.mysql_error($mysql).'!</h2>');
    8. } else if(!mysql_select_db($db,$mysql)) {
    9.     exit('<h2>MySQL Error '.mysql_error($mysql).'!</h2>');    
    10. } else if(!$odbc=odbc_connect($dsntd,'','')) {
    11.     exit('<h2>ODBC Error: '.odbc_error($odbc).'</h2>');
    12. } else if($res=odbc_exec($odbc,"SELECT * FROM `TOF_ART_LOOKUP`")) {
    13.     echo nl2br($odbc.'
    14.     '.odbc_tables($odbc));
    15.     mysql_query("CREATE TABLE IF NOT EXISTS `TOF_ART_LOOKUP`(
    16.         `ARL_ART_ID` integer(11) NOT NULL,
    17.         `ARL_SEARCH_NUMBER` varchar(25) NOT NULL,
    18.         `ARL_BRA_ID` smallint(6) NOT NULL,
    19.         `ARL_DISPLAY_NR` varchar(30) NOT NULL        
    20.     ) ENGINE=InnoDB",$mysql);
    21.     while($sql=odbc_fetch_array($res)) {                
    22.         mysql_query("INSERT INTO `tof_art_lookup` SET `ARL_ART_ID`='".$sql['ARL_ART_ID']."',`ARL_SEARCH_NUMBER`='".$sql['ARL_SEARCH_NUMBER']."',`ARL_BRA_ID`='".$sql['ARL_BRA_ID']."',`ARL_DISPLAY_NR`='".$sql['ARL_DISPLAY_NR']."'",$mysql);
    23.     }
    24. }
    25. ?>

    odbc_ fetch_ row можно попробовать еще это для ускорения)
     
  14. graf_vorontsov

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

    С нами с:
    12 фев 2011
    Сообщения:
    183
    Симпатии:
    1
    Адрес:
    Украина, Харьков
    по скорости выгрузки это
    Код (PHP):
    1. while($r=odbc_fetch_array($res)) {
    2.     
    3.     $data[]=sprintf( "(%d, '%s', %d, '%s')", $r['ARL_ART_ID'], $r['ARL_SEARCH_NUMBER'], $r['ARL_BRA_ID'], $r['ARL_DISPLAY_NR'] );
    4.     ++$i;
    5.     if(3000<$i) {
    6.         mysql_query("INSERT INTO `TOF_ART_LOOKUP` VALUES ".join(',',$data));
    7.         $i=0;
    8.         $data=array();
    9.     }
    10. }
    11. if(sizeof($data)) {
    12.     mysql_query("INSERT INTO `TOF_ART_LOOKUP` VALUES ".join(',',$data));
    13. }
    14.  
    15.  
    аналогично этому
    Код (PHP):
    1. while($r = odbc_fetch_array($res)) {
    2.     $data[] = "('{$r['ARL_ART_ID']}', '{$r['ARL_SEARCH_NUMBER']}', '{$r['ARL_BRA_ID']}', '{$r['ARL_DISPLAY_NR']}')";
    3.     ++$i;
    4.     if($i > 3000) {
    5.         mysql_query('INSERT INTO `tof_art_lookup` (`ARL_ART_ID`, `ARL_SEARCH_NUMBER`, `ARL_BRA_ID`, `ARL_DISPLAY_NR`) VALUES ' . implode(', ', $data));
    6.         $i = 0;
    7.         $data = array();
    8.     }
    9. }
    10.  
    11. if(count($data)) {
    12.     mysql_query('INSERT INTO `tof_art_lookup` (`ARL_ART_ID`, `ARL_SEARCH_NUMBER`, `ARL_BRA_ID`, `ARL_DISPLAY_NR`) VALUES ' . implode(', ', $data));
    13. }
    14.  
     
  15. Ganzal

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

    С нами с:
    15 мар 2007
    Сообщения:
    9.893
    Симпатии:
    965
    надеюсь, это был вопрос?
     
  16. graf_vorontsov

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

    С нами с:
    12 фев 2011
    Сообщения:
    183
    Симпатии:
    1
    Адрес:
    Украина, Харьков
    да. почему?

    Добавлено спустя 2 минуты 36 секунд:
    очень медленно выгружает, так как и мой первоначальный способ
     
  17. Ganzal

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

    С нами с:
    15 мар 2007
    Сообщения:
    9.893
    Симпатии:
    965
    никогда не сравнивал производительность форматированной строки против строки с подстановками. выиграет все равно конкатенация =)
    почему лично я бы не использовал подстановку:
    0. в ней вы все свои переменные окружаете кавычками. мускул получит три байта '1' и ему нужно будет из этого сделать число длины подходящей под описание поля, хотя достаточно одного байта 1 чтоб он понял что это число. имхо, числа не надо окружать кавычками. плюс, 1.2 будет однозначно пониматься как дробное, вне зависимости от локализации. а "1.2" - как строка "один-точка-два", что только на части (впрочем, таких большинство) машин будет корректно транслироваться в число с дробной частью.
    1. форматом я указываю какие данные ожидаются в переменных.
    2. если переменная каким-то случайным образом будет не инициализована - мускул получит валидную строку
    например, для формата %d, %d, '%s', если мы вообще все переменные опустим - получим 0, 0, '' (ноль, ноль, пустая строка)
    в случае вложенных пременных - ,,'' - то есть на 100% инвалидный запрос.
    3. о неверном кол-ве аргументов я узнаю из сообщения от пхп, а не от того что мускул подставит значения по умолчанию.
    4. код удобнее читать. хотя бы потому что $r['some_string'] еще нужно real_escape'нуть, и в случае формата я просто обрамляю функцией соответствующий аргумент. в случае с подстановкой может получиться трудно читаемая каша.
     
  18. graf_vorontsov

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

    С нами с:
    12 фев 2011
    Сообщения:
    183
    Симпатии:
    1
    Адрес:
    Украина, Харьков
    спасибо за ответ.
    ответ конечно супер, но только частично понял :) разбираю... ))
     
  19. Ganzal

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

    С нами с:
    15 мар 2007
    Сообщения:
    9.893
    Симпатии:
    965
    судя по коду на каждую строку результата выполняется по одному запросу вставки. это медленно. предлагаемые виранты накапливают данные а потом делают пакетную вставку. и еще раз повторяю - не время вставки/обновления большого числа данных - выключайте индексы
     
  20. graf_vorontsov

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

    С нами с:
    12 фев 2011
    Сообщения:
    183
    Симпатии:
    1
    Адрес:
    Украина, Харьков
    да, я понял ещё с начала темы что пакетами вставлять данные намного быстрее

    про отключение индексов не пойму, что значит выключить их?
    в приведённом вами коде они же не участвуют в вставке... так?
     
  21. sobachnik

    sobachnik Старожил

    С нами с:
    20 апр 2007
    Сообщения:
    3.380
    Симпатии:
    13
    Адрес:
    Дмитров, МО
    Там, судя по коду из первого сообщения - никаких индексов и нету. Вообще никаких. Там же показан create table.
    На счёт генерации строки из переменных - самый быстрый способ - это заключить всё в двойные кавычки:
    Код (PHP):
    1. "string {$var}{$arr['first']}{$arr['second']}."; 
    На втором месте будет конкатенация точкой
    Код (PHP):
    1. 'string ' . $var . ', ' . $arr['first'] . ', ' . $arr['second'] . '.'; 
    Ну и на третьем месте будет использование функции sprintf().

    Экспериментировал и на локалхосте и на Linux-сервере. Результат примерно одинаковый. Вот скрипт для тестирования:
    Код (PHP):
    1. <?php
    2. $data = array(
    3.     'first' => 'Первый элемент',
    4.     'second' => 'Второй элемент',
    5.     'third' => 'Третий элемент'
    6. );
    7. $start = microtime(true);
    8. for($i = 0; $i < 10000000; ++$i) {
    9.     $str = "Строка состоит из: {$data['first']}{$data['second']}{$data['third']}.";
    10.     //$str = 'Строка состоит из: ' . $data['first'] . ', ' . $data['second'] . ', ' . $data['third'] . '.';
    11.     //$str = sprintf('Строка состоит из: $s, %s, %s.', $data['first'], $data['second'], $data['third']);
    12. }
    13. $execTime = microtime(true) - $start;
    14. header('Content-Type: text/plain; charset=utf-8');
    15. echo round($execTime, 3) . ' sec';
    16. ?>
    Вот полученные мною результаты:
    Код (Text):
    1. Localhost (Windows 7):
    2. 3.970   5.131   6.923
    3. 3.968   5.147   6.925
    4. 3.983   5.130   6.932
    5. 3.966   5.124   6.907
    6. 3.970   5.127   6.916
    7. =====================
    8. 3.971   5.132   6.921
    9.  
    10. Хостинг (Linux какой-то):
    11. 4.095   5.497   7.940
    12. 4.712   5.674   7.943
    13. 4.700   6.060   7.907
    14. 4.708   6.059   7.943
    15. 4.176   6.061   7.982
    16. =====================
    17. 4.478   5.870   7.943
    Добавлено спустя 7 минут 4 секунды:
    Но вообще, способ конкатенации - это мелочи. Не стоит особо обращать на это внимания, поскольку любой из способов - это настолько мизерные затраты времени по сравнению с самой вставкой данных в б.д., что ими можно пренебречь.
    Можно в скрипте, использующем буферизацию (например в том, который я разместил тут в начале обсуждения) поэкспериментировать с количеством строк в "пакете". Я написал там 3000 (то есть вставлять по 3000 строк одним запросом). Можно попробовать поставить значение побольше, например 10000 - по идее процесс должен будет ещё ускориться. Правда такое завышение размеров пакета - может упереться в ограничение на объём выделяемой скрипту памяти. Кроме того, на сколько я помню, у MySQL есть ещё какие-то ограничения на размер SQL-запроса.
     
  22. Ganzal

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

    С нами с:
    15 мар 2007
    Сообщения:
    9.893
    Симпатии:
    965
    интересные результаты получаются, кстати.
    при включенном eA - все многократно укладываются в значения от 5.979 до 6.206. а вот при выключенном eA - sprintf начинает "радовать" - 10.493 - 10.839. интересно, каким же образом eA оптимизирует форматирование?
    в целом, на 10млн итераций получить разницу пусть даже и в 5 секунд - не самое узкое место.
    да, я только порядок полей там прочитал, дальше не вчитывался. действительно нет индексов.
     
  23. graf_vorontsov

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

    С нами с:
    12 фев 2011
    Сообщения:
    183
    Симпатии:
    1
    Адрес:
    Украина, Харьков
    а такой вопрос:
    Код (PHP):
    1. if($i > 3000) 
    это вставляются данные пакетом по 3000, а если в конце у меня останется при последней вставке не 3000 строк а меньше.... пакет получается не вставится...
    но как я понимаю за это отвечает
    Код (PHP):
    1. if(count($data)) 
    это подсчитывает остаток? так я понимаю
     
  24. sobachnik

    sobachnik Старожил

    С нами с:
    20 апр 2007
    Сообщения:
    3.380
    Симпатии:
    13
    Адрес:
    Дмитров, МО
    Это проверяет, есть ли остаток. Ну и далее по коду, если остаток есть - то он тоже вставляется в базу.
     
  25. Ganzal

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

    С нами с:
    15 мар 2007
    Сообщения:
    9.893
    Симпатии:
    965
    да, если после выхода из цикла данные в буфере еще есть - выполняем и для них запрос.