Конечно, этот сценарий далеко не идеален (например, он не поддерживает удаление
фотографий из фотоальбома), но для иллюстрации заявленных возможностей, по-
моему, вполне подходит. Для простоты я совместил две функции (администрирование
альбома и его просмотр) в одной программе. В реальной жизни, конечно, за каждую
из них должен отвечать отдельный сценарий (первый из них, наверное, будет
требо-
вать от пользователя прохождения авторизации, чтобы добавлять фотографии в аль-
бом могли лишь привилегированные пользователи).
Обратите внимание на то, как этот сценарий оформлен. В самом начале нахо-
дится весь код на PHP, который, собственно, и работает с данными фотоаль-
бома. В этом коде в принципе нет никаких указаний на то, как должна быть от-
форматирована страница. Его задача — просто сгенерировать данные.
Наоборот, тот текст, который следует после закрывающей скобки ?>, содержит
Глава 28. Загрузка файлов на сервер
395
минимум кода на PHP. Его главная задача — оформить страницу так, чтобы
она выглядела красиво. У меня нет никаких других стимулов, кроме как эконо-
мии типографской краски, чтобы не разнести данные блоки по разным файлам.
Мы еще вернемся к такому подходу в одной из следующих глав.
Сложные имена полей
Как вы, наверное, помните, элементы формы могут иметь имена, выглядящие, как
эле-
менты массива: A[10], B[1][text] и т. д. До недавнего времени (в третьей версии
PHP)
это касалось только "обычных" полей, но не полей закачки файлов. К счастью, в
PHP
версии 4 все изменилось в лучшую сторону.
Давайте применим указанные возможности в следующем примере формы и опреде-
лим, какие переменные создаст PHP при ее отправке на сервер.
После того как программа script.php примет данные из формы, PHP создаст для
нее следующие переменные:
r ассоциативный массив $File, ключи которого — text, bin и pic, а соответст-
вующие значения — имена временных файлов на сервере, созданных PHP при за-
грузке;
r массив $File_name все с теми же ключами и значениями — именами файлов в
системе пользователя;
r массив $File_type с теми же ключами и значениями — типами соответствую-
щих файлов;
r массив $File_size со значениями — размерами этих файлов.
Мы видим, информация об индексах в именах полей формы попала в ключи соответ-
ствующих массивов и сохранилась в них. Вы можете убедиться в том, что перемен-
ные действительно инициализированы, воспользовавшись вызовом функции
Dump($GLOBALS), код которой приведен в конце главы 11, и в полезности которой
вы
теперь можете убедиться на примере.
Еще раз напоминаю, что PHP версии 3 неправильно работает с подобными
именами полей. Учитывайте это, если собираетесь использовать старый ин-
терпретатор.
Часть V. Приемы программирования на PHP
396
Проблемы со сложными именами
Но не все так восхитительно, как может показаться на первый взгляд. Беда в том,
что
описанный механизм работает замечательно, лишь когда мы задействуем элементы
одномерных массивов в качестве имен полей формы. В случае же многомерных мас-
сивов дела обстоят несколько хуже. Правда, многомерные массивы используются при
закачке значительно реже, но все равно, мой долг — предупредить вас и уберечь
от
возможного недоразумения.
Итак, напишем форму: