За последние 24 часа нас посетили 17965 программистов и 1699 роботов. Сейчас ищут 1557 программистов ...

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

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

  1. Ganzal

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

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

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

    С нами с:
    12 фев 2011
    Сообщения:
    183
    Симпатии:
    1
    Адрес:
    Украина, Харьков
    блин... я гоню, извините
    создало 84 sql файла и в каждом записана цифра 1
    а нет.. нашёл несколько в которых ничего нет, пустые
     
  3. Ganzal

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

    С нами с:
    15 мар 2007
    Сообщения:
    9.893
    Симпатии:
    965
    ну об этом ты сам уже писал))))

    выложи весь исходник скрипта
     
  4. graf_vorontsov

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

    С нами с:
    12 фев 2011
    Сообщения:
    183
    Симпатии:
    1
    Адрес:
    Украина, Харьков
    Код (PHP):
    1. <?php
    2.  
    3.     error_reporting(E_ALL | E_STRICT) ;
    4.     ini_set('display_errors','On');
    5.     set_time_limit(20);
    6.  
    7.     $host = "localhost";
    8.     $user = "root";
    9.     $password = "";
    10.  
    11.     // Производим попытку подключения к серверу MySQL:
    12.     
    13.     if (!mysql_connect($host, $user, $password)){
    14.         echo "<h2>MySQL Error!</h2>";
    15.         exit;
    16.     }
    17.         
    18.     // Выбираем базу данных:
    19.  
    20.     $db = 'forever';
    21.     mysql_select_db($db);
    22.     
    23.     function fdump( $data ){
    24.         $fn = './'.microtime(true).'.sql';
    25.     
    26.         $f = fopen( $fn, 'wb' );
    27.         fwrite( $f, $data );
    28.         fclose( $f );
    29.     } 
    30.     
    31.     $dsntd = "DSN=TECDOC_CD_1_2013;Database=TECDOC_CD_1_2013;Server=localhost;Port=;UID=tecdoc;PWD=tcd_error_0";
    32.     $id = odbc_connect($dsntd, "", "");
    33.     echo $id;
    34.     echo odbc_tables($id);
    35.  
    36.     $res = odbc_exec($id, "SELECT * FROM TOF_BRANDS");
    37.  
    38. //Создаём таблицу с полями, если не существует
    39.  
    40.     mysql_query("CREATE TABLE IF NOT EXISTS `TOF_BRANDS_1`(
    41.                 `BRA_ID` smallint(6) NOT NULL,
    42.                 `BRA_BRAND` varchar(25) NOT NULL,
    43.                 `BRA_MF_NR` integer(11) NOT NULL        
    44.                 ) ENGINE=InnoDB");
    45.  
    46.     $data = array();
    47.     $i = 0;
    48.  
    49.     while($r = odbc_fetch_array($res)) {
    50.         //$data[] = "('{$r['ARL_ART_ID']}', '{$r['ARL_SEARCH_NUMBER']}', '{$r['ARL_BRA_ID']}', '{$r['ARL_DISPLAY_NR']}')";
    51.         $data[] = "('{$r['BRA_ID']}', '{$r['BRA_BRAND']}','{$r['BRA_MF_NR']}')";
    52.         ++$i;
    53.         if($i > 100) {
    54.             //$sql = 'INSERT INTO `tof_art_lookup` (`ARL_ART_ID`, `ARL_SEARCH_NUMBER`, `ARL_BRA_ID`, `ARL_DISPLAY_NR`) VALUES ' . implode(', ', $data);
    55.             $sql = mysql_query('INSERT INTO `tof_brands_1` (`BRA_ID`, `BRA_BRAND`, `BRA_MF_NR`) VALUES ' . join(', ', $data));
    56.             echo $sql;
    57.             fdump($sql);
    58.             mysql_query($sql) or exit('Запрос:<br>' . $sql . '<br>Ошибка:<br>' . mysql_error());
    59.             $i = 0;
    60.             $data = array();
    61.         }
    62.     } 
    63.  
    64.     
    65.     if(sizeof($data)) {
    66.         echo '<pre>';
    67.         //var_dump($data);
    68.         echo '</pre>';
    69.         $sql = mysql_query('INSERT INTO `tof_brands_1` (`BRA_ID`, `BRA_BRAND`, `BRA_MF_NR`) VALUES ' . join(', ', $data));
    70.     }  
    71.  
    72.     if ($sql == 'true'){
    73.         echo "<p>Обновление БД прошло успешно!</p> ";
    74.     }else{
    75.         echo "<p>Не удалось обновить записи в БД</p> ";
    76.     }
    77.     echo mysql_errno();
    78.     echo mysql_error();
    79.     //***********************************
    80.     
    81. ?>
     
  5. igordata

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

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

    Код (Text):
    1.             $sql = mysql_query('INSERT INTO `tof_brands_1` (`BRA_ID`, `BRA_BRAND`, `BRA_MF_NR`) VALUES ' . join(', ', $data));
    2.             echo $sql; fdump($sql);
    ты понимаешь что ты дампишь? =))))))))))

    Добавлено спустя 4 минуты 1 секунду:
    замени этот кусок
    Код (Text):
    1. $sql = mysql_query('INSERT INTO `tof_brands_1` (`BRA_ID`, `BRA_BRAND`, `BRA_MF_NR`) VALUES ' . join(', ', $data));
    2.             echo $sql;
    3.             fdump($sql);
    4.             mysql_query($sql) or exit('Запрос:<br>' . $sql . '<br>Ошибка:<br>' . mysql_error());
    на
    Код (Text):
    1.  
    2. $query = 'INSERT INTO `tof_brands_1` (`BRA_ID`, `BRA_BRAND`, `BRA_MF_NR`) VALUES ' . join(', ', $data);
    3. $result = mysql_query($query);
    4.             fdump("результат:\n\r".print_r($result,true)."\n\r\n\r\n\rЗапрос:\n\r".$query);
    это вообще что:
    Код (Text):
    1. $sql = mysql_query
    2. [...]
    3. mysql_query($sql)
     
  6. Ganzal

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

    С нами с:
    15 мар 2007
    Сообщения:
    9.893
    Симпатии:
    965
    блин))) ну ты записываешь результат выполнения функции. ясен хрен что либо 1 либо пусто))) ман по функции глянь.
    Код (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.         #$data[] = "('{$r['BRA_ID']}', '{$r['BRA_BRAND']}','{$r['BRA_MF_NR']}')";
    4.         ++$i;
    5.         if($i > 100) {
    6.             $sql = 'INSERT INTO `tof_art_lookup` (`ARL_ART_ID`, `ARL_SEARCH_NUMBER`, `ARL_BRA_ID`, `ARL_DISPLAY_NR`) VALUES ' . implode(', ', $data);
    7.             #$sql = mysql_query('INSERT INTO `tof_brands_1` (`BRA_ID`, `BRA_BRAND`, `BRA_MF_NR`) VALUES ' . join(', ', $data));
    8.             #echo $sql;
    9.             fdump($sql);
    10.             mysql_query($sql) or exit('Запрос:<br>' . $sql . '<br>Ошибка:<br>' . mysql_error());
    11.             $i = 0;
    12.             $data = array();
    13.         }
    14.     }
     
  7. igordata

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

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    пусть лучше мой код фигарит, там и запрос и результат будет в файле
     
  8. graf_vorontsov

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

    С нами с:
    12 фев 2011
    Сообщения:
    183
    Симпатии:
    1
    Адрес:
    Украина, Харьков
    Код (PHP):
    1. <?php
    2.  
    3.     error_reporting(E_ALL | E_STRICT) ;
    4.     ini_set('display_errors','On');
    5.     set_time_limit(20);
    6.  
    7.     $host = "localhost";
    8.     $user = "root";
    9.     $password = "";
    10.  
    11.     // Производим попытку подключения к серверу MySQL:
    12.     
    13.     if (!mysql_connect($host, $user, $password)){
    14.         echo "<h2>MySQL Error!</h2>";
    15.         exit;
    16.     }
    17.         
    18.     // Выбираем базу данных:
    19.  
    20.     $db = 'forever';
    21.     mysql_select_db($db);
    22.     
    23.     function fdump( $data ){
    24.         $fn = './'.microtime(true).'.sql';
    25.     
    26.         $f = fopen( $fn, 'wb' );
    27.         fwrite( $f, $data );
    28.         fclose( $f );
    29.     } 
    30.     
    31.     $dsntd = "DSN=TECDOC_CD_1_2013;Database=TECDOC_CD_1_2013;Server=localhost;Port=;UID=tecdoc;PWD=tcd_error_0";
    32.     $id = odbc_connect($dsntd, "", "");
    33.     echo $id;
    34.     echo odbc_tables($id);
    35.  
    36.     $res = odbc_exec($id, "SELECT * FROM TOF_BRANDS");
    37.  
    38. //Создаём таблицу с полями, если не существует
    39.  
    40.     mysql_query("CREATE TABLE IF NOT EXISTS `TOF_BRANDS_1`(
    41.                 `BRA_ID` smallint(6) NOT NULL,
    42.                 `BRA_BRAND` varchar(25) NOT NULL,
    43.                 `BRA_MF_NR` integer(11) NOT NULL        
    44.                 ) ENGINE=InnoDB");
    45.  
    46.     $data = array();
    47.     $i = 0;
    48.  
    49.     while($r = odbc_fetch_array($res)) {
    50.         //$data[] = "('{$r['ARL_ART_ID']}', '{$r['ARL_SEARCH_NUMBER']}', '{$r['ARL_BRA_ID']}', '{$r['ARL_DISPLAY_NR']}')";
    51.         $data[] = "('{$r['BRA_ID']}', '{$r['BRA_BRAND']}','{$r['BRA_MF_NR']}')";
    52.         ++$i;
    53.         if($i > 50) {
    54.             
    55.             $sql = 'INSERT INTO `tof_brands_1` (`BRA_ID`, `BRA_BRAND`, `BRA_MF_NR`) VALUES ' . implode(', ', $data);
    56.             fdump( $sql );
    57.             mysql_query($sql) or exit('Запрос:<br>' . $sql . '<br>Ошибка:<br>' . mysql_error()); 
    58.  
    59.             $i = 0;
    60.             $data = array();
    61.         }
    62.     } 
    63.  
    64.     
    65.     if(sizeof($data)) {
    66.         echo '<pre>';
    67.         //var_dump($data);
    68.         echo '</pre>';
    69.         $sql = mysql_query('INSERT INTO `tof_brands_1` (`BRA_ID`, `BRA_BRAND`, `BRA_MF_NR`) VALUES ' . join(', ', $data));
    70.     }  
    71.  
    72.     if ($sql == 'true'){
    73.         echo "<p>Обновление БД прошло успешно!</p> ";
    74.     }else{
    75.         echo "<p>Не удалось обновить записи в БД</p> ";
    76.     }
    77.     echo mysql_errno();
    78.     echo mysql_error();
    79.     //***********************************
    80.     
    81. ?>
    исправил
    вот что выводит
    Код (Text):
    1. Resource id #4Resource id #5Запрос:
    2. INSERT INTO `tof_brands_1` (`BRA_ID`, `BRA_BRAND`, `BRA_MF_NR`) VALUES ('871', 'KOGEL','839'), ('872', 'LANZ+MARTI','840'), ('873', 'LANDTECH. SCHONEBECK','841'), ('874', 'LEXUS','842'), ('875', 'MCW','843'), ('876', 'MDW','844'), ('877', 'MEGA','845'), ('878', 'MENARINI','846'), ('879', 'MOWAG','847'), ('880', 'NOOTEBOOM','848'), ('881', 'OPTARE','849'), ('882', 'PLYMOUTH','850'), ('883', 'PREMIER','851'), ('884', 'PREVOST','852'), ('885', 'RABA','853'), ('886', 'RENDERS','854'), ('887', 'ROCKWELL','855'), ('888', 'SAF','856'), ('889', 'SHANGHAI','857'), ('890', 'SPIERINGS KRANEN','858'), ('891', 'STILL','859'), ('892', 'TERBERG-BENSCHOP','860'), ('893', 'TVR','861'), ('894', 'VME','862'), ('895', 'ZF Parts','863'), ('896', 'VW-PORSCHE','864'), ('897', 'BERKHOF','865'), ('898', 'ALPINA','866'), ('899', 'BACHMANN','867'), ('900', 'FRIWEG','868'), ('901', 'GFP','869'), ('902', 'HILLMANN','870'), ('903', 'KKK','871'), ('904', 'NEDCAR','872'), ('905', 'REMPLOY LTD','873'), ('906', 'SEMEX','874'), ('907', 'ASIA MOTORS','879'), ('908', 'PUMA','880'), ('909', 'ASTON MARTIN','881'), ('910', 'JEEP','882'), ('911', 'IW LUDWIGSFELDE','883'), ('912', 'ARDENAISSE D'ESSIEUX','884'), ('913', 'BPW','885'), ('914', 'CALABRESE','886'), ('915', 'CARDI','887'), ('916', 'CARRIMORE','888'), ('917', 'CASTARA','889'), ('918', 'CAZENAVE','890'), ('919', 'CODER','891'), ('920', 'COLAERT','892'), ('921', 'DORSEY','893')
    3. Ошибка:
    4. 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 'ESSIEUX','884'), ('913', 'BPW','885'), ('914', 'CALABRESE','886'), ('915', 'CARD' at line 1
     
  9. Ganzal

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

    С нами с:
    15 мар 2007
    Сообщения:
    9.893
    Симпатии:
    965
    ('912', 'ARDENAISSE D'ESSIEUX','884'),

    сказал же что кавычка рвет. почему не делается mysql_real_escape_string()???
     
  10. igordata

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

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    Аллилуйя! теперь ты видишь ГДЕ ОШИБКАТОЙОПТА?! =)

    Добавлено спустя 38 секунд:
    не пали малину, пусть сам ищет! удали! удали! =)
     
  11. Ganzal

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

    С нами с:
    15 мар 2007
    Сообщения:
    9.893
    Симпатии:
    965
    да ладно тебе, человек несколько дней пытается пофиксить. очевидно же что у него нет синдрома никитоса)))
     
  12. igordata

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

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    блин =(

    Добавлено спустя 30 секунд:
    теперь мы не узнаем, нашел ли он её сам, и ли только с твоей подсказки.
     
  13. Your

    Your Старожил

    С нами с:
    2 июл 2011
    Сообщения:
    4.074
    Симпатии:
    7
    Код (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.     $i=0;
    14.     $data=array();
    15.     echo nl2br($odbc.'
    16.     '.odbc_tables($odbc));
    17.     function escape($string) {
    18.         if($string) {
    19.             global $mysql;
    20.             return mysql_real_escape_string($string,$mysql);
    21.         }
    22.     }
    23.     mysql_query("CREATE TABLE IF NOT EXISTS `TOF_ART_LOOKUP`(
    24.         `ARL_ART_ID` integer(11) NOT NULL,
    25.         `ARL_SEARCH_NUMBER` varchar(25) NOT NULL,
    26.         `ARL_BRA_ID` smallint(6) NOT NULL,
    27.         `ARL_DISPLAY_NR` varchar(30) NOT NULL        
    28.     ) ENGINE=InnoDB",$mysql);
    29.     while($r=odbc_fetch_array($res)) {
    30.         $data[]="('".escape($r['ARL_ART_ID'])."','".escape($r['ARL_SEARCH_NUMBER'])."','".espcape($r['ARL_BRA_ID'])."','".escape($r['ARL_DISPLAY_NR'])."')";
    31.         ++$i;
    32.         if(3000<$i) {
    33.             mysql_query('INSERT INTO `tof_art_lookup` (`ARL_ART_ID`,`ARL_SEARCH_NUMBER`,`ARL_BRA_ID`,`ARL_DISPLAY_NR`) VALUES '.join(',',$data),$mysql);
    34.             $i=0;
    35.             $data=array();
    36.         }
    37.     }
    38.     if(sizeof($data)) {
    39.         mysql_query('INSERT INTO `tof_art_lookup` (`ARL_ART_ID`,`ARL_SEARCH_NUMBER`,`ARL_BRA_ID`,`ARL_DISPLAY_NR`) VALUES '.join(',',$data),$mysql);
    40.     }
    41. }
    42. ?>
    odbc_fetch_row должна работать быстрее odbc_fetch_array.
    Попробуйте расставить столбцы по числовому ключу:
    $r[0] - $r[1] - $r[10] и т. д. то есть по счету столбики идут...

    Мож еще VIEW представление ускорит, кто знает?))
    Ну и собственно TRIGGER'ы
     
  14. graf_vorontsov

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

    С нами с:
    12 фев 2011
    Сообщения:
    183
    Симпатии:
    1
    Адрес:
    Украина, Харьков
    аааа!!! да!да!да!да!да
    убил кавычку! :)
    Код (PHP):
    1. $r['BRA_BRAND'] = str_replace("'", "", $r['BRA_BRAND']); 
    спасибо!
     
  15. igordata

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

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

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

    С нами с:
    15 мар 2007
    Сообщения:
    9.893
    Симпатии:
    965
    мдя...
    $r['BRA_BRAND'] = mysql_real_escape_string( $r['BRA_BRAND'] ) - кавычка остается но становится безопасной для запроса. и не только кавычка...
     
  17. graf_vorontsov

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

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

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

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    ты лучше все параметры без разбору пропускай через эту функцию
     
  19. graf_vorontsov

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

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

    skyfortress Новичок

    С нами с:
    26 июл 2013
    Сообщения:
    3
    Симпатии:
    0
    Можно как-то еще оптимизировать этот скрипт?
    У меня максимум 30000 записей в минуту с буфером в і=10000.
     
  21. kot_matpockuh

    kot_matpockuh Новичок

    С нами с:
    12 дек 2013
    Сообщения:
    1
    Симпатии:
    0
    Может кинет кто-нибудь последнюю версию исходного кода, а то 4 страницы и куча модификаций, боюсь чего не перепутать.
    зы: код с хабры от экспорте у мну работает крайне медленно, вот думаю может этот мне поможет )