Навигация
Главная
Поиск
Форум
FAQ's
Ссылки
Карта сайта
Чат программистов

Статьи
-Delphi
-C/C++
-Turbo Pascal
-Assembler
-Java/JS
-PHP
-Perl
-DHTML
-Prolog
-GPSS
-Сайтостроительство
-CMS: PHP Fusion
-Инвестирование

Файлы
-Для программистов
-Компонеты для Delphi
-Исходники на Delphi
-Исходники на C/C++
-Книги по Delphi
-Книги по С/С++
-Книги по JAVA/JS
-Книги по Basic/VB/.NET
-Книги по PHP/MySQL
-Книги по Assembler
-PHP Fusion MOD'ы
-by Kest
Professional Download System
Реклама
Услуги

Автоматическое добавление статей на сайты на Wordpress, Joomla, DLE
Заказать продвижение сайта
Программа для рисования блок-схем
Инженерный калькулятор онлайн
Таблица сложения онлайн
Популярные статьи
OpenGL и Delphi... 65535
Форум на вашем ... 65535
21 ошибка прогр... 65535
HACK F.A.Q 65535
Бип из системно... 65535
Гостевая книга ... 65535
Invision Power ... 65535
Пример работы с... 65535
Содержание сайт... 65535
ТЕХНОЛОГИИ ДОСТ... 65535
Организация зап... 65535
Вызов хранимых ... 65535
Создание отчето... 65535
Имитационное мо... 65535
Программируемая... 65535
Эмулятор микроп... 65535
Подключение Mic... 65535
Создание потоко... 65535
Приложение «Про... 65535
Оператор выбора... 65535
Реклама
Сейчас на сайте
Гостей: 12
На сайте нет зарегистрированных пользователей

Пользователей: 13,363
новичок: xopumun11
Новости
Реклама
Выполняем курсовые и лабораторные по разным языкам программирования
Подробнее - курсовые и лабораторные на заказ
Delphi, Turbo Pascal, Assembler, C, C++, C#, Visual Basic, Java, GPSS, Prolog, 3D MAX, Компас 3D
Заказать программу для Windows Mobile, Symbian

Лабораторная работа по динамическим спискам на Turbo Pascal (перемещение...
Моделирование работы перекрёстка по регулированию движения на GPSS + Поя...
Моделирование вычислительного центра на GPSS + Отчет + Блок схема

Гостевая книга шаг за шагом
Автор: Предводителев Сергей
25 июля 2003 г.

В этой статье мы научимся создавать гостевую книгу на 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-коде: &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")."|$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 "&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();
Думаю ничего сложного в нём нет и вы сами разберётесь что куда :)
Опубликовал Kest November 05 2008 21:41:40 · 0 Комментариев · 13681 Прочтений · Для печати

• Не нашли ответ на свой вопрос? Тогда задайте вопрос в комментариях или на форуме! •


Комментарии
Нет комментариев.
Добавить комментарий
Имя:



smiley smiley smiley smiley smiley smiley smiley smiley smiley
Запретить смайлики в комментариях

Введите проверочный код:* =
Рейтинги
Рейтинг доступен только для пользователей.

Пожалуйста, залогиньтесь или зарегистрируйтесь для голосования.

Нет данных для оценки.
Гость
Имя

Пароль



Вы не зарегистрированны?
Нажмите здесь для регистрации.

Забыли пароль?
Запросите новый здесь.
Поделиться ссылкой
Фолловь меня в Твиттере! • Смотрите канал о путешествияхКак приготовить мидии в тайланде?
Загрузки
Новые загрузки
iChat v.7.0 Final...
iComm v.6.1 - выв...
Visual Studio 200...
CodeGear RAD Stud...
Шаблон для новост...

Случайные загрузки
Battle.Net - мони...
База данных фильм...
Длинный заголовок...
AboutSystem
Программирование ...
EditNew
Dynamic Titles дл...
AddPage [Исходник...
SMLPack v1.0
Динамические за...
JBlabel3D
Иллюстрированный ...
Swat [Исходник на...
Handles
Дарахвелидзе П., ...
Создание отчетов ...
WordReport
ATComponents
AdBlaster v2.5 - ...
Delphi7 Для профе...

Топ загрузок
Приложение Клие... 100774
Delphi 7 Enterp... 97831
Converter AMR<-... 20268
GPSS World Stud... 17014
Borland C++Buil... 14191
Borland Delphi ... 10290
Turbo Pascal fo... 7373
Калькулятор [Ис... 5983
Visual Studio 2... 5207
Microsoft SQL S... 3661
Случайные статьи
Резюме
STREAMS - очереди ...
Method Identifier ...
Очереди с приоритетом
Нас интересует мат...
Использование VLAN
TERMINATE (ЗАВЕРШИТЬ)
Разработка табличн...
Решение сложных за...
Обновление набора ...
Модуль WBFuncs для...
Также служба должн...
Требования голосов...
Ошибка EOLESYS..OP...
Ползунки Microsoft
Как вставить растр...
Как выбирают прото...
Игровые автоматы и...
Грузоперевозки Самара
Создание объекта D...
Как в выбранной яч...
Графические редакт...
Принудительное тун...
«Security Planning»
Тестирование, поис...
Статистика



Друзья сайта
Программы, игры


Полезно
В какую объединенную сеть входит классовая сеть? Суммирование маршрутов Занимают ли таблицы память маршрутизатора?