спасибо! пока тему не закрываю.. хочу попробовать использовать mysqli ... ато пишите что лучше она, хоть попробую. пока правда просто попытался подставить букву i ко всем функциям mysql ... не удалось
Посмотри отличия в мануале. Во-первых, в mysqli (в отличии от mysql) - нужно обязательно передавать указатель на соединение с базой данных (то, что возвращает mysqli_connect). И этот указатель должен стоять на первом месте, а текст запроса - вторым аргументом.
ок. а ещё хотел спросить таку штуку думал сделать выгрузку строк в зависимости от того что мне требуется Код (PHP): $f = fopen("TECDOC_TOF_BRANDS.txt", "r"); //файл брендов $brand = get_brands($f); //получаем массив с файла брендов do { foreach ($brand as $br){ foreach ($br as $b){ } if ($nums['3'] != $br['0']) continue; //пропускаем позиции, если бренды не содержатся в файле с брендами //если производитель RUVILLE(23) то добавляем EVR в начало номера if($nums['3'] == '23'){ $nums['1'] = "EVR".$nums['1']; } $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]')"); } } } while ($r = odbc_fetch_array($res)); это мой старый запрос с которого началась тема, но я не писал что пытался выбрать также по условию это часть файла TECDOC_TOF_BRANDS.txt Код (Text): 1 SPIDAN SPIDAN 501 2 HELLA HELLA 502 3 ATE ATE 503 5 PIERBURG PIERBURG 505 6 LUK LuK 506 7 EBERS EBERSPACHER 507 12 PAGID PAGID 512 17 KLOTZ HK 517 18 KONI KONI 518 19 SWF SWF 519 21 VALEO VALEO 521 30 BOSCH BOSCH 530 31 CONTI CONTITECH 531 в зависимости от наличия в этом файле производителя, я выбирал запчасти именно этих производителей что в файле, но у меня выгрузилось только 450тысяч позиций и скрипт завершился, мне кажется надо применит что-то типа рекурсии? или нет?
Так медленее: Код (PHP): $var="str $str"; Чем так: Код (PHP): $var="str".$str; Раз вы каким-то способов сделали уже через файл, то почему бы не сделать backup? Или это не то? На столько много результатов в миллионы строк, это будет в любом случае долго, если выгружать все... Иначе нужно делать ограничение... Как то криво написали видимо... В данном случае что требуется, то? Что вы хотите проверить в файле?
Если переменная для склейки всего одна - то да. Если их будет несколько - то быстрее будет первый вариант.
Медленее будет вариант 1 всегда... Уже не раз проверял и делал еще давно всякие разные тесты... Да и вообще ковычки " " отличаются от ' '.
ключевое слово здесь "давно" это было актуально во времена php4 сейчас разница в корости в пределах погрешности измерения.
Я же несколькими сообщениями выше - привёл конкретный скрипт для тестирования и результаты его работы на моём домашнем компе и на сервере. И там наглядно видно, что одна строка в двойных кавычках со вставленными в эту строку переменными обрабатывается быстрее, чем несколько строк в одинарных кавычках, склеенных с переменными точкой. Вообще, разница довольно заметная, там 20-30% где-то.
Понял... Тоже по-тестил, на новых версиях, оказывается ты прав =) Работает быстрее с "$str" или "{$str}". Я просто давно когда - то тестил, медленнее было... На больших размерах данных это очень сильно заметно... Только вот одно но-это только для переменных и массивов, так, что конкатенация не исключена... А все переменные можно через функцию получать... Так, что лучше уж конкатенацией, чем смешано и разбросанно...
обнаружил проблемку... когда доходит файл до конца, и код этот уже не может выполнятся, т.к. количество оставшихся позиций меньше 3000 Код (PHP): if($i > 3000) { $query = mysql_query('INSERT INTO `tof_brands_1` (`BRA_ID`, `BRA_BRAND`, `BRA_MF_NR`) VALUES ' . join(', ', $data)); $i = 0; $data = array(); } и начинает выполнятся это Код (PHP): if(sizeof($data)) { $query = mysql_query('INSERT INTO `tof_brands_1` (`BRA_ID`, `BRA_BRAND`, `BRA_MF_NR`) VALUES ' . join(', ', $data)); } т.е. остаток должен вставится в базу, а нет.. не тут то было, не идёт. почему? подскажите
Должно идти. Почему не идёт - х.з. Магия... Ну напиши там: Код (PHP): if(sizeof($data)) { $query = mysql_query('INSERT INTO `tof_brands_1` (`BRA_ID`, `BRA_BRAND`, `BRA_MF_NR`) VALUES ' . join(', ', $data)); if(!$query) { echo mysql_error(); } } посмотришь, что за ошибка Добавлено спустя 2 минуты 23 секунды: Лучше даже так, чтобы и сам запрос посмотреть: Код (PHP): if(sizeof($data)) { $sql = 'INSERT INTO `tof_brands_1` (`BRA_ID`, `BRA_BRAND`, `BRA_MF_NR`) VALUES ' . join(', ', $data); $query = mysql_query($sql); if(!$query) { echo 'Ошибка запроса. Запрос: <br>' . $sql . '<br>Ошибка:<br>' . mysql_error(); } }
не, дело в том что ошибки нет! просто не догружает строки все вот например ставлю if($i > 500) выгружает 1149 if($i > 100) выгружает 2349 if($i > 5) выгружает 2634 а должно выгрузить 2652
Покажи весь код полностью, который у тебя сейчас используется и приводит к такому странному результату.
Код (PHP): <?php set_time_limit(20); $host = "localhost"; $user = "root"; $password = ""; // Производим попытку подключения к серверу MySQL: if (!mysql_connect($host, $user, $password)){ echo "<h2>MySQL Error!</h2>"; exit; } // Выбираем базу данных: $db = 'forever'; mysql_select_db($db); $dsntd = "DSN=TECDOC_CD_1_2013;Database=TECDOC_CD_1_2013;Server=localhost;Port=;UID=tecdoc;PWD=tcd_error_0"; $id = odbc_connect($dsntd, "", ""); echo $id; echo odbc_tables($id); $res = odbc_exec($id, "SELECT * FROM TOF_BRANDS"); //Создаём таблицу с полями, если не существует mysql_query("CREATE TABLE IF NOT EXISTS `TOF_BRANDS_1`( `BRA_ID` smallint(6) NOT NULL, `BRA_BRAND` varchar(25) NOT NULL, `BRA_MF_NR` integer(11) NOT NULL ) ENGINE=InnoDB"); $data = array(); $i = 0; while($r = odbc_fetch_array($res)) { $data[] = "('{$r['BRA_ID']}', '{$r['BRA_BRAND']}','{$r['BRA_MF_NR']}')"; ++$i; if($i > 5) { $query = mysql_query('INSERT INTO `tof_brands_1` (`BRA_ID`, `BRA_BRAND`, `BRA_MF_NR`) VALUES ' . join(', ', $data)); $i = 0; $data = array(); } } if(sizeof($data)) { $sql = 'INSERT INTO `tof_brands_1` (`BRA_ID`, `BRA_BRAND`, `BRA_MF_NR`) VALUES ' . join(', ', $data); $query = mysql_query($sql); if(!$query) { echo 'Ошибка запроса. Запрос: <br>' . $sql . '<br>Ошибка:<br>' . mysql_error(); } } if ($query == 'true'){ echo "<p>Обновление БД прошло успешно!</p> "; }else{ echo "<p>Не удалось обновить записи в БД</p> "; } echo mysql_errno(); echo mysql_error(); //*********************************** ?> Добавлено спустя 1 минуту 14 секунд: да, это результаты по итогу в таблице БД
Он больше и не выведет. Какой еще остаток, вы ограничили цикл, а остаток ваш не выйдет, вы посмотрите, что придет в: Код (PHP): if(sizeof($data)) { var_dump($data); $query = mysql_query('INSERT INTO `tof_brands_1` (`BRA_ID`, `BRA_BRAND`, `BRA_MF_NR`) VALUES ' . join(', ', $data) ); } И посмотрите, что он вставляет в запрос: join(', ', $data).
Вам надо все данные выгрузить? Выбросите этот скрипт и поставьте, тот что выше писал, если надо выгружать до определенного количества, ограничивайте цикл.
нет, не до определённого количества, а всё, но пакетами, т.к. база большая(это я привёл пример что заметил на маленькой базе несоответствие) В этой теме мне ж и подсказали такой метод заливки по пакетам, метод работает, но я ж говорю не пойму почему не выгружает всё, да и когда разные значения $i то выгружает разное количество....
смотрите ошибки после выполнения запроса. может быть где-то проталкивание "пакета" вызывает ошибку и все записи, которые он содержит, не добавляются.
Код (PHP): error_reporting(E_ALL | E_STRICT) ; ini_set('display_errors','On'); echo mysql_errno(); echo mysql_error();