Лабораторные работы 12 – 15. Разработка гостевой книги

Цель работы

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

Гостевая книга с ограниченной функциональностью представляет собой хороший вариант для достижения такой цели.

Гостевая книга как форма обратной связи с пользователем

С целью сбор мнений, отзывов, предложений от посетителей сайта разработчик может организовать с пользователями обратную связь (feedback).

● Самая простая и стандартная форма такой связи – размещение на сайте электронного адреса для писем. Отзывы в таком случае доступны только владельцу адреса; другие пользователи с ними ознакомиться не могут.

Реализация этой схемы – указание ссылки-адреса на странице сайта.

● Далее по уровню организации общения и сложности следует гостевая книга (guestbook). Здесь оставляемые пользователями на специально выделенном пространстве страницы сообщения доступны другим пользователям. Таким образом можно ознакомиться с их мнениями.

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

НЕ нашли? Не то? Что вы ищете?

С точки зрения пользователя его отзыв «публикуется на сайте».

● Наиболее гибкая форма обратной связи – форум, позволяющий обмениваться мнениями.

С точки зрения реализации форум имеет ту же принципиальную структуру, что и гостевая книга, но более сложные алгоритмы обработки на сервере, поэтому мы остановимся на ней.

Ограничения, порождаемые рамками учебного процесса

Функциональность

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

w  создание сообщения;

w  просмотр всех сообщений гостевой книги.

Способ хранения сообщений

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

· База данных. Это наилучший вариант, т. к. предоставляет возможности описания структурированных данных, обеспечивает простоту внесения данных и разнообразные способы их выборки. Кроме того, средствами СУБД решаются вопросы совместного доступа к записям (когда доступ к одной и той же записи пытаются осуществить несколько пользователей).

В нашем случае недостаток этого варианта только один: нехватка соответствующих знаний и умений работы с СУБД.

· Файлы. То, что встроено в СУБД, здесь должно делаться программистом (выделение из текста сообщения смысловых единиц, доступ к отдельным сообщениям, решение вопросов совместного доступа). Например, вывод сообщений по принципу «последнее выводится первым» при последовательном чтении файла невозможен – файл читается от начала. Необходимо прибегнуть к уловкам. Однако средства программирования просты.

w  Можно создавать отдельный файл для каждого сообщения. Такая гостевая книга предлагается, например, по адресу http://www. softtime. ru/info/gbfile. php. Нет проблемы отделения текста одного сообщения от текста другого, но множество файлов надо создавать программным путем.

w  Можно хранить все сообщения в одном файле. Сообщение от сообщения надо будет в таком случае отделять заранее обусловленным набором символов. Файл можно создать заранее вне скрипта; остальные проблемы предыдущего варианта сохраняются.

Остановимся на последнем варианте как наиболее приемлемом в рамках курса и используем файл как более простое в реализации средство. На схему обработки данных программным путем на стороне сервера это не влияет.

Дизайн

Остановимся на простейшем дизайне, где присутствуют только необходимые элементы оформления. Чтобы не изобретать велосипед, воспользуемся реальным примером гостевой книги сайта http://www. gismeteo. ru/ (http://www. gismeteo. ru/guestbook. htm). Ограничимся элементами, выделенными красной рамкой, и сделаем нечто подобное.

Принципы разработки

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

Задача проектирования здесь очень упрощается тем, что приложение носит технический характер – не стоит вопрос о выделении классов пользователей, формулировании их требований и т. п.

Ключевые моменты программирования: обработка строк. Строка, конец строки

Работа со строками требует особой тщательности. Уже в языке Си, от которого ведут род сетевые языки программирования, немало неясных моментов и тонкостей. На них накладывается разнообразие модификаций конструкций Си в разных сетевых языках и особенности интерпретации строк в различных ОС. Поэтому при работе со строками, особенно при поиске ошибок, необходимо представлять структуру строки – как в принципе, так и в каждом конкретном случае.

Строка в программировании – это набор символов, завершающийся «концом строки». Вот этот «конец строки» и создает основные трудности. Так, он может быть по-разному закодирован (отображаемая в редакторе как строка последовательность может содержать в конце один или более невидимых символов) и по-разному создан (при наборе текста; вставкой соответствующего символа в последовательность; добавлением его операциями ввода-вывода и др). Разбираться в этом "вообще" – занятие бессмысленное и бесперспективное. Поэтому ниже приведены некоторые сведения, применимые к нашему приложению и программированию на PHP.

При нажатии клавиши Enter в процессе набора текста в последовательность символов вставляется двухбайтовый код 0D0A (в шестнадцатеричной системе) или, в десятичной кодировке, символы с номерами 13 и 10. Эта пара называется «возврат каретки – перевод строки». Краткое ее обозначение – CR/LF.

При анализе строк основную роль играет символ LF («перевод строки»). Включение этого символа программным путем в некоторую символьную последовательность приведет к тому, что при просмотре она будет представлена двумя строками: первая – до символа LF включительно, вторая – оставшаяся часть последовательности. Визуально это тот же эффект, что и при нажатии Enter.

По наличию символа LF операторы ввода-вывода, предназначенные специально для работы со строками, определяют, где кончается строка. Поэтому, чтобы пользоваться этими операторами, надо иметь уверенность в том, что символы перевода строки стоят в нужных местах.

Чтобы вставить символ перевода строки в некоторую последовательность, в языке PHP используется символьная константа (литерал) "\n", с которой можно обращаться как с обычным символом.

Далее это используется следующим образом.

В нашем случае строками должны быть имя и адрес. Получив эти значения из формы, удалим из них все пробелы, знаки табуляций и переводов строк, находящиеся в начале их или в конце, а затем дополним символом "\n". Это позволит считывать соответствующие значения из файла строковыми операторами. Из текста сообщения удалим символьные пробелы в начале и в конце.

Результаты этих действий представлены на рисунках.

Рис. Строки, полученные программным путем и при наборе текста

Рис. Содержимое файла в шестнадцатеричном коде