Финальное задание по PHP
Требуется создать простой персональный альбом. Далее описание ожидаемого результата.
Внимание! Черновой вариант, следите за обновлениями, последнее обновление 18.05.2010
База данных
- База MySQL на kappa. Реквизиты для доступа были высланы почтой;
-
Таблица users с полями login, password
- В поле login хранится идентификатор пользователя;
- идентификатор - латинские буквы в нижнем регистре, цифры и знак подчеркивания, до 16 символов, начинается на букву;
- В поле password хранится хэш-функция от пароля пользователя.
Для вычисления можно использовать функцию PASSWORD() MySQL:
mysql> select password("123"); +-------------------------------------------+ | password("123") | +-------------------------------------------+ | *23AE809DDACAF96AF0FD78ED04B6A265E05AA257 | +-------------------------------------------+ 1 row in set (0.00 sec)
- Вручную в таблицу добавляется хотя бы одна запись для владельца альбома.
-
Таблица images с полями id, caption
- Поле id - идентификатор изображения (число);
- Идентификатор автоматически увеличивается с каждым добавленным изображением (используйте AUTO_INCREMENT);
- В поле caption хранится описание изображения - строка в кодировке UTF-8 длиной до 256 символов
Файловая система
- Каталог /home/логин/public_html/images
- В этот каталог перемещаются изображения после успешного upload-а
- Права доступа: разрешен вход в каталог (x), запись (w) и получение списка файлов (r)
для учетной записи wwwrun, с правами которой работает web-сервер
apache на kappa:
> mkdir $HOME/public_html/images > setfacl -m u:wwwrun:rwx $HOME/public_html/images > ls -ld $HOME/public_html/images drwxr-xr-x+ 2 логин students 4096 Май 12 23:32 /home/логин/public_html/images > getfacl $HOME/public_html/images getfacl: Removing leading '/' from absolute path names # file: home/логин/public_html/images # owner: логин # group: students user::rwx user:wwwrun:rwx group::r-x mask::rwx other::r-x
- В каталоге, доступном "извне", чтобы 1) не возникало иллюзии безопасности 2) не копировать лишний раз данные посредством PHP
- при загрузке имя файлу присваивается системой (N.jpg)
- самое простое - использовать id изображения для имени файла
Страницы
Первая страница (С1):
- форма для ввода логина-пароля
- переход на С2
Вторая страница (С2):
- просмотр изображений
- форма для upload и переход на С3
- возможность выбрать изображение для удаления и переход на С4
Третья страница (С3):
- показ загруженного изображения
- форма для добавления подписи
- переход на С2
Четвертая страница (С4):
- показ удаляемого изображения с подписью
- вопрос "действительно удалить ?"
- переход на С2
Все страницы (кроме, возможно, первой) - шаблон на Smarty
Функции
Ф1: на каждой странице (кроме первой) в самом начале аутентификация, общая функция, подключать во все страницы с помощью require_once():
- проверка cookie
- проверка HTTP auth, при успехе выдача cookie
- Если нет ни корректных данных HTTP authentication, ни cookie, то переход на С1 для запроса логина-пароля
Ф2-Фn: Функции для работы с БД (добавить, удалить, получить) тоже можно сделать отдельным файлом и подключать requre_once()
Smarty
Простая иллюстрация MVC:
- C2: PHP создает список "url, подпись", шаблон получает этот список и самостоятельно расставляет <img src="url"/> и подписи по странице (как нарисует дизайнер)
- C3: PHP передает url изображения, шаблон рисует страницу и форму для caption
- С4: PHP передает url изображения и caption, шаблон рисует страницу и форму для "действительно удалять?"
При необходимости можно передавать Smarty дополнительные параметры (id изображений, url для action в формах и т.п.)
Например, для C4:
<?php require_once("config.inc.php"); require_once("db.inc.php"); require_once("auth.inc.php"); require_once("Smarty.class.php"); db_connect(); auth_check(); ... $id = ### Получить id удаляемого изображения из $_GET ###; $src = ### Сформировать url для img по id ###; $action = ### Сформировать action url по id ###; $caption = ### Получить caption из БД по id ###; ... db_disconnect(); $smarty = new Smarty; $smarty->assign("id", $id); $smarty->assign("src", $src); $smarty->assign("action", $action); $smarty->assign("caption", $caption); $smarty->display("delete.tpl"); ?>