В этой статье мы научимся создавать гостевую книгу на PHP. И хотя эта статья
написана для новичков, но Вы должны обладать хотя бы азами программирования на
PHP.
Итак, для начала давайте определимся, что мы будем писать. В итоге мы должны
получить гостевую книгу со следующими свойствами:
Посетитель обязательно должен ввести своё имя и сообщение, и по желанию свой
e-mail и адрес домашней странички.
Разбиение на страницы.
Наша гостевая книга должна работать с register_globals = Off.
Все записи хранятся в обычном текстовом файле (т.е. нам не потребуется база
данных).
Гостевая книга состоит из одного файла.
Примечание. Всё нижеследующее было протестировано на PHP 4.3.0.
С задачами вроде определились, теперь давайте разберёмся как у нас всё будет
выгдядеть. Форма и записи будут выводится на одной странице. Наш файл будет
называться gb.php. Напишем код формы. У меня получилось вот что:
Теперь разберёмся с основными настройками нашей гостевой книги:
//---------- Настройки GB ----------//
$file_gb = "c:/HTTP/CoderPRO/site/gb.dat"; // файл где хранятся записи GB
$max_rec = 128; // максимальное количество записей в файле
$rec_page = 6; // количество записей выводимых на одной странице
//----------------------------------//
Строчки с 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-Mail|URL|Дата и время добавления|Сообщение
Перед добавлением записи мы должны немного подредактировать данные. Как можно
заметить, для разделения частей записи мы используем знак |, значит наши данные
не должны содержать этот знак - мы заменим его на аналог в html-коде: ¦.
Далее мы должны проверить длину сообщения, и если она больше некоторой величины
(например более 1000 символов), то обрезать сообщение до нужной длины. Затем
конвертируем все специальные символы в мнемоники HTML (функция
htmlspecialchars). И наконец, заменим все переносы строк в сообщении на <br> и
отформатируем данные в нужном нам формате для записи в файл. Конечно и здесь
можно сделать ещё кучу всяких прибамбасов, но это мы оставим для самостоятельный
работы и будем делать нашу гостевуху дальше. Итак строку для записи в файл мы
сформировали и теперь её надо добавить в файл, при этом не привысив лимит
количества записей в файле (вспомните настройки нашей страницы: $max_rec =
128;). Что-то я много пишу,а кода не видно: Вот вам наша функция добавления
записи в файл:
// Функция добавления записи //
function add() {
global $max_rec;
global $file_gb;
global $HTTP_POST_VARS;
array_unshift ($recs,"$from|$mail|$url|".date("d M Y, H:i")."|$message\n");
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 " <b>$i</b>";
else echo " <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 " ... <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 " ]</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();
Думаю ничего сложного в нём нет и вы сами разберётесь что куда :)
Опубликовал Kest
November 05 2008 21:41:40 ·
0 Комментариев ·
14006 Прочтений ·
• Не нашли ответ на свой вопрос? Тогда задайте вопрос в комментариях или на форуме! •
Комментарии
Нет комментариев.
Добавить комментарий
Рейтинги
Рейтинг доступен только для пользователей.
Пожалуйста, залогиньтесь или зарегистрируйтесь для голосования.
Нет данных для оценки.
Гость
Вы не зарегистрированны? Нажмите здесь для регистрации.