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

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

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

  1. graf_vorontsov

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

    С нами с:
    12 фев 2011
    Сообщения:
    183
    Симпатии:
    1
    Адрес:
    Украина, Харьков
    спасибо!
    пока тему не закрываю.. хочу попробовать использовать mysqli ... ато пишите что лучше она, хоть попробую. пока правда просто попытался подставить букву i ко всем функциям mysql ... не удалось :)
     
  2. sobachnik

    sobachnik Старожил

    С нами с:
    20 апр 2007
    Сообщения:
    3.380
    Симпатии:
    13
    Адрес:
    Дмитров, МО
    Посмотри отличия в мануале. Во-первых, в mysqli (в отличии от mysql) - нужно обязательно передавать указатель на соединение с базой данных (то, что возвращает mysqli_connect). И этот указатель должен стоять на первом месте, а текст запроса - вторым аргументом.
     
  3. graf_vorontsov

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

    С нами с:
    12 фев 2011
    Сообщения:
    183
    Симпатии:
    1
    Адрес:
    Украина, Харьков
    ок.
    а ещё хотел спросить таку штуку
    думал сделать выгрузку строк в зависимости от того что мне требуется
    Код (PHP):
    1. $f = fopen("TECDOC_TOF_BRANDS.txt", "r"); //файл брендов
    2.     
    3.     $brand = get_brands($f); //получаем массив с файла брендов 
    4.     
    5.     do {
    6.         foreach ($brand as $br){
    7.             foreach ($br as $b){
    8.             }  
    9.         
    10.         if ($nums['3'] != $br['0']) continue; //пропускаем позиции, если бренды не содержатся в файле с брендами
    11.                 
    12.         //если производитель RUVILLE(23) то добавляем EVR в начало номера
    13.         if($nums['3'] == '23'){
    14.             $nums['1'] = "EVR".$nums['1'];
    15.         }
    16.         
    17.         $query = mysql_query("INSERT INTO crossnumbers (ARL_ART_ID, ARL_SEARCH_NUMBER, ARL_BRA_ID, ARL_DISPLAY_NR, BRA_BRAND) VALUES ('$nums[0]', '$nums[1]', '$nums[3]', '$nums[4]', '$br[2]')");
    18.         }
    19.         }
    20.     } 
    21.     while ($r = odbc_fetch_array($res)); 
    это мой старый запрос с которого началась тема, но я не писал что пытался выбрать также по условию

    это часть файла TECDOC_TOF_BRANDS.txt
    Код (Text):
    1.  
    2. 1   SPIDAN  SPIDAN  501
    3. 2   HELLA   HELLA   502
    4. 3   ATE ATE 503
    5. 5   PIERBURG    PIERBURG    505
    6. 6   LUK LuK 506
    7. 7   EBERS   EBERSPACHER 507
    8. 12  PAGID   PAGID   512
    9. 17  KLOTZ   HK  517
    10. 18  KONI    KONI    518
    11. 19  SWF SWF 519
    12. 21  VALEO   VALEO   521
    13. 30  BOSCH   BOSCH   530
    14. 31  CONTI   CONTITECH   531
    в зависимости от наличия в этом файле производителя, я выбирал запчасти именно этих производителей что в файле, но у меня выгрузилось только 450тысяч позиций и скрипт завершился, мне кажется надо применит что-то типа рекурсии? или нет?
     
  4. Your

    Your Старожил

    С нами с:
    2 июл 2011
    Сообщения:
    4.074
    Симпатии:
    7
    Так медленее:
    Код (PHP):
    1. $var="str $str"; 
    Чем так:
    Код (PHP):
    1. $var="str".$str; 
    Раз вы каким-то способов сделали уже через файл, то почему бы не сделать backup? Или это не то?

    На столько много результатов в миллионы строк, это будет в любом случае долго, если выгружать все... Иначе нужно делать ограничение...
    Как то криво написали видимо...
    В данном случае что требуется, то?
    Что вы хотите проверить в файле?
     
  5. sobachnik

    sobachnik Старожил

    С нами с:
    20 апр 2007
    Сообщения:
    3.380
    Симпатии:
    13
    Адрес:
    Дмитров, МО
    Если переменная для склейки всего одна - то да. Если их будет несколько - то быстрее будет первый вариант.
     
  6. Your

    Your Старожил

    С нами с:
    2 июл 2011
    Сообщения:
    4.074
    Симпатии:
    7
    Медленее будет вариант 1 всегда...
    Уже не раз проверял и делал еще давно всякие разные тесты...

    Да и вообще ковычки " " отличаются от ' '.
     
  7. runcore

    runcore Старожил

    С нами с:
    12 окт 2012
    Сообщения:
    3.625
    Симпатии:
    158
    ключевое слово здесь "давно"
    это было актуально во времена php4
    сейчас разница в корости в пределах погрешности измерения.
     
  8. sobachnik

    sobachnik Старожил

    С нами с:
    20 апр 2007
    Сообщения:
    3.380
    Симпатии:
    13
    Адрес:
    Дмитров, МО
    Я же несколькими сообщениями выше - привёл конкретный скрипт для тестирования и результаты его работы на моём домашнем компе и на сервере. И там наглядно видно, что одна строка в двойных кавычках со вставленными в эту строку переменными обрабатывается быстрее, чем несколько строк в одинарных кавычках, склеенных с переменными точкой.
    Вообще, разница довольно заметная, там 20-30% где-то.
     
  9. Your

    Your Старожил

    С нами с:
    2 июл 2011
    Сообщения:
    4.074
    Симпатии:
    7
    Понял...
    Тоже по-тестил, на новых версиях, оказывается ты прав =)
    Работает быстрее с "$str" или "{$str}".
    Я просто давно когда - то тестил, медленнее было...
    На больших размерах данных это очень сильно заметно...


    Только вот одно но-это только для переменных и массивов, так, что конкатенация не исключена...
    А все переменные можно через функцию получать...
    Так, что лучше уж конкатенацией, чем смешано и разбросанно...
     
  10. graf_vorontsov

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

    С нами с:
    12 фев 2011
    Сообщения:
    183
    Симпатии:
    1
    Адрес:
    Украина, Харьков
    обнаружил проблемку...
    когда доходит файл до конца, и код этот уже не может выполнятся, т.к. количество оставшихся позиций меньше 3000
    Код (PHP):
    1. if($i > 3000) {
    2.             $query = mysql_query('INSERT INTO `tof_brands_1` (`BRA_ID`, `BRA_BRAND`, `BRA_MF_NR`) VALUES ' . join(', ', $data));
    3.             $i = 0;
    4.             $data = array();
    5.         } 
    и начинает выполнятся это
    Код (PHP):
    1.     if(sizeof($data)) {
    2.         $query = mysql_query('INSERT INTO `tof_brands_1` (`BRA_ID`, `BRA_BRAND`, `BRA_MF_NR`) VALUES ' . join(', ', $data));
    3.     }   
    т.е. остаток должен вставится в базу, а нет.. не тут то было, не идёт. почему? подскажите
     
  11. graf_vorontsov

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

    С нами с:
    12 фев 2011
    Сообщения:
    183
    Симпатии:
    1
    Адрес:
    Украина, Харьков
    людиии!! подскажите
     
  12. sobachnik

    sobachnik Старожил

    С нами с:
    20 апр 2007
    Сообщения:
    3.380
    Симпатии:
    13
    Адрес:
    Дмитров, МО
    Должно идти. Почему не идёт - х.з. :) Магия... Ну напиши там:
    Код (PHP):
    1. if(sizeof($data)) {
    2.     $query = mysql_query('INSERT INTO `tof_brands_1` (`BRA_ID`, `BRA_BRAND`, `BRA_MF_NR`) VALUES ' . join(', ', $data));
    3.     if(!$query) {
    4.         echo mysql_error();
    5.     }
    6. }
    посмотришь, что за ошибка

    Добавлено спустя 2 минуты 23 секунды:
    Лучше даже так, чтобы и сам запрос посмотреть:
    Код (PHP):
    1. if(sizeof($data)) {
    2.     $sql = 'INSERT INTO `tof_brands_1` (`BRA_ID`, `BRA_BRAND`, `BRA_MF_NR`) VALUES ' . join(', ', $data);
    3.     $query = mysql_query($sql);
    4.     if(!$query) {
    5.         echo 'Ошибка запроса. Запрос: <br>' . $sql . '<br>Ошибка:<br>' . mysql_error();
    6.     }
    7. } 
     
  13. graf_vorontsov

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

    С нами с:
    12 фев 2011
    Сообщения:
    183
    Симпатии:
    1
    Адрес:
    Украина, Харьков
    не, дело в том что ошибки нет! просто не догружает строки все
    вот например ставлю
    if($i > 500) выгружает 1149
    if($i > 100) выгружает 2349
    if($i > 5) выгружает 2634

    а должно выгрузить 2652
     
  14. Ganzal

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

    С нами с:
    15 мар 2007
    Сообщения:
    9.893
    Симпатии:
    965
    это в итоговой таблице такие цифры? может часть запросов не выполняется?
     
  15. sobachnik

    sobachnik Старожил

    С нами с:
    20 апр 2007
    Сообщения:
    3.380
    Симпатии:
    13
    Адрес:
    Дмитров, МО
    Покажи весь код полностью, который у тебя сейчас используется и приводит к такому странному результату.
     
  16. graf_vorontsov

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

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

    Your Старожил

    С нами с:
    2 июл 2011
    Сообщения:
    4.074
    Симпатии:
    7
    Он больше и не выведет.
    Какой еще остаток, вы ограничили цикл, а остаток ваш не выйдет, вы посмотрите, что придет в:
    Код (PHP):
    1. if(sizeof($data)) {
    2.     var_dump($data);
    3.     $query = mysql_query('INSERT INTO `tof_brands_1` (`BRA_ID`, `BRA_BRAND`, `BRA_MF_NR`) VALUES ' . join(', ', $data)
    4. );
    5. } 
    И посмотрите, что он вставляет в запрос: join(', ', $data).
     
  18. graf_vorontsov

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

    С нами с:
    12 фев 2011
    Сообщения:
    183
    Симпатии:
    1
    Адрес:
    Украина, Харьков
    блин.. вообще не выполняется этот код.. может в цикл его надо?
     
  19. Your

    Your Старожил

    С нами с:
    2 июл 2011
    Сообщения:
    4.074
    Симпатии:
    7
    Вам надо все данные выгрузить?
    Выбросите этот скрипт и поставьте, тот что выше писал, если надо выгружать до определенного количества, ограничивайте цикл.
     
  20. graf_vorontsov

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

    С нами с:
    12 фев 2011
    Сообщения:
    183
    Симпатии:
    1
    Адрес:
    Украина, Харьков
    нет, не до определённого количества, а всё, но пакетами, т.к. база большая(это я привёл пример что заметил на маленькой базе несоответствие)
    В этой теме мне ж и подсказали такой метод заливки по пакетам, метод работает, но я ж говорю не пойму почему не выгружает всё, да и когда разные значения $i то выгружает разное количество....
     
  21. Ganzal

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

    С нами с:
    15 мар 2007
    Сообщения:
    9.893
    Симпатии:
    965
    смотрите ошибки после выполнения запроса. может быть где-то проталкивание "пакета" вызывает ошибку и все записи, которые он содержит, не добавляются.
     
  22. graf_vorontsov

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

    С нами с:
    12 фев 2011
    Сообщения:
    183
    Симпатии:
    1
    Адрес:
    Украина, Харьков
    та не выдаёт ошибок никаких ((((((((
     
  23. Ganzal

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

    С нами с:
    15 мар 2007
    Сообщения:
    9.893
    Симпатии:
    965
    точно? какая проверка-то?
     
  24. graf_vorontsov

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

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

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

    С нами с:
    15 мар 2007
    Сообщения:
    9.893
    Симпатии:
    965
    а это вот в какой момент?