учебный пЛан№ брошюрыЛекция1
Лекция 1. “Пролетая над миром web-программирования”. Границы возможностей статического HTML. Два мира, две системы: программирование на стороне клиента и программирование на стороне сервера. Идем от реальности: текущие предложения хостинг-провайдеров. Инструментарий: пакет Denwer, установка. Первая программа на PHP “Здравствуй, мир web- программирования”.
1
Лекция 2. Пример задачи автоматизации: доска объявлений школьного сайта. SSI, основные возможности и директивы.
SSI-версия школьной доски объявлений. PHP-версия доски объявлений. Совершенству нет предела:
выводим все объявления из каталога, помечаем важные. Передача параметров в программы на PHP. Обзор синтаксиса PHP: типы данных, операции, основные алгоритмические конструкции.
1
Лекция 3. Обработка форм на стороне сервера. Формы и элементы управления HTML: однострочное и многострочное поля ввода, флажки, радиокнопки, списки. Методы GET и POST, кодирование URL. Обзор синтаксиса PHP: функции, массивы.
1
Лекция 4. "Позвольте, товарищи, у меня все записано!"Усовершенствованная доска объявлений с разделом администратора.
Обзор синтаксиса PHP: файлы. Законченный мини-проект: административный интерфейс для доски объявлений на файловом
“движке”.
контрольная работа № 1. Разработка теста с обработкой результатов тестирования на стороне сервера.
2
Лекция 5. PHP + MySQL. Введение в использование баз данных в задачах web-программирования. Зачем нужна СУБД? Теория реляционных баз данных: основные термины. SELECT — “главная команда” SQL. Что такое MySQL? Взаимодействие с сервером
MySQL из программ на PHP.
2
Лекция 6. Свои журналы ближе к т
/ делу.
База данных “Страница школьного журнала”: от проектирования до визуализации.
Практическое применение базы данных для автоматизации школьного сайта и школьной жизни.
контрольная работа № 2. Доработка базы данных “Страница школьного журнала”.
2
Лекция 7. Соображаем“на троих”. Задействуем трех основных “игроков”: MySQL+PHP+Javascript. Проверка данных форм на стороне клиента перед отправкой на сервер.
2
Лекция 8. “Живописцы, окуните ваши кисти...” Рисование средствами PHP. Генерирование графических данных “на лету”.
Построение графиков и диаграмм. Графическая визуализация данных школьного журнала.
итоговая работа.Лекция “Позвольте, товарищи, у меня все ходы записаны!”И снова здравствуйте, уважаемые коллеги!
Основной технической темой четвертой лекции нашего курса станет обработка файлов на PHP. Хотя в настоящее вре- мя работать с файлами напрямую приходится не слишком часто — для хранения и обработки данных преимущественно используются СУБД, иметь представление об основных функциях для манипуляций с файлами полезно. Начнем с того, что рассмотрим классическую задачу web-программирования — организацию гостевой книги на сайте.
Мини-проект “Гостевая книга”Этот проект мы разместим в каталоге
/home/guestbook/www. Если Denwer у вас уже запущен, пожалуйста, останови- те его и создайте требуемый каталог. В этот каталог поместите два файла —
guestbook.php и
guestbook.txt. В первом файле будет находиться скрипт гостевой книги, во втором — содержимое книги — записи, оставленные пользователями.
Второй файл
guestbook.txt в начальный момент времени надо будет только создать и оставить пустым. А скрипт
guestbook.php должен быть таким:
$f=fopen("guestbook.txt","a");
fwrite($f,"
".date("j.m.Y в H:i").
" $author написал
:\n
$message\n\n");
fclose($f);
}
?>
Лекция Гостевая книга
"ПОзвОЛьте, тОварищи, у меня вСе хОды заПиСаны!"Форма и обработчик совмещены в одном файлеНа самом деле именно так обычно и делают. Все примеры предыдущей лекции, в которых формы и обработчики были размещены в разных файлах, были написаны таким образом исключительно из соображений наглядности. На практике форму и скрипт обработчика чаще всего размещают в одном файле, как и сделано в этом примере. Логика работы скрип- та-обработчика в этом случае следующая: он проверяет, переданы ли ему параметры из формы. Если переданы — необхо- димо выполнить обработку и
затем вывести форму. Если параметров нет — просто вывести форму.
Как проверить, переданы ли параметры? Тут есть несколько вариантов. Я применил способ, который мне кажется наиболее наглядным, — с использованием функции isset
, рассмотренной в прошлой лекции. Работает это так. В форме имеются три элемента управления — однострочное текстовое поле ввода, многострочное текстовое поле ввода и кнопка отправки данных с именами author
, message и send соответственно. Можно проверить любую из этих переменных и, если переменная определена, считать, что скрипт вызван из формы (я проверил переменную send
).
Основные файловые операцииЕсли скрипт
guestbook.php обнаруживает, что переменная
$send определена, он дописывает в файл
guestbook.txt оче- редное сообщение. При этом используется ряд файловых функций. Эти функции кратко рассмотрены в следующей таб- лице (в ней также упомянуты некоторые другие функции, которые могут нам понадобиться в дальнейшем, а также функции, которые уже встречались ранее в примерах).
ФункцияПример использованияПоясненияfopen
$f=fopen("guestbook.txt","a")
Функция fopen открывает файл для дальнейшей работы с ним. Пер- вый параметр — имя файла (возможно, с путем до него). Второй па- раметр — способ доступа к файлу. Имеются три основных значения третьего параметра:
“r” — открыть файл для чтения (
read);
“w” — открыть файл для записи (
write);
“a” — открыть файл для дозаписи (
append).
Для чтения
можно открыть только существующий файл, в противном случае возникнет ошибка.
Если открыть существующий файл для записи, то его прежнее содер- жимое будет утеряно, запись начнется с начала файла.
Результатом функции fopen является файловая переменная, которую в дальнейшем можно использовать в файловых функциях fclose fclose($f)
Функция fclose закрывает открытый ранее файл. Особенно важно не забывать закрывать файлы, открытые для записи, в противном случае часть информации, “записанной” в файл, может быть утеряна.
Дело в том, что для работы с каждым файлом в оперативной памяти создается некий буфер. И данные сначала записываются именно в бу- фер и лишь по мере его заполнения — в файл. Если не закрыть файл, то часть информации, содержащаяся в буфере, пропадет fwrite fwrite($f,
строка")
Функция fwrite
записывает строку в файл, открытый для записи или дозаписи. Другое название этой функции — fputs fgets
$s=fgets($f)
Функция fgets служит для чтения строки из файла, открытого для чтения file_exists file_exists(
имя файла")
Функция file_exists служит для проверки существования файла. Ее полезно использовать, например, перед открытием файла для чтения unlink unlink(
имя файла")
Функция unlink используется для удаления файла rename rename(
старое имя файла,
новое имя файла)
Функция rename используется для переименования файла
Более подробную информацию об этих и других файловых функциях можно найти в документации по PHP, напри- мер, на странице
http://ru2.php.net/manual/ru/ref.filesystem.php.
Паранойя — профессиональная болезнь web-программистовЭто, конечно, шутка. Хотя… как посмотреть. Хороший web-программист в определенном смысле практически обязан быть параноиком, иначе его сайты долго не проживут. В частности, я хочу категорически предостеречь вас от того, чтобы уже сейчас начать размещать наши примеры, подобные приведенной гостевой книге, в настоящем Интернете. Для взло-
Лекция ма подобных скриптов профессионалу потребуются секунды. Не верите? Давай- те покажу .
В Denwer’е имеется слабая защита от некоторых видов взломов, которая ни на
секунду не остановила бы меня как взломщика, но для противодействия ей мне потребовалось бы сделать примеры взломов чуть менее наглядными. Пос- кольку в данном случае моим приорите- том является именно наглядность (я ведь не читаю курс о технологиях взлома сай- тов), давайте отключим эту “защиту”. Для этого, пожалуйста, сделайте следующее:
1. Остановите Denwer.
2. Найдите файл
/usr/local/php5/php.ini (мы уже модифицировали этот файл ранее).
3. В строке 431 замените значение magic_quotes_gpc c
On на
Off
4. Запустите Denwer.
Все готово. Ломаем!
Сначала бережно… Просто похули- ганим. Добавьте в гостевую книгу сооб- щение, показанное на
рис. 2
a. Результат этого “доброго” взлома показан на
рис.
2
б. В данном случае “добрый хакер” не сделал ничего страшного, он просто не- сколько подпортил внешний вид страни- цы, поскольку вставил на страницу код на Javascript. Бывает хуже .
Рис. 2
бА теперь взломаем по-настоящему. Жестко! Способ этого взлома и результат показаны на
рис. 3
а и 3
б. Вам кажется, что на
рис. 3
б не показано ничего страшного? Вы жестоко ошибаетесь. Посмотрите-ка на содержимое файла
guestbook.Рис. 2
a
"ПОзвОЛьте, тОварищи, у меня вСе хОды заПиСаны!"
txt. То-то!
Администрирование школьной
доски объявлений
Вернемся к школьной доске объявлений, которой мы занимались в лекции 2. Понят- но, что между гостевой книгой и доской объявлений нет принципиальной разницы, и форму гостевой книги можно приспосо- бить для администрирования объявлений.
Напомню, что в лекции 2 мы значи- тельно автоматизировали работу с объ- явлениями на школьном сайте, но для того, чтобы секретарь (например) мог самостоятельно манипулировать объяв- лениями, он должен был иметь доступ к соответствующему каталогу (каталогу
notices). Это не только неудобно, но и не- безопасно. Проще (для пользователя, ра- зумеется!) предоставить секретарю удоб- ный web-интерфейс, в котором он мог бы выполнять все необходимые операции с объявлениями — вводить новые, менять важность объявления и т.п. Пример та- кого web-интерфейса показан на рис. 4 на с. 7.
Рис. 3б
Рис. 3a
Лекция Рис. 4
По сравнению с возможностями, рассмотренными в лекции 2, в этом интерфейсе предусмотрена возможность “прятать” объявле- ния. Потребность временно спрятать объявление, не
удаляя его на- совсем, возникает довольно часто.
Технология ввода нового объявления посредством данного ин- терфейса следующая: надо, используя соответствующую ссылку, создать новое объявление-пустышку, которое будет создано забло- кированным. Затем можно его отредактировать и, при необходи- мости, разблокировать. Страница редактирования объявления по- казана на
рис. 5.
Разумеется, код этого примера уже достаточно велик и печатать его не имеет смысла. Полный комплект соответствующих файлов можно взять на странице нашего курса на сайте Педуниверситета
http://edu.1september.ru в разделе “Учебные материалы” (эти материалы на- ходятся в открытом доступе, и с ними могут познакомиться не только слушатели курса, но и все читатели газеты). В файлах я подробно прокомментировал код всех примеров.
Передача данных форм методами GET и POSTВозможно, вы обратили внимание на то, что в примере гостевой книги в теге форм был указан дополнительный параметр method="post".
Если его не указать, то ничего страшного не произойдет, примеры будут работать. Различие же проявляется лишь в способе передачи параметров. При использовании метода POST строка URL выглядит “пустой” (убедитесь!). Парамет- ры передаются серверу, но как — ни мы, ни пользователь не видят.
Если же использовать метод GET — для этого надо указать method="post"
или вовсе опустить параметр method
— метод
GET будет использоваться по умолчанию, мы
увидим параметры, явно указанные в URL (см.
рис. 6).
Рис. 6
Русские буквы и специальные символы в строке URL кодируются шестнадцатеричными кодами. Если ввести сообщение английскими буквами, оно будет передано “AS IS”(“как есть”) (
рис. 7).
Рис. 7
Внутренние механизмы передачи параметров методами GET и POST, разумеется, существенно различаются (и, в об- щем случае, GET и POST не являются взаимозаменяемыми), но в объеме нашего курса можно считать, что различие между этими методами носит визуальный характер и не влияет на функциональность.
Рис. 5