Сегодня, буквально пару часов назад, мне пришлось ковыряться в скрипте знакомого. Скрипт работает с базой данных в виде CSV-файла и соответственно использует функции для работы с CSV. Через 10 минут тестирования кода скрипта я понял, что функция fgetcsv попросту не работает на сервере, вернее со страшной силой глючит и выдает совершенно спонтанный результат. Решать проблему надо было быстро, а устранение неисправности на хостинге, да еще и на чужом - сами понимаете 
Ну, проблема была решена мной в течение пяти минут, а с тем, как я решил эту проблему, я собственно решил поделиться и с Вами 
Итак, что мы имеем: 1. Мы имеем функцию fgetcsv() , которая не корректно работает на сервере. 2. Мы имеем скрипт который использует fgetcsv() и соответственно отказывается нормально работать. 3. Мы не имеем доступа к настройкам сервера, так что о быстром исправлении работы функции fgetcsv не может идти и речи.
Лично у меня вывод напросился сам собой - написать функцию, которая заменит fgetcsv() , что и было сделано в течение пяти минут, за чашечкой кофе 
Открываем документацию PHP: fgetcsv (PHP 3 >= 3.0.8, PHP 4, PHP 5)
fgetcsv -- Читает строку из файла и производит разбор данных CSV Описание array fgetcsv ( resource handle [, int length [, string delimiter [, string enclosure]]] )
handle Корректный файловый указатель на файл, успешно открытый при помощи fopen(), popen(), или fsockopen().
length (Необязательный) Должен быть больше самой длинной строки (в символах), найденной в CSV-файле (включая завершающий символ конца строки). Он стал необязательным в PHP 5. Если этот аргумент не указан (или равен 0 в версиях PHP 5.0.4 и выше), максимальная длинна строки не ограничена, но функция работает немного медленнее.
delimiter (Необязательный) Устанавливает разделитель поля (только один символ). По умолчанию это запятая.
enclosure (Необязательный) Устанавливает символ ограничителя поля (только один символ). По умолчанию это двойная кавычка. Добавлен в PHP 4.3.0.
Данная функция похожа на функцию fgets(), с той разницей, что она производит анализ строки на наличие записей в формате CSV и возвращает найденные поля в качестве массива.
Функция fgetcsv() возвращает FALSE в случае ошибки, а также по достижению конца файла.
Замечание: Пустая строка CSV-файла будет возвращена в качестве массива, содержащего единственный элемент null, ошибки в данном случае не возникнет.
Другими словами, эта функция считывает строку из файла и помещает данные в массив. Данные из строки, помещатся в соответствующие элементы массива, на основе указанного разделителя (чаще всего точка с запятой ";" или запятая).
Сразу же мне на ум приходит почти аналогичная функция split(), которая делает почти то же самое, только работает не с файлом, а с конкретной строкой.
В итоге, получился такой код: function xfgetcsv($f='', $x='', $s=';'){ if($str=fgets($f)){ $data=split($s, trim($str)); return $data; }else{ return FALSE; } }
Эта функция работает абсолютно идентично fgetcsv, за тем лишь исключением, что невозможно ограничить лимитом длину строки (ну мне это было не нужно в данном конкретном случае). Так что если возникли проблемы с fgetcsv - берите и пользуйтесь на здоровье  Функция на столько проста, что комментарии в ней попросту не нужны 
Примечание: Данная статья написана больше для того, что бы показать, что безвыходных ситуаций в принципе не бывает, достаточно применить воображение. |