Иллюстрированный самоучитель по PHP

Папкопотрошилка

При создании Интернет-ресурса, содержащего часто обновляющееся однотипное содержание, проблема быстроты и удобства обновления встает достаточно остро. Например, вы являетесь администратором сайта, на котором размещаются статьи разных авторов. В таком случае при поступлении новой статьи вам приходится, помимо размещения на web-сервере (или выделенном вам аккаунте) ее самой, еще и обновлять страницу со списком этих статей, добавив ссылку на новоразмещенную web-страницу со статьей – иначе ведь попасть на новую статью с сайта будет невозможно. А если статьи поступают часто? Да еще и не только поступают, но и удаляются, или в них меняется название? Тогда ведь для отслеживания правильности содержания приходится прилагать немало усилий.

Или другая ситуация – необходимо разместить на сайте новостную ленту. Простое решение напрашивается сразу: просто включать текст новостей в содержащую их страницу. Или, в.крайнем случае, писать новости в отдельном файле, а в web-страницу включать этот файл с помощью команды PHP include – тогда при обновлении новостей придется загружать на сервер только файл с новостями, а не всю страницу. Но все же… не так это и удобно! Каждый раз работать с файлом с гипертекстовой разметкой, каждый раз его загружать на сайт… А если вам надо поручить загрузку человеку, который совершенно не знает HTML? Текст-то он напишет, а вот вставить его в нужное место гипертекстовой разметки?

Или, наконец, третья ситуация – вы делаете файловый архив, и ваши друзья загружают на ваш сервер свои файлы. Как сделать так, чтобы они появлялись в списке доступных для посетителей файлов сразу же после их загрузки, без вашего участия, без необходимости вручную обновлять их список?

Приведенный ниже сценарий на языке РНР пригодится вам во всех трех случаях. Вкратце его алгоритм прост: при вызове содержащей его страницы он пробегает по всем файлам в указанной в сценарии директории и составляет их список. А с этим списком можно уже сделать все что хочется: либо включить их содержимое друг за другом в выводимую web-страницу, либо составить каталог файлов.

Итак – вот сценарий:

<?php

Сначала укажем сценарию имя папки, в которой содержатся подлежащие каталогизации или включению в другую страницу файлы:

$dirct="new";

Для того чтобы РНР мог работать с файлами из этой папки, необходимо указать ее дескриптор – некое "внутреннее имя", "поток вывода данных" (о том, почему приходится так делать, смотрите литературу по РНР и программированию, пока же просто примите к сведению). Для этого используется функция opendir (каталог), а получаемый с ее помощью дескриптор записывается в переменную $hdl:

$hdl=opendir($dirct);

Теперь запишем все имена содержащихся в ней файлов в массив $а [ ]. Согласно синтаксису РНР (см. гл. 3), для этого достаточно просто присваивать массиву $а [ ] различные значения – при этом автоматически в него будут добавляться новые члены, которым эти значения будут присваиваться. Для помещения имен файлов (с расширениями) из директории $dirct в массив используется функция readdir (имя каталога), работающая с дескриптором этой директории, записанным ранее в переменную $hdl с помощью функции opendir.

Комментарий
Функция readdir предназначена для вывода списка файлов и папок, содержащихся в указанном в ее параметре каталоге. При каждом своем вызове она выдает имя случайно выбранного файла (или вложенной папки) указанного каталога, каждый раз – новое, до тех пор, пока не перечислит имена всех файлов и вложенных папок
.

Среди выданных функцией readdir имен будут и ссылки на текущий и родительский (т. е. включающий в себя текущий) каталог, обозначаемые соответственно одной и двумя точками (так уж работает web-сервер). Поскольку нас интересуют только файлы каталога, то данные ссылки из списка файлов следует исключить, добавив проверку состава имени файла.

while ($file = readdir($hdl))
if (($file!=".")&&($file!="..")) $a[]=$file;
}

Теперь закроем открытую папку, очистив дескриптор (так необходимо) – функцией closedir (каталог):

closedir($hdl);
Если Вы заметили ошибку, выделите, пожалуйста, необходимый текст и нажмите CTRL + Enter, чтобы сообщить об этом редактору.