Главная страница статей --> Хитрости при программировании php, заметки по базам данных

Гостевая книга шаг за шагом

Источник: realcoding.net

В этой статье мы научимся создавать гостевую книгу на PHP. И хотя эта статья написана для новичков, но Вы должны обладать хотя бы азами программирования на PHP.

Итак, для начала давайте определимся, что мы будем писать. В итоге мы должны получить гостевую книгу со следующими свойствами:

* Посетитель обязательно должен ввести своё имя и сообщение, и по желанию свой e-mail и адрес домашней странички.
* Разбиение на страницы.
* Наша гостевая книга должна работать с register_globals = Off.
* Все записи хранятся в обычном текстовом файле (т.е. нам не потребуется база данных).
* Гостевая книга состоит из одного файла.

Примечание. Всё нижеследующее было протестировано на PHP 4.3.0.

С задачами вроде определились, теперь давайте разберёмся как у нас всё будет выгдядеть. Форма и записи будут выводится на одной странице. Наш файл будет называться gb.php. Напишем код формы. У меня получилось вот что:

<form action=gb.php method=post>
<
table width=500 cellpadding=2
cellspacing=0 style=border: 1px solid rgb(0, 75, 151); bgcolor=#d7ecff>
<
tbody><tr>
<
td align=right>
*
Имя:
</
td>
<
td align=left>
<
input type=text name=msg_from maxlength=40 size=30>
</
td>
</
tr>
<
tr>
<
td align=right>
E-Mail:
</
td>
<
td align=left>
<
input type=text name=msg_mail maxlength=40 size=30>
</
td>
</
tr>
<
tr>
<
td align=right>
**
URL:
</
td>
<
td align=left>
<
input type=text name=msg_url maxlength=40 size=30>
</
td>
</
tr>
<
tr>
<
td align=right>
*
Сообщение:
</
td>
<
td align=left>
<
textarea cols=45 rows=7 name=msg_message></textarea>
</
td>
</
tr>
<
tr>
<
td align=center colspan=2>
<
input type=submit name=msg_submit value=Добавить>
<
input type=reset>
</
td>
</
tr>
<
tr>
<
td align=center colspan=2>
*
Поля обязательные для заполнения<br>
**
url вводить без http://
</td>
</
tr>
</
tbody></table>
</
form>

Теперь разберёмся с основными настройками нашей гостевой книги:

//---------- Настройки GB ----------//
$file_gb = c:/HTTP/CoderPRO/site/gb.dat; // файл где хранятся записи GB
$max_rec = 128; // максимальное количество записей в файле
$rec_page = 6; // количество записей выводимых на одной странице
//----------------------------------//

Напишем код заголовка нашей страницы:

<html><head>
<
title>..:: Гостевая книга ::..</title>
<
meta http-equiv=Pragma content=no-cache>
<
meta http-equiv=expires content=0>
</
head>
<
body>
<
div align=center><h1>Гостевая книга</h1></div>

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

Теперь приступим собственно к программированию. Для начала напишем функцию проверки введённых данных:

// Проверка введённых данных //
function test() {
global
$HTTP_POST_VARS;

if (!isset(
$HTTP_POST_VARS[msg_from], $HTTP_POST_VARS[msg_mail],
$HTTP_POST_VARS[msg_url], $HTTP_POST_VARS[msg_message])) {
echo
<p align=center>Ошибка при передачи параметров к скрипту!
Обратитесь к администратору сайта.</p>n
;
return(
false);
}
if (
trim($HTTP_POST_VARS[msg_from])==) {
echo
<p align=center>Вы не ввели своё имя. Повторите ввод.</p>n;
return(
false);
}
if (
trim($HTTP_POST_VARS[msg_message])==) {
echo
<p align=center>Вы не ввели сообщение. Повторите ввод.</p>n;
return(
false);
}
return(
true);
}
// test()

$HTTP_POST_VARS - это массив содержащий все ключи и значения переданные методом POST (работает при register_globals = Off). Сначала в функции проверяется всё ли было передано, а затем были ли заполнены обязательные поля Имя и Сообщение. Конечно, можно ещё сделать проверку на корректность введённого e-mail и url и много чего ещё, но это уже если вам хочется, то делайте сами, а мы не будем на этом заморачиваться и пойдём дальше.

Рассмотрим как у нас будут хранится записи в файле. В одной строке файла - одна запись в следующем формате:

ИмяE-MailURLДата и время добавленияСообщение

Перед добавлением записи мы должны немного подредактировать данные. Как можно заметить, для разделения частей записи мы используем знак , значит наши данные не должны содержать этот знак - мы заменим его на аналог в html-коде: &brvbar;. Далее мы должны проверить длину сообщения, и если она больше некоторой величины (например более 1000 символов), то обрезать сообщение до нужной длины. Затем конвертируем все специальные символы в мнемоники HTML (функция htmlspecialchars). И наконец, заменим все переносы строк в сообщении на <br> и отформатируем данные в нужном нам формате для записи в файл. Конечно и здесь можно сделать ещё кучу всяких прибамбасов, но это мы оставим для самостоятельный работы и будем делать нашу гостевуху дальше. Итак строку для записи в файл мы сформировали и теперь её надо добавить в файл, при этом не привысив лимит количества записей в файле (вспомните настройки нашей страницы: $max_rec = 128;). Что-то я много пишу,а кода не видно: Вот вам наша функция добавления записи в файл:

// Функция добавления записи //
function add() {
global
$max_rec;
global
$file_gb;
global
$HTTP_POST_VARS;

$recs = @file($file_gb) or $recs = array();

$from = $HTTP_POST_VARS[msg_from];
$mail = $HTTP_POST_VARS[msg_mail];
$url = $HTTP_POST_VARS[msg_url];
$message = $HTTP_POST_VARS[msg_message];

$from = str_replace (, &brvbar;, $from);
$mail = str_replace (,&brvbar;,$mail);
$url = str_replace (,&brvbar;,$url);
if (
strlen($message)>1000) $message=substr($message,0,1000);
$message = htmlspecialchars($message, ENT_QUOTES);
$message = str_replace(,&brvbar;,$message);
$message = trim($message);
$message = ereg_replace (
, <br>, $message);

array_unshift ($recs,$from$mail$url.date(d M Y, H:i).$messagen);
if (
count($recs)>$max_rec) $recs=array_slice($recs,0,$max_rec);
$count = count($recs);
$f = fopen ($file_gb, w);
for (
$i=0; $i<$count; $i++) {
fwrite($f,$recs[$i]);
}
fclose($f);
}
// add()

$recs - это массив с записями. Если файл $file_gb существует, то с помощью функции file() мы присваиваем каждую строчку файла одному элементу массива, в противном же случае $recs - пустой массив. Далее идёт редактирование данных описанных выше. Затем с помощью функции array_unshift() добавляем в начало записей нашу запись. Далее следует проверка на количество записей, и если количество больше нужного, то с помощью функции array_slice() мы выделяем первые элементы в нужном нам количестве. Ну и, наконец, записываем наши записи в файл.

Итак, функции для добавления записей мы сделали, теперь нужно сделать функцию для постраничного вывода данных на экран. В принципе в выводе данных ничего сложного нет, считали запись - вывели в соответствии с дизайном и всё, но ведь мы хотим сделать вывод постраничным - вот в этом как раз и может возникнуть сложность. Итак приступим: Сначала я приведу код функции view(), а потом мы его разберём.

// Функция вывода записей //
function view() {
global
$file_gb;
global
$HTTP_GET_VARS;
global
$rec_page;

if (
file_exists($file_gb)) {
$messages = file($file_gb);
$count = count($messages);
if (
$count>$rec_page) {
nav_page(ceil($count/$rec_page), (isset($HTTP_GET_VARS[page]) ?
$HTTP_GET_VARS[page]: 1),gb.php?page=);
echo
<br>;
}
$num_page=1;
if (isset(
$HTTP_GET_VARS[page])) {
if ((
$HTTP_GET_VARS[page]>0) and
(
$HTTP_GET_VARS[page]<=ceil($count/$rec_page)))
$num_page=$HTTP_GET_VARS[page];
}
for (
$i=($num_page-1)*$rec_page; $i<=(($num_page*$rec_page<$count) ?
$num_page*$rec_page-1: $count-1); $i++) {
$tmp = explode(,$messages[$i]);
echo
<table class=text_info border=0 width=100%>n;
echo
<tr class=sel_p>n;
echo
<td>n;
echo
<b>От:</b><br>;
if (
$tmp[2]<>) echo <b>URL:</b><br>;
echo
<b>Дата:</b>n;
echo
</td>n;
echo
<td class=text_info_sel width=100%>n;
echo
$tmp[0];
if (
$tmp[1]<>) { echo <a href=mailto:.$tmp[1].>.$tmp[1].</a>; }
echo
<br>;
if (
$tmp[2]<>) echo <a href=http://.$tmp[2].>.$tmp[2].</a><br>;
echo $tmp[3].n;
echo
</td>n</tr>n;
echo
<td colspan=2><br>n;
echo
$tmp[4];
echo
</td>n</tr>n</table>n;
echo
<br>;
}
// for
if ($count>$rec_page) { nav_page(ceil($count/$rec_page),
(isset(
$HTTP_GET_VARS[page]) ? $HTTP_GET_VARS[page]: 1),gb.php?page=); }
echo
<br>;
} else {
echo
<center>Записей нет. Вы можете быть первым ;)</center><br>n;
}
}
// view()

Глобальные переменные: $file_gb - файл с записями, $rec_page - количество записей выводимых на одну страницу - эти переменные мы определили в самом начале в настройках нашей гостевой книги. А вот $HTTP_GET_VARS - это массив содержащий все ключи и значения переданные методом GET, т.е. через URL (работает при register_globals = Off) - это нам понадобится, т.к. номер страницы мы будем передавать как раз через URL. Разберёмся, что же делает наша функция. Сначала выполняется проверка - есть ли файл с записями - и если есть, то выполняется работа по выводу записей, а если нет файла, то выводится сообщение, что записей нет. Итак, если всё нормально и у нас есть файл с записями, то с помощью функции file() мы создаём массив строк файла $messages, а переменной $count присваиваем кол-во элементов полученного массива, т.е. количества записей. Далее идёт выполняется вывод навигации страниц и сами записи в соответствии с нужной страницей. В частности мы используем функцию nav_page, я приведу лишь её код.

// Функция вывода навигации по страницам //
function nav_page(
$count, // Общее кол-во страниц
$num_page, // Номер текущей страницы
$url // Какой URL для ссылки на страницу
// (к нему добавляется номер страницы)
) {

$page_nav = 3; // сколько страниц выводить одновременно

$begin_loop=1; // начальное значение в цикле
$end_loop=$count; // конечное значение в цикле
echo <div align=center>[ Страницы ($count):;
// Проверка на корректность номера текущей страницы
if ($num_page>$count or $num_page<1) $num_page=1;

// Далее в функции идёт сам вывод навигации, получено здесь всё опытным путём
if ($num_page>$page_nav) {
echo
<a href=$url.($page_nav*(floor($num_page/$page_nav)-
($num_page%$page_nav==0 ? 1: 0))).>(
.($page_nav*(floor($num_page/$page_nav)-
1-($num_page%$page_nav==0 ? 1: 0))+1).-.($page_nav*(floor($num_page/$page_nav)-
(
$num_page%$page_nav==0 ? 1: 0))).)</a> ...;
$begin_loop=$page_nav*(floor($num_page/$page_nav)-($num_page%$page_nav==0 ? 1: 0))+1;
}
if (
$count>$page_nav*(floor($num_page/$page_nav)-($num_page%$page_nav==0 ? 1: 0)+1)) {
$end_loop=$page_nav*ceil($num_page/$page_nav);
}
for (
$i = $begin_loop; $i <= $end_loop; $i++) {
if (
$i==$num_page) echo &nbsp; <b>$i</b>;
else echo
&nbsp; <a href=$url$i>$i</a>;
}
// for
if ($count>$page_nav*(floor($num_page/$page_nav)-($num_page%$page_nav==0 ? 1: 0)+1)) {
echo
&nbsp;&nbsp;... <a href=$url.($page_nav*ceil($num_page/$page_nav) + 1).
>(
.($page_nav*ceil($num_page/$page_nav) + 1);
if (
$page_nav*ceil($num_page/$page_nav)+1<$count) {
echo
-.($count<=$page_nav*(ceil($num_page/$page_nav)+1) ?
$count: $page_nav*(ceil($num_page/$page_nav)+1));
}
echo
)</a>;
}
echo
&nbsp;&nbsp;]</div>n;
}
// nav_page()

Описывать я этот кусок не буду, вы можете прочитать об этом в моей статье постраничный вывод, где всё это подробно описано. Здесь я опишу только то, как мы выводим записи. Мы имеем цикл, в котором начальное и конечное значение $i - изменяется в зависимости от страницы, которую мы хотим отобразить. В цикле мы из элемента массива $messages[$i] создаём массив $tmp с помощью функции explode, которая разбивает строку на строки по границам образованными сепаратором . Т.е. мы получаем массив в котором 0-й элемент - Имя, 1-й - e-mail, 2-й - url, 3-й - дата и время добавления, 4-й - само сообщение. Ну а дальше мы выводим нашу запись так как хотим.

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

if (isset($HTTP_POST_VARS[msg_submit])) { if (test()) add(); }
view();

Думаю ничего сложного в нём нет и вы сами разберётесь что куда :)

Всё! Мы написали всё, что нужно! Теперь соберите всё в кучу и получите полноценную гостевую книгу. Собирать в следующем порядке: 1)Заголовок файла, 2) Настройки GB, 3) Функции, 4) Нашу последнюю написанную строчку, 5) Форму для добавления, 6) колонтитул.

Кому лень всё собирать - можете скачать уже готовый. См. файл gb.zip.

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



Похожие статьи:
- Загрузка файла на PERL
- Первая домашняя страничка — это легко!
- Кодировки web-документов
- Язык веб-статистики
- Как слать письма PHP аттачами
- Гостевая книга на PHP/MySQL
- Эффективное расположение текста и графики на сайте
- Как защитить сайт от тотального скачивания.
- Простая баннерная система phpFBS
- Работа с текстовыми и графическими данными совместно в PHP и MySQL
- Правильность при построении ресурса!
- Межпроцессовые взаимодействия
- Взаимодействие нескольких форм


Оглавление | Обсудить на форуме | Главная страница сайта | Карта сайта |

Контакты
Редакция:
[0.002]