Ваш первый Сайт С использованием РНР-скриптов
CSV-ФАЙЛЫ
Гостевая книга является чуть ли не обязательным атрибутом современных сайтов. Посетители сайта могут оставлять в гостевой книге свои сообщения или пожелания. Если помните, в прошлой главе мы делали книгу отзывов. Гостевая книга представляет собой нечто похожее, но есть и различия. В книге отзывов вы не могли отвечать на отзывы посетителей, вернее, могли, но как посетитель, а не администратор. Мы сделаем гостевую книгу, которая вам позволяла бы отвечать каждому посетителю, оставившему свою запись в этой книге. Помимо имени и e-mail, предоставим посетителю указывать URL своего сайта. Программа выведет данные посетителя, ссылки на его сайт и e-mail, дату и время появления сообщения, и, естественно, сам текст сообщения. Прежде чем приступить к созданию гостевой книги, мы, как обычно, продолжим изучение других возможностей php-языка.
До сих пор мы использовали простые текстовые файлы для хранения и считывания каких-либо данных. Для работоспособности, например, счетчика, этого вполне достаточно. Мы обходились несколькими строками. Аналогично в текстовом файле для книги отзывов мы записывали в одну строку и данные посетителя, и его отзыв. В текстовом файле для гостевой книги мы должны, помимо данных посетителя и его записи, добавлять при необходимости свой ответ этому посетителю. Записывать все это в одну строку в текстовом файле нежелательно, да и не удобно при ручном редактировании записей. В данном случае нужно применять текстовые файлы с табличной структурой, называемые CSV-файлами. Данные в таком файле записываются в виде двумерной таблицы, отделяясь друг от друга в строке некоторым разделительным символом. Для чтения данных, разделенных каким-либо символом, применяется функция:
Fgetcsv($descr, line, razd, ogran). Первый аргумент является дескриптором или идентификатором открытого файла. Его, как вы помните, возвращает функция fopen. Второй необязательный аргумент задает длину строки в байтах. Длину можно и не указывать, но тогда снизится быстродействие функции. Вообще желательно этот параметр указывать всегда для корректной работы функции. Третий необязательный аргумент задает тип разделителя между данными в строке. По умолчанию это запятая, но можно задать свой разделитель, например «*» или «|». Четвертый необязательный параметр является символом, влияющим на объединение строк в файле. По умолчанию это двойные кавычки. Если вы в CSV-файле заключите в двойные кавычки какую-либо фразу, то данная фраза полностью станет отдельным элементом
Массива, возвращаемого рассматриваемой функцией. Функция Fgetcsv возвращает, как вы уже, наверное, догадались, массив данных строки, отделенных друг от друга указанным разделителем. При достижении конца файла данная функция возвратит False.
Посмотрим, как работает рассмотренная выше функция. Создайте в рабочей папке htdocs подпапку gostevaja, а в этой подпапке простой текстовый файл CSVfde.txt. Запишите туда две строки. Слова каждой строки разделите символом «|». Я, например, записал следующее: Один | два | три | четыре пять кол | пара | троякхорогио | отлично
После этого в РНР-редакторе создайте новый файл. Назовите его, например, csv.php и сохраните его тоже в подпапке gostevaja. Наберите между тегами <?php и?> следующие строчки: $open=fopen("CSVfde.txt", "г"); $dan =fgetcsv(Sopen, 2048, ""); print_r($dan);
Сначала мы открываем файл и присваиваем ему дескриптор $ореп. Далее переменной $dan мы присваиваем результат действия функции fgetcsv. Размер строки мы установили 2 кб, хотя в данном случае хватило бы и 100 байт. Разделитель указываем тот, который использовали в текстовом файле. И, наконец, при помощи php-функции print Г выводим полученный массив в браузер. Сохраните и запустите программу. В браузере вы увидите следующее, если, конечно, вы записали в текстовый файл то же самое, что и я: Array ([0]=>один [1]->два [2]=>три [3]=>четыре [4]=>пять)
А увидите вы массив элементов первой строки (нумерация элементов в массиве, напомню, начинается с нуля). Если вы хотите, чтобы вывелись все строки, т. е. массив строк, каждая из которых представляет массив элементов (слов), удалите прошлый код и наберите немного другой: $ореп =fopen("CSVfde.txt", "г");
While(($dan =fgetcsv(Sopen, 2048, "")) !==false)
{
$rec[]=$dan; }
Print_r($rec);
В отличие от прошлой программы, функция fgetcsv выполняется, пока не будет достигнут конец файла, т. е. цикл while будет выполняться (в нашем случае два раза), пока функция fgetcsv не возвратит значение false. При каждом выполнении цикла, переменной $dan будет присваиваться массив слов очередной строки. Этот массив строки мы записываем в массив $гес. Таким образом, у нас получается двумерный массив $гес, элементом которого является строка, которая, в свою очередь, тоже является массивом слов, разделенных символом «|». Запустив данную программу, вы увидите следующее: Array ([0]=>Array ([0]=>один [1]=>два [2]=>три [3]=> четыре [4]=>пять) [1]=> Array ([0]=>кол [1]=>пара [2]=>трояк [3]=>хорошо [4]=> отлично)).
Это уже двумерный массив, 2 строки по 5 элементов в каждой. Вообще для чтения файлов с данными в виде двумерных массивов, удобно было бы использовать отдельную функцию, которую мы создадим в разд. 7.2.