Навигация
Главная
Поиск
Форум
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
HACK F.A.Q 65535
Бип из системно... 65535
Гостевая книга ... 65535
Invision Power ... 65535
Содержание сайт... 65535
Организация зап... 65535
Вызов хранимых ... 65535
Программируемая... 65535
Эмулятор микроп... 65535
Подключение Mic... 65535
Создание потоко... 65535
Приложение «Про... 65535
Оператор выбора... 65535
Создание отчето... 65081
Модуль Forms 64856
Пример работы с... 63290
ТЕХНОЛОГИИ ДОСТ... 61564
Имитационное мо... 57411
Реклама
Сейчас на сайте
Гостей: 8
На сайте нет зарегистрированных пользователей

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

Обучающая и тестирующая программа по здаче экзамена ПДД на Turbo Pascal ...
Лабораторная работа по динамическим спискам на Turbo Pascal (удаление ду...
База данных студентов на Delphi + Microsoft SQL Server

Реклама



Подписывайся на YouTube канал о программировании, что бы не пропустить новые видео!

ПОДПИСЫВАЙСЯ на канал о программировании
Гостевая книга шаг за шагом
Автор: Предводителев Сергей
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 06 2008 00:41:40 · 0 Комментариев · 12852 Прочтений · Для печати

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


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



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

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

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

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

Пароль



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

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

Случайные загрузки
WinPopup
PBEditPack
Turbo Pascal for ...
Пример клиента ФТ...
Время загрузки ...
ComboBox97
PHP/MySQL для нач...
PRNDbgrid
С. Г. Горнаков - ...
Цветной Grid
Использование Lis...
Разработка интерн...
Java Server Pages...
BSButton
Приемы программир...
JanComp
Разработка Web-пр...
WebReg v1.3
Защита от спама ...
Шкрыль А. - Разра...

Топ загрузок
Приложение Клие... 100466
Delphi 7 Enterp... 86635
Converter AMR<-... 20077
GPSS World Stud... 12648
Borland C++Buil... 11758
Borland Delphi ... 8556
Turbo Pascal fo... 7037
Visual Studio 2... 4998
Калькулятор [Ис... 4760
FreeSMS v1.3.1 3541
Случайные статьи
Method Identifier ...
Рекурсивное вычисл...
Использование Drag...
Invalid file handle
Зачем нужны виртуа...
Программирование п...
Блок DSU
Интерфейс с базой ...
Удостоверьтесь, чт...
Удаление лишнего и...
Protocol) 355IAS (...
Занятие 3
Следование правилам
Летопись языков Па...
Изоморфизм д.з.к. ...
Windows Server 200...
Варианты атмосферы...
Требует наличия пр...
Борьба с недопусти...
Анализатор поисков...
Арифметика с плава...
Increase Quotas (У...
Сложение упакованн...
База данных на пас...
Регистрация в ката...
Статистика



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


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