Гостевая книга шаг за шагом
В этой статье мы научимся создавать гостевую книгу на 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-Mail|URL|Дата и время добавления|Сообщение
Перед добавлением записи мы должны немного подредактировать данные. Как можно заметить, для разделения частей записи мы используем знак |, значит наши данные не должны содержать этот знак - мы заменим его на аналог в html-коде: ¦
. Далее мы должны проверить длину сообщения, и если она больше некоторой величины (например более 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 ("|", "¦", $from); $mail = str_replace ("|","¦",$mail); $url = str_replace ("|","¦",$url); if (strlen($message)>1000) $message=substr($message,0,1000); $message = htmlspecialchars($message, ENT_QUOTES); $message = str_replace("|","¦",$message); $message = trim($message); $message = ereg_replace (" ", "<br>", $message); 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();Думаю ничего сложного в нём нет и вы сами разберётесь что куда :)
Всё! Мы написали всё, что нужно! Теперь соберите всё в кучу и получите полноценную гостевую книгу. Собирать в следующем порядке: 1)Заголовок файла, 2) Настройки GB, 3) Функции, 4) Нашу последнюю написанную строчку, 5) Форму для добавления, 6) колонтитул.
Кому лень всё собирать - можете скачать уже готовый. См. файл gb.zip.
Подведём итоги: Мы написали полноценную гостевую книгу и выполнили все задачи, которые поставили перед собой. Конечно можно сделать ещё кучу всяких фишек, написать администрирование гостевой книги и многое другое, но это уже тема другой статьи. В общем, надеюсь статья была вам полезна. Если что-то было не понятно, то милости прошу: пишите на мыло - обязательно отвечу.
Оставить комментарий
Комментарии
<a href="https://www.webthemes360.com/best-free-wordpress-themes-2019/">responsive WordPress themes</a>
<a href="https://www.offixfurniture.com/office-furniture-in-pakistan/">office furniture</a>
<a href="https://www.xamictech.com">xamictech</a>
в конец функции записи в файл add() нужно добавить функцию обновления страницы на JS:
echo "<script language='Javascript'><!--
function reload() {location = \"index.php\"}; setTimeout('reload()', 0);
--></script>";
и всё будет в порядке! :)
При таком написании скрипта , для того , чтобы после каждого обновдения страницы не повторялась запись последних данных - можно ипользовать такую конструкцию
<?php
if (isset($_POST['send_message'])){
// тут идёт функция записи в файл, не буду её писать
// и теперь , в конце
header("Location:$PHP_SELF");
}
В таком случае , сразу после записи данных в файл все переменые анулируются и можно их повторить только если заново ввести в форму и нажать на $_POST['send_message'].
Надеюсь , это кому - то помогло...
При таком написании скрипта , для того , чтобы после каждого обновдения страницы не повторялась запись последних данных - можно ипользовать такую конструкцию
<?php
if (isset($_POST['send_message'])){
// тут идёт функция записи в файл, не буду её писать
// и теперь , в конце
header("Location:$PHP_SELF");
}
В таком случае , сразу после записи данных в файл все переменые анулируются и можно их повторить только если заново ввести в форму и нажать на $_POST['send_message'].
Надеюсь , это кому - то помогло...
И как с этим бороться?
Даже если гостевая простенькая - но всеравно на чем-то учиться нужно !!!!
а то все натыкают Мускля повсюду - а ведь нужно и без него обходиться (если нет например поддержки его на серваке...)
Короче - молодец. Спасибо!
ГК без ДБ - черепашье фуфло
Даже для тренинга не стоит пробовать