Люди, вот ещё вопрос по fgetcsv()

Sufir

Я не волшебник, я только учусь
Люди, вот ещё вопрос по fgetcsv()

Люди, вот ещё вопрос по fgetcsv().
Классический вариант: Файл 01.csv после загрузки на сервер разбирается и данные заносятся в базу данных.
PHP:
$file = fopen('01.txt', "r");
while ($data = fgetcsv($file, 1024, "\t")) {
  if (count($data) == 2) {
  // проверяем кол-во полей (на самом деле их больше)
     if ((strlen($data[0]) > 0) and (strlen($data[1]) > 0)) {
     // проверяем наличие информации в полях
        $MySQLQuery = 'INSERT INTO `table` SET...';
        mysql_query($MySQLQuery);
     } else {
        echo('Ошибка в структуре файла.');
     }
  }
}
И на серваке и дома
Apache 1.3
PHP 5
MySQL 4.1
Дома WinXP и ALTLinux.
На серваке соответственно какаято UNIX'оидная система, точно не помню.
Дело в том, что дома скрипт работает идеально. Один и тот же файл локально разбирается отлично. При запуске скрипта на сервере шпарят сообщения "Ошибка в структуре файла.". Из всего файла в базу добавляется не более пятой части, который локально был полностью импортирован в базу. И импортируется коряво. Некоторые поля вообще разделяются по пробелам или слэшам, данные соответственно испорчены.
Тот же файл скачиваю обратно с сервера и локально снова проверяю - всё работает.
Может кто сталкивался? Мистика какая то...
 

chisto_tolyan

Враг народа
попробуй читать большими кусками(не по 1024 байта), и в винде перенос строки - \r\n, в *nixe - \n.
и зачем проверять кол-во полей?
 

Sufir

Я не волшебник, я только учусь
Кол-во проверять надо, потом ещё кое-какая работа с ними идет. На счет \r\n и \n - знаю, пробовал - безуспешно. А вот на счет кусков - зачем? Ведь тот же файл локально тем-же скриптом обрабатывается нормально.
 

Sufir

Я не волшебник, я только учусь
В том-то и дело, что "всё работает"... Но только локально, а не у хостера.
Попробовал разделители другие использовать. Вообще я думаю - на серваке глюк (хотя странно). Если как раз так-и проверку содержимого полей убрать - база заполняется, но коряво. Более половины полей пустыми оказываются. Буду изворачиваться, без fgetcsv() как нибудь...
 

SiMM

Новичок
> В том-то и дело, что "всё работает"...
Если всё работает - зачем же ты сюда пришёл? Если всё же не работает - иди и читай указания. Подозрений SelenITа бы не было вообще, если бы ты выполнил то, что написано по ссылке, а были бы прямые указания. Хотя опять же - ничто не мешает тебе прочесть нужное самому. В том же самом FAQ. Но вначале - отладка.
 

Sufir

Я не волшебник, я только учусь
Запоса к базе?
PHP:
                     echo $MySQLQuery = 'INSERT INTO `table` SET
                                article=\'' . mysql_escape_string(trim($data[0])) . '\',
                                name=\'' . mysql_escape_string(trim(preg_replace($searchn,
                                                                          $replacen, $data[1]))) . '\',
                                genre=\'' . mysql_escape_string(trim(preg_replace($searchg,
                                                                           $replaceg, $data[2]))) . '\',
                                producer=\'' . mysql_escape_string(trim($data[3])) . '\',
                                date=\'' . mysql_escape_string(trim($data[4])) . '\',
                                price=\'' . mysql_escape_string(trim($data[6])) . '\',
                                d_price=\'' . mysql_escape_string(trim($data[8])) . '\',
                                format=\'' . mysql_escape_string(trim($data[15])) . '\',
                                pack=\'' . mysql_escape_string(trim($data[16])) . '\',
                                cdnum=\'' . mysql_escape_string(trim($data[17])) . '\',
                                code=\'' . mysql_escape_string(trim($data[19])) . '\';';
Только он здесь не при чем. До него дело не доходит. Проблема при работе fgetcsv().
PHP:
$data = fgetcsv($file, 1024, ";", "\n");
-~{}~ 29.05.06 23:49:

"Всё работает"... Но только локально, а не у хостера. Скрипт один в один и файл один в один заливаю на сервер. Даже база у меня называется так же как на сервере и пароль такой же, всегда так делаю.
SiMM, читал ранее. Сейчас перечитал ещё. Статья полезная, но не в данном случае.
 

SiMM

Новичок
> SiMM, читал ранее. Сейчас перечитал ещё. Статья полезная, но не в данном случае.
Это заблуждение. Ты же даже содержимое строки, на которой затык происходит, до сих пор не выяснил - разве ж это отладка? Не говоря уж о том, что не указал версию PHP и значение такого параметра, как magic_quotes_runtime.
 

Sufir

Я не волшебник, я только учусь
Версию указал. В самом первом сообщении. Точнее - 5.1.2.
magic_quotes_runtime = Off (и дома и у хостера)
не указал, но не выкладывать же мне весь php.ini Да и вообще там кавычек нет ни в файле, ни в базе не будет (не должно быть).

На счет "содержимое строки, на котором затык происходит, до сих пор не выяснил" - не понял. Ты о чем?

Поясняю: файл разбивается функцией fgetcsv() и некоторые элементы массива оказываются пустыми а некоторые с потерянной частью информации. Ошибок скрипт не выдает, и вообще, спокойно работает и делает вид что всё так и должно быть. И затыков никаких не происходит. Почему "портятся" данные (!а дома не портятся)?

Вообще думаю можно закрыть тему. Проку от нее всё равно ни какого. Только отвлекаемся и воду в ступе толчем.
А если знаете/подозреваете в чем проблема, так и скажите "дурень, вот где..." и пальцем ткните. Искал я и в мануалах и везде где мог. На форум обращаюсь всегда в последнюю очередь, когда уж совсем припрет...
 

SiMM

Новичок
> Поясняю: файл разбивается функцией fgetcsv() и некоторые элементы массива оказываются пустыми а некоторые с потерянной частью информации.
К твоему сведению, fgetcsv читает файлы построчно. Узнать, на какой строке происходит глюк с fgetcsv и посмотреть на её содержимое, думаю, труда не составляет никакого.

> А если знаете в чем проблема, так и скажите "дурень, вот где..." и пальцем ткните.
Ты думаешь, здесь есть телепаты? Наивно. В любом случае на http://bugs.php.net о подобном глюке 5.1.2 не слышно, и если ты захочешь послать багрепорт - всё равно придётся написать нормальный отчёт для воспроизведения ситуации. Хотя, если баг всё же в PHP имеет место быть - скорее всего ответом будет совет поставить 5.1.4.
 

Sufir

Я не волшебник, я только учусь
> К твоему сведению, fgetcsv читает файлы построчно. Узнать, на какой строке происходит глюк с fgetcsv и посмотреть на её содержимое, думаю, труда не составляет никакого.

Из 3-х тысячь строк примерно 2,5 тысячи не правильно разбиваются. Версии php ни при чем. И дома и на серваке 5.1.2. Дома, повторюсь, тот же файл и те же строки нормально разбиваются.
 

SiMM

Новичок
Мне собственно без разницы, что ты там вбил себе в голову. В любом случае - если это баг - вменяемого багрепорта от тебя, как я посмотрю, всё равно не дождёшься.
 

Sufir

Я не волшебник, я только учусь
Статей и мануалов "Как правильно писать багрепорт" мне не попадалось. Поясни как таковой написать - сделаю.
И вообще - чего так агрессивно? Я думаю пора прекращать прения. Только форум засоряем.
 
Сверху