Главная страница «Первого сентября»Главная страница журнала «Информатика»Содержание №20/2008


Педагогический университет

Основы web-программирования для школьного "сайтостроительства". Лекция 4.

"Позвольте, товарищи, у меня все ходы записаны!"

И снова здравствуйте, уважаемые коллеги!

Основной технической темой четвертой лекции нашего курса станет обработка файлов на PHP. Хотя в настоящее время работать с файлами напрямую приходится не слишком часто — для хранения и обработки данных преимущественно используются СУБД, иметь представление об основных функциях для манипуляций с файлами полезно. Начнем с того, что рассмотрим классическую задачу web-программирования — организацию гостевой книги на сайте.

Учебный план

№ газеты

ЛЕКЦИЯ

17/2008

Лекция 1. “Пролетая над миром web-программирования”. Границы возможностей статического HTML. Два мира, две системы: программирование на стороне клиента и программирование на стороне сервера. Идем от реальности: текущие предложения хостинг-провайдеров. Инструментарий: пакет Denwer, установка. Первая программа на PHP “Здравствуй, мир web-программирования”.

18/2008

Лекция 2. Пример задачи автоматизации: доска объявлений школьного сайта. SSI, основные возможности и директивы. SSI-версия школьной доски объявлений. PHP-версия доски объявлений. Совершенству нет предела: выводим все объявления из каталога, помечаем важные. Передача параметров в программы на PHP. Обзор синтаксиса PHP: типы данных, операции, основные алгоритмические конструкции.

19/2008

Лекция 3. Обработка форм на стороне сервера. Формы и элементы управления HTML: однострочное и многострочное поля ввода, флажки, радиокнопки, списки. Методы GET и POST, кодирование URL. Обзор синтаксиса PHP: функции, массивы.

20/2008

Лекция 4. Усовершенствованная доска объявлений с разделом администратора. Обзор синтаксиса PHP: файлы. Законченный мини-проект: административный интерфейс для доски объявлений на файловом “движке”.

Контрольная работа № 1. Разработка теста с обработкой результатов тестирования на стороне сервера.

21/2008

Лекция 5. Введение в использование баз данных в задачах web-программирования. Зачем нужна СУБД? Теория реляционных баз данных: основные термины. SELECT — “главная команда” SQL. Что такое MySQL? Взаимодействие с сервером MySQL из программ на PHP.

22/2008

Лекция 6. База данных “Страница школьного журнала”: от проектирования до визуализации. Практическое применение базы данных для автоматизации школьного сайта и школьной жизни.

Контрольная работа № 2. Доработка базы данных “Страница школьного журнала”.

23/2008

Лекция 7. “На троих”. Задействуем трех основных “игроков”: MySQL+PHP+Javascript. Проверка данных форм на стороне клиента перед отправкой на сервер.

24/2008

Лекция 8. Рисование средствами PHP. Генерирование графических данных “на лету”. Построение графиков и диаграмм. Графическая визуализация данных школьного журнала.

Итоговая работа

Мини-проект “Гостевая книга”

Этот проект мы разместим в каталоге /home/guestbook/www. Если Denwer у вас уже запущен, пожалуйста, остановите его и создайте требуемый каталог. В этот каталог поместите два файла — guestbook.php и guestbook.txt. В первом файле будет находиться скрипт гостевой книги, во втором — содержимое книги — записи, оставленные пользователями. Второй файл guestbook.txt в начальный момент времени надо будет только создать и оставить пустым. А скрипт guestbook.php должен быть таким:

<?php

if (isset($send)) {

$f=fopen("guestbook.txt","a");

fwrite($f,"<p><code>".date("j.m.Y в H:i").

" <b>$author</b> написал</code>:\n<br>$message\n\n");

fclose($f);

}

?>

<html>

<head>

<meta http-equiv="content-type" content="text/html; charset=windows-1251">

<title>Гостевая книга</title>

</head>

<body>

<h1>Гостевая книга</h1>

<hr>

<form action="guestbook.php" method="post">

<p><input name="author" type="text" size="30"

value="Пожалуйста, представьтесь">

<p><textarea name="message" cols="60" rows="10">

Здесь вы можете оставить свое сообщение

</textarea>

<p><input name="send" type="submit" value="Отправить!">

</form>

<hr>

<?php include "guestbook.txt"; ?>

</body>

</html>

Если вы сделали все правильно, то гостевая книга должна сразу же заработать. Попробуйте: введите несколько записей. У вас должно получиться что-то похожее на рис. 1.

 

Рис. 1

После добавления нескольких записей в гостевую книгу посмотрите на файл guestbook.txt, чтобы убедиться в том, что именно в него записи и добавляются. Например, у меня этот файл имеет следующий вид:

<p><code>21.09.2008 в 13:00 <b>Сергей Островский</b> написал</code>:

<br>Первая запись в гостевой книге

<p><code>21.09.2008 в 13:01 <b>Вася</b> написал</code>:

<br>Здесь был Вася

Разберем скрипт гостевой книги. Прежде всего удивление может вызывать то, что этот скрипт один. То есть в данном случае…

Форма и обработчик совмещены в одном файле

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

Как проверить, переданы ли параметры? Тут есть несколько вариантов. Я применил способ, который мне кажется наиболее наглядным, — с использованием функции 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.

Все готово. Ломаем!

Сначала бережно… Просто похулиганим. Добавьте в гостевую книгу сообщение, показанное на рис. 2a. Результат этого “доброго” взлома показан на рис. 2б. В данном случае “добрый хакер” не сделал ничего страшного, он просто несколько подпортил внешний вид страницы, поскольку вставил на страницу код на Javascript. Бывает хуже :).

Рис. 2a

Рис. 2б

А теперь взломаем по-настоящему. Жестко! Способ этого взлома и результат показаны на рис. 3а и 3б. Вам кажется, что на рис. 3б не показано ничего страшного? Вы жестоко ошибаетесь. Посмотрите-ка на содержимое файла guestbook.txt. То-то!

Рис. 3a

Рис. 3б

Администрирование школьной доски объявлений

Вернемся к школьной доске объявлений, которой мы занимались в лекции 2. Понятно, что между гостевой книгой и доской объявлений нет принципиальной разницы, и форму гостевой книги можно приспособить для администрирования объявлений.

Напомню, что в лекции 2 мы значительно автоматизировали работу с объявлениями на школьном сайте, но для того, чтобы секретарь (например) мог самостоятельно манипулировать объявлениями, он должен был иметь доступ к соответствующему каталогу (каталогу notices). Это не только неудобно, но и небезопасно. Проще (для пользователя, разумеется!) предоставить секретарю удобный web-интерфейс, в котором он мог бы выполнять все необходимые операции с объявлениями — вводить новые, менять важность объявления и т.п. Пример такого web-интерфейса показан на рис. 4.

Рис. 4

Рис. 5

По сравнению с возможностями, рассмотренными в лекции 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 не являются взаимозаменяемыми), но в объеме нашего курса можно считать, что различие между этими методами носит визуальный характер и не влияет на функциональность.

Се. Ль. Островский

TopList