Отправляет email-рассылки с помощью сервиса Sendsay

Программирование в Web

  Все выпуски  

Программирование в Web Выпуск 19 от 14/12/2006 Основы PHP - Урок-13 ПРАКТИКУМ


 
Программирование в web

ОСНОВЫ PHP
 

 
Внимание!!!
Все материалы уроков, публикуемых в этом и во всех последующих выпусках рассылки «Программирование в web», являются интеллектуальной собственностью авторов и ведущих рассылки. По всем вопросам размещения или публикации данных материалов на собственных ресурсах или где-либо еще, или иного использования, не связанного с личным ознакомлением и самостоятельным обучением, - обращайтесь на адрес автора. Любое использование этих материалов в коммерческих или иных целях, явно не разрешенное автором, является незаконным.
 

 
У Р О К    13 — ПРАКТИКУМ
Здравствуйте уважаемые подписчики!

Приношу свои извинения снова за задержку с очередным выпуском. К сожалению не всегда наши возможности совпадают с нашими желаниями. Но вот наконец-то сделал и этот очередной выпуск.


В этом выпуске, как обещал ранее, начнем изучать PHP на примерах. К этому уроку мы уже знаем много всевозможных функций и конструкций языка и это позволит нам рассматривать некоторые вполне работоспособные примеры, которые вы легко сможете использовать на своих сайтах. Я думаю не стоит мудрствовать лукаво и начать с одного из самых простых и в тоже время одного из самых необходимых на любом сайте компонента, а именно с простейшей гостевой книги. То, что будет приведено ниже, будет являться вполне работоспособным сценарием, но, и не лишенным недостатков, конечно. Рассмотрим в этом выпуске, так сказать, только каркас гостевой книги, все же остальные удовольствия, необходимые или не очень, в гостевых книгах, я оставляю целиком на вашу фантазию и ваши желания. К таким удовольствиям я отношу администрирование он-лайн базы гостевой книги, различные смайлики, тэги и так далее, а также дизайн. Итак, начинаем&he llip;



ПРИМЕР ГОСТЕВОЙ КНИГИ:

Для начала давайте решим, что нам необходимо записывать в базу гостевой книги. Естественно, самым необходимым будет имя или ник оставившего сообщение, а также и само сообщение. Кроме того, было бы весьма неплохо дать возможность посетителю оставить свой адрес электронной почты, возможно адрес его собственного сайта и номерочек аськи. Лично я являюсь противником анонимных сообщений в гостевых книгах, так как это, в некотором роде, просто некультурно, поэтому к обязательным записям в базе даных книги я причислю и адрес электронной почты. Итак, теперь нам точно известно, что в записях гостевой книги будут содержаться имя или ник посетителя, его электронный адрес и само сообщение. Будем считать эти три компонента обязательными при формировании записей базы сообщений, также, для желающих добавим поля адреса сайта посетителя (мало ли, может он пожелает похвалиться своим произведением), а также номероr его ICQ. То ес ть, уже имеем пять полей, три из которых являются обязательными. Еще было бы неплохо владельцу сайта знать точную дату и время, когда было оставлено сообщение, а также и IP-адрес посетителя. IP-адрес нам может пригодиться во многом в дальнейшем. Зная его мы легко сможем в дальнейшем определить хулигана и даже запретить ему доступ к сайту или к гостевой книги, а заодно, возможно, вы пожелаете, чтобы в записях гостевой книги отображался и город, из которого пришел к вам на сайт посетитель. Это тоже можно организовать, но рассматривать это, во всяком случае сейчас, мы не будем. Так как связь с SQL-сервером и организацию баз данных SQL мы еще не изучали, то вопрос в каком виде мы будем хранить нашу базу сообщений отпадает сам собой. Пока это будет просто текстовый (или как его иногда еще называют - флэт (flat)) файл. теперь снова пересчитаем все поля, которые будут содержаться в каждой записи:


Поля, которые заполняет посетитель:
Поле Имя или Ник (обязательное поле);
Поле e-mail адрес (обязательное поле);
Поле адреса сайта;
Поле номера ICQ;
Поле сообщения (обязательное поле);
Автоматические поля:
Дата;
Время;
IP-адрес посетителя;
И для дальнейшего развития - пустое поле для ответа модератора.

Итак, мы имеем всего 9 (девять) полей, которые будут храниться в каждой записи базы сообщений нашей гостевой книги.


Дизайн гостевой книги я предлагаю сделать вам самостоятельно, здесь же мы сосредоточимся на самом сценарии, с некоторыми включениями кода HTML. Теперь сам код нашей гостевой книги:


<?php
//////// Форма ////////
print '<table align="center" cellpadding="1" cellspacing="0" border="0" width="90%">
<form method="post" name="guestbook">
<tr><td align="left" width="25%"><b>Имя или Ник:(*)</b></td>
<td align="left"><input type="text" name="postername" size="25" value=""></td></tr>
<tr><td align="left" width="25%"><b>E-mail адрес:(*)</b></td>
<td align="left"><input type="text" name="posteremail" size="25" value="';
echo "@";
print '"></td></tr><tr><td align="left" width="25%"><b>Адрес сайта:</b></td>
<td align="left"><input type="text" name="posterweb" size="25" value="';
echo 'http://';
print '"></td></tr><tr><td align="left" width="25%"><b>Номер ICQ:</b></td>
<td align="left"><input type="text" name="postericq" size="25" value=""></td></tr>
<tr><td align="left" width="25%"><b>Ваше сообщение:(*)</b></td>
<td align="left"><textarea name="postermess" ROWS="7" COLS="35"></textarea></td></tr>
<tr><td colspan="2" align="center"><input type="submit" name="posting" value="Добавить"></td></tr>
<tr><td colspan="2" align="center">
<hr width="80%">
<table align="center" cellpadding="1" cellspacing="1" border="0" width="90%">
<tr><td align="center">
<font color="darkblue">Поля, помеченные звездочкой (*), обязательны для заполнения!!!</font>
</td></tr></table>
</td></tr></table>
<hr width="80%">';
//////// Конец формы ////////

//Пишем код обработчика добавления новой записи
if ($_REQUEST['posting']) { // Код будет выполняться только если нажата кнопка Добавить
$date = date("d.m.Y"); // Получаем дату добавления записи
$time = date("H:i:s"); // Получаем время добавления записи
$userip = getenv("REMOTE_ADDR"); // Получаем IP-адрес посетителя
$data=array(); // Создаем пустой массив полей сообщений
$data=array(
"name"=>$_REQUEST['postername'],
"email"=>$_REQUEST['posteremail'],
"web"=>$_REQUEST['posterweb'],
"icq"=>$_REQUEST['postericq'],
"message"=>$_REQUEST['postermess'],
"date"=>$date,
"time"=>$time,
"ip"=>$userip,
"ans"=>""
)
$f=fopen("data/base.php", "a+"); // Открываем файл базы сообщений (если файл не существует, то он будет создан
flock($f, LOCK_EX); // Блокируем доступ к файлу для других процессов
fwrite($f,serialize($data)."\n"); // Запаковываем и записываем сообщение в файл базы
flock($f, LOCK_UN); // Снимаем блокировку с файла
fclose($f); // Закрываем файл
}

// Пишем обработчик показа записей
if(file_exists("data/base.php")){ // Если файл базы существует, то осуществляем показ записей
$guesty=file("data/base.php"); // Читаем данные из файла базы
foreach($guesty as $guest) {
if ($guest=="") {continue;} //Если попалась пустая строка в файле, просто игнорируем ее
$gues=unserialize($guest); // Распаковываем очередную запись
// Показываем очередную запись
print "<table width=\"98%\" align=\"center\" cellpadding=\"2\" cellspacing=\"1\" border=\"0\"><tr>";
print "<td width=\"100%\" align=\"left\"><b>Сообщение от:</b> 
<a href=\"mailto:$gues[email]\">$gues[name]</a>";
print "   <b>Адрес web-сайта:</b> 
<a href=\"$gues[web]\" TARGET=\"_blank\">$gues[web]</a>";
print "   <b>ICQ:</b> 
<a href=\"http://www.icq.com/whitepages/wwp.php?uin=$gues[icq]\" TARGET=\"_blank\">$gues[icq]</a></td></tr>";
$guesmess=htmlspecialchars(trim($gues['message']));
print "<tr><td width=\"100%\"><br /><p>$guesmess</p><br /></td></tr>";
print "<tr><td width=\"100%\" align=\"left\">
<b>Сообщение добавлено:</b> $gues[date]   <b>С IP-адреса:</b> $gues[ip]</td></tr>";
print "</tr></table><hr width=\"80%\">";
}
}
else {print("<center><font color=\"red\" size=\"2\">Записей нет!</font></center>");} // Если файл базы отсутствует
?>

Вот такая простенькая гостевая книга у нас получилась. Здесь я поместил html-код формы и вывода сообщений внутри самого сценария, но этого делать вовсе не обязательно, наоборот, чем сильнее вы отделите html-оформление от кода сценария, тем проще вам будет изменять в дальнейшем дизайн. Попробуйте самостоятельно переписать этот сценарий, отделив максимально html-код оформления от сценария. Также, для формирования записей в базе сообщений, вам вовсе не обязательно использовать сериализацию, вы легко можете воспользоваться функциями implode() и explode(), или же написать свою собственную функцию, или же воспользоваться функциями для работы с регулярными выражениями (о них мы поговорим в будущих уроках). Данная гостевая книга не претендует на полноценную гостевую книгу, но она нормально функционирует. В ней сейчас нет проверки на ввод обязательных полей, нет нормальной проверки на корректность введенных данных и он а далеко не безопасна, сообщения выводятся все подряд, сколько бы их в базе сообщений ни было, на одной странице..., но не все сразу.


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


 

 
Объявления!!!

В последующих выпусках планируется сделать блок вопросов и ответов, в котором вы сможете задавать интересующий вас вопрос (касающийся, естественно, уже пройденных уроков, без забегания вперед), и, в котором другие подписчики смогут дать ответ на ваш вопрос. Если вы считаете, что данный блок был бы желателен в рассылке, прошу написать на мой адрес любое, даже пустое письмо, главное, чтобы в письме присутствовала тема, в которой вы и дадите свой ответ на это мое предложение, например, тема может быть такой: "...Наличие блока вопрос-ответ обязательно..." или "...Блок вопрос-ответ не нужен..." или "...Было бы неплохо создать блок вопрос-ответ...", в общем, вот в таком плане. Односложные темы, типа "Да" или "Нет" создавать не стоит, так как антиспамовый фильтр моей почтовой программой может просто-напросто принять такое письмо за спам и у далить его с сервера, либо, если фильтр не сработает, то я сам могу не понять что означают эти темы, и, не глядя, удалить такое письмо, таким образом я не смогу узнать вашего мнения по этому вопросу.

Если у вас возникли какие-то вопросы, не стесняйтесь, задавайте. Для этого, всего лишь, пошлите на мой адрес письмо с вопросом и с темой, в которой обязательно укажите какого урока и какого языка касается вопрос. Например, тема может быть такой - «Основы PHP. Урок 13. Вопрос». Также, с такой же темой и на этот же адрес вы можете прислать и свои дополнения к уроку. Если дополнения будут существенными, то в последующих уроках они обязательно будут учтены.

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

Обо всех замеченных опечатках, ошибках или неточностях прошу также обращаться на мой адрес, все мы люди и все мы можем ошибаться. Однако, не забывайте делать соответствующую пометку в теме ваших сообщений.

Маленькая просьба. Многие из вас присылают мне запросы на отправку им того или иного, не полученного ранее, выпуска рассылки. У меня не всегда есть возможность это сделать. Поэтому предлагаю вам для начала посмотреть нужный выпуск в архиве рассылки. Рассылка выходит сразу на трех рассыльных сервисах, и по некоторым причинам (мне не известным) некоторые сервисы не принимают адресов, в которых встречаются именя конкурирующих рассыльных сервисов, по этой причине я опубликую только одну ссылку на архив рассылки только одного рассыльного сервиса, а именно Content.mail.ru. Вот ссылка на на этот архив рассылки - http://content.mail.ru/pages/p_21931.html. В обще м-то это объявление наверное лишнее, ведь в каждом выпуске каждой рассылки, вне зависимости от того, на каком сервисе она выходит, всегда указан этот самый адрес архива рассылки. На сабскрайб.ру и на контент.мэйл.ру этот адрес указывается в самом низу выпуска, а на мэйллист.ру - в самом верху выпуска. Так что, при достаточном внимании, вы сами легко сможете найти нужную ссылку на архив рассылки.

 

 
Внимание!!!
Все материалы уроков, публикуемых в этом и во всех последующих выпусках рассылки «Программирование в web», являются интеллектуальной собственностью авторов и ведущих рассылки. По всем вопросам размещения или публикации данных материалов на собственных ресурсах или где-либо еще, или иного использования, не связанного с личным ознакомлением и самостоятельным обучением, - обращайтесь на адрес автора. Любое использование этих материалов в коммерческих или иных целях, явно не разрешенное автором, является незаконным.
 

 
Наш проект и наши друзья
Автор рассылки — Anatolick
Архив рассылки — http://content.mail.ru/pages/p_21931.html
Сайт проекта — «Russian discussions Zone»
Движок для сайтов — «Tanat-Engine»
Проект Web Help — «Web-Help.int.ru»
Дискуссионный лист — «Все для Всех о РС»
Дискуссионный лист — «File Info Masters»
Дискуссионный лист — «Напряги мозги»
Дискуссионный лист — «Ищем все…»
Дискуссионный лист — «Все обо Всем по Email»
Дискуссионный лист — «Внимание! Розыск…»
Дискуссионный лист — «Английский для Всех и каждого»
Группа стандартизации в Web — W3C.org
 

В избранное