Forum Webscript.Ru
Программирование => PHP => Тема начата: ash от 04 Марта 2002, 16:06:33
-
Приветствую вас, уважаемые господа.
Начну с того, что я не программист, хотя иногда приходится разбирать некоторые вопросы по этой специальности.
Ситуация:
Server: Win2000SE + Apache/1.3.20 + PHP 4.x.x (про иксы будет повествование дальше) + MySQL 3.23.46
На этом безобразии вертится некий сайт (пока в тестовом режиме, но уже пора переводит его в люди), где есть скрипт, работающий по схеме:
1. пользователь делает из прайс-листа csv (около 4000 позиций)
2. указывает где лежит прайс, жмет кнопку
3. скрипт обрабатывает запрос что-то с ним делает (что конкретно - не знаю)
4. пользователю выводится сообщение, что все ОК прайс выкачан без ошибок и кнопочка ОБНОВИТЬ
5. скрипт заливает прайс в базу
Вот тут начинается свистопляска с версиями PHP (судя по тестам, что я проводил именно с ними). У прайса куча категорий и подкатегорий, часть из них на английском, с ними все в порядке, НО вот с русскими названиями и пунктами творится нечто ужасное...
Случайным образом отрезается произвольное количество
русских букв с начала или конца слова. Я не оговорился - именно случайным, т.к. при одной и той же версии PHP при нескольких закачках количество, буква и место (начало либо конец. Про середину не знаю, не замечал) меняются =(((
Еще одно положение в пользу версии о глюках именно PHP говорит тот факт, что: при установки версии 4.1.1 иногда пропадают целые слова и выпадение букв повальное; версия 4.0.6 работет лучше, но из
кетчупов получаются чупы , более лояльно к этому относится 4.0.5 версия, сначала я жаде думал, что она работает как надо и успокоиюлся (программер, что писал скрипт то же), но как оказалось это не так.. дотошный заказчик обнаружил атончики вместо батончиков в глубине одной из категорий товаров (и здесь куски опять же блуждающие, я примотрелся и нашел еще несколько нехватающих букв.
Вот и сейчас я в совершеннейшей растерянности, что делать и как выловить это т глюк. =(
На данный момент я имею: версия PHP 4.0.5 более терпима к "обрезанию" русских букв; факт выпадения букв происходит до этапа попадания данных в БД; чаще всего страдают буквы в начае слова (Б, Ч, К, но не они одни), при этой версии обычно вываливаются 1-2 буквы (т.е. первая и вторая, иногда и больше так например: Шоколад превращался в Лад); в пунктах где первыми идут цифры - буквы на своих местах; английские слова не трогаются.
Если кто сталкивался с таким или представляет сбе что это может быть и как от этого избавиться - скажите плизз.
-
а на каком этапе происходит пропадание букв... при передачи в мюскл или при самом сохранении...?
попробуй сначала просто посмотреть как передаются переменные.. передавай их пхп скрипту и пусть он выводит посмотреть что там...
может мюскл глючит?
-
Программер, чт описал этот скрипт проверял. до мюскла доходят уже резанные буквы =(
они выпадают где-то на уровне обработки данных пхпшным скриптом.
Я бы грешил на скрипт, но: с английскими словами все в порядке; разные версии выбрасывают разное кол-во букв; очень редко встречаются повторяющиеся выпадения; и самое главное (!) я проверил этот скрипт на машине под фрёй, выпадений букв - как не бывало, все ок.
=( Что делать - не знаю совсем. Под юникс этот сайт перенести не получится =((((
Может кто знает как пофиксить подобные глюки пхп?
-
mysql настроен на win-1251?
правильная ли обработка закачки файла на сервер?
-
хм... думаем одновременно :)
так файл до сервера как доходит? битым? если его записать на диск?
-
Только что потестил еще раз.
MySQL все на той же машине (т.е. база лежит на машине, описаной в первом сообщении),
Apache/1.3.19 (Unix) rus/PL30.4 + PHP 4.0.5 на FreeBSD.
Провожу аналогичную операцию и вижу что все буквы добрались в целости и сохранности. => проблема именно в PHP и именно для платформы win32.
Полностью переносить сайт на unix машину нет никакой возможности (впрочем и частичной то же из-за проблем безопасности, они стоят в разных сетках).
Это можно поправить как-нибудь? или ждать 4.1.2 под винду? ... =((((
mysql настроен на win-1251?
А можно эту часть подробней? =)
-
http://www.phpdevs.com/data/22/47.html
а лучше всего - ман.
-
Написал скрипт конвертера из одного формата цсв - в другой - все работало прекрасно, но в один прекрасный день запускаю, и начались такие же траблы со съеданием букв.
все решилось рестартом апача и нескольких рефрешев (1.3.22 + php4.1.1 as module).
-
Со вчерашнего дня на php.net лежит файло!
так что ждать больше не нужно - качай и юзай, а потом расскажешь - что из этого вышло.
-
Такие же траблы происходят, именно на win2000 sp2 и ничего не помогает.
apache 1.3.23, php 4.2.0 (module)
а вот на старом добром 98se пашет на ура..
p.s. пробовал также версию с php4win.de
p.p.s. на php4win.de - php4ts.dll такой же как и в дистрибутиве с php.net
-
Нда... Кстати, на локальной машине (рабочей) стоит ХР - такая же ерунда.
-
Забавно...
Вот два варианта, первый работает, а 2-ой - нет.
1.
while($data = fgets($fp, 4096)){
$data = explode("\\t",$data);
$num = count($data);
......
}
?>
2.
while($data = fgetcsv($fp, 1000, "\\t")) {
$num = count($data);
.......
}
?>
Получается что ф-я fgetcsv неверно работает под NT-ями
-
А вот рез-т обработки 2-го варианта:
Нек-рые из них:
3 600 Коньков Профсоюзная п 0 0 2 16
1 550 ровицкая Серафимовича ул. п 5 7 1 12
1 250 Фил п 0 0 9 12
1 250 Любл Красикова у п 10 0 0 0
1 350 ВДН Малахитовая п 0 0 2 9
1 500 Аэропор Степана супруна п 0 0 5 12
2 700 елковская Сиреневый бульв. п 10 12 0 0
1 250 абушкинская Менжинског п 0 0 3 4
1 250 енев п 0 0 3 10
1 250 Марь Поречная п 0 0 14 14
:)
-
программер, что писал матерился на это дело, мне его не удалось уломать на переписывание функции скриптом...
а что с первым вариантом?
-
Опечатка :), второй вариант - не работает (поправил в сообщении)
А 1-ый все нормально выдает, и ничего не портит
-
Дело в том, что ф-я fgets не учитывает особенностей csv файла. Ведь в нем экранируются специальные символы, встречающиеся в тексте (например: "), посему в базу загоняются двойные значения...
вот кусок csv файла
655NGVK03;"Момент.овс.каша""Вкусново""традицион. 40г 5пак/20";23,08
655NGVK10;"Момент.овс.каша ""Вкусново"" банан 40г 5пак/24";23,08
а вот итог вывода с ф-ей fgets
"Момент.овс.каша""Вкусново""традицион. 40г 5пак/20"
"Момент.овс.каша ""Вкусново"" банан 40г 5пак/24"
и кусок обработаный ф-ей fgetcsv
Момент.овс.каша"Вкусново"традицион. 40г 5пак/20
Момент.овс.каша "Вкусново" банан 40г 5пак/24
Как видишь - разница есть... Хотя вроде все работает, буквы не попадают и т.д., но а что если будет использована ; в тексте? Ее csv экранирует (test;"test11; test22";123) [test11; test22 - в одной ячейке находились], вот в данном примере функция подумает, что колонок не три, а четыре...
=(
P.S. Совсем забыл сказать, что я поменял разделитель и теперь функция выглядит так:
while ($arData = fgets($file, 4096))
{
$arData = explode(";",$arData);
....
-
в данном случае мне повезло, что нет " :)
ИМХО, вообще это явно какой-то баг в самом php.
причем повторюсь, что на 98se работает прекрасно с fgetcsv.
У кого с английским хорошо? может написать разработчикам? :)
-
Я вот уже подумывал об этом, но не владею тех информацией, т.е. не смогу на программерском уровне описать баг.
З.Ы. да и аглицкий прихрамывает. =)
-
на http://bugs.php.net/ , имхо, уже есть этот баг