Гостевая книга своими руками на PHP и MySQL

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

Наша гостевая книга будет состоять из трех php-файлов, одной базы данных и одной таблицы MySQL.

В данной статье приведены только фрагменты кода гостевой книги.
Скачать полные исходные коды гостевой книги можно здесь, 2 кб.

1. Подключаемся к СУБД, создаем базы и таблицы для гостевой книги

Файл dbconnect.php, служит для подлючения к серверу БД MySQL и создания базы данных и базы данных и необходимой таблицы для гостевой книги.

  1. // название  сервера БД
  2. define ("HOST", "localhost");
  3. // название базы данных
  4. define ("DATABASE", "gb");
  5. // пользователь MySQL
  6. define ("MYSQL_USER", "root");
  7. // пароль к MYSQL
  8. define ("MYSQL_PASS", "");
  9. // создаем базу данных и таблицу  gb
  10. $link1=mysql_connect(HOST, MYSQL_USER, MYSQL_PASS)
  11. or die("Нет соединения с MySQL сервером!");
  12. mysql_query ("CREATE DATABASE IF NOT EXISTS ".DATABASE)
  13. or die ("Не могу создать базу данных gb.");
  14. mysql_select_db(DATABASE)
  15. or die("Нет содениения с требуемой базой данных!");
  16. mysql_query ("CREATE TABLE IF NOT EXISTS gb
  17. (id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
  18. username VARCHAR (100),
  19. dt DATETIME,
  20. msg TEXT)")
  21. or die ("Не могу создать таблицу gb.");
// название  сервера БД
define ("HOST", "localhost");
// название базы данных
define ("DATABASE", "gb");
// пользователь MySQL
define ("MYSQL_USER", "root");
// пароль к MYSQL
define ("MYSQL_PASS", "");

// создаем базу данных и таблицу  gb
$link1=mysql_connect(HOST, MYSQL_USER, MYSQL_PASS) 
	or die("Нет соединения с MySQL сервером!");
mysql_query ("CREATE DATABASE IF NOT EXISTS ".DATABASE) 
	or die ("Не могу создать базу данных gb.");
mysql_select_db(DATABASE)
	or die("Нет содениения с требуемой базой данных!");
mysql_query ("CREATE TABLE IF NOT EXISTS gb 
			 (id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
			  username VARCHAR (100),
			  dt DATETIME,
			  msg TEXT)")
	or die ("Не могу создать таблицу gb.");

Таблица gb создается с необходимыми нам полями:
username - имя пользователя, оставляющего сообщение в гостевой;
dt - время и дата сообщения;
msg - текст сообщения.
Если база данных и таблица уже имеются, то ничего не происходит.

Если уж очень хочется экономить на запросах к БД, то строки с созданием БД и созданием таблицы можно вынести в отдельный *.php файл-установщик, который надо будет запускать всего 1 раз.

Файл dbconnect.php мы будем загружать каждый раз, если есть необходимость обращения к БД.

2. Что у нас в БД? Выводим содержимое гостевой книги

Файл index.php служит для отображения содержимого гостевой книги и формы отправки сообщения.

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

  1. $c=0;
  2. // выбор всех записей из БД, отсортированных так,
  3. // что самая последняя отправленная запись будет всегда первой.
  4. $r=mysql_query ("SELECT * FROM gb ORDER BY dt DESC");
  5. while ($row=mysql_fetch_array($r)) // для каждой записи организуем вывод.
  6. {
  7. if ($c%2)
  8. $col="bgcolor='#f9f9f9'"; // цвет для четных записей
  9. else
  10. $col="bgcolor='#f0f0f0'"; // цвет для нечетных записей
  11. ?>
  12. <table border="0" cellspacing="3" cellpadding="0" width="90%"
  13. <? echo $col; ?> style="margin: 10px 0px;">
  14. <tr>
  15. <td width="150" style="color: #999999;">Имя пользователя:</td>
  16. <td><?php echo $row['username']; ?></td>
  17. </tr>
  18. <tr>
  19. <td width="150" style="color: #999999;">Дата опубликования:</td>
  20. <td><?php echo $row['dt']; ?></td>
  21. </tr>
  22. <tr>
  23. <td colspan="2" style="color: #999999;">
  24. ---------------------------------------------------------------
  25. </td>
  26. </tr>
  27. <tr>
  28. <td colspan="2">
  29. <?php echo $row['msg']; ?>
  30. <br>
  31. </td>
  32. </tr>
  33. </table>
  34. <?php
  35. $c++;
  36. }
  37. if ($c==0) // если ни одной записи не встретилось
  38. echo "Гостевая книга пуста!<br>";
$c=0;
// выбор всех записей из БД, отсортированных так,
// что самая последняя отправленная запись будет всегда первой.
$r=mysql_query ("SELECT * FROM gb ORDER BY dt DESC"); 
while ($row=mysql_fetch_array($r))  // для каждой записи организуем вывод.
{
	if ($c%2)
		$col="bgcolor='#f9f9f9'";	// цвет для четных записей
	else
		$col="bgcolor='#f0f0f0'";	// цвет для нечетных записей
		
		?>
		<table border="0" cellspacing="3" cellpadding="0" width="90%"
			<? echo $col; ?> style="margin: 10px 0px;">
		<tr>
			<td width="150" style="color: #999999;">Имя пользователя:</td>
			<td><?php echo $row['username']; ?></td>
		</tr>
		<tr>
			<td width="150" style="color: #999999;">Дата опубликования:</td>
			<td><?php echo $row['dt']; ?></td>
		</tr>	
		<tr>
			<td colspan="2" style="color: #999999;">
				---------------------------------------------------------------
			</td>
		</tr>		
		<tr>
			<td colspan="2">
				<?php echo $row['msg']; ?>
				<br>
			</td>
		</tr>
		
		</table>
		<?php
	$c++;
}

if ($c==0) // если ни одной записи не встретилось
	echo "Гостевая книга пуста!<br>";

Код формы для отправки сообщений выглядит следующим образом:

  1. <form name="myForm" action="action.php" method="post" onSubmit="return splash();">
  2. <input type="hidden" name="action" value="add">
  3. <table border="0">
  4. <tr>
  5. <td width="160">
  6. Имя пользователя:
  7. </td>
  8. <td>
  9. <input name="username" style="width: 300px;">
  10. </td>
  11. </tr>
  12. <tr>
  13. <td width="160" valign="top">
  14. Сообщение:
  15. </td>
  16. <td>
  17. <textarea name="msg" style="width: 300px;"></textarea>
  18. </td>
  19. </tr>
  20. <tr>
  21. <td width="160">
  22. </td>
  23. <td>
  24. <input type="submit" value="Отправить сообщение">
  25. </td>
  26. </tr>
  27. </table>
  28. </form>
<form name="myForm" action="action.php" method="post" onSubmit="return splash();">
<input type="hidden" name="action" value="add">
<table border="0">
<tr>
	<td width="160">
		Имя пользователя:
	</td>
	<td>
		<input name="username" style="width: 300px;">
	</td>
</tr>
<tr>
	<td width="160" valign="top">
		Сообщение:
	</td>
	<td>
		<textarea name="msg" style="width: 300px;"></textarea>
	</td>
</tr>		
<tr>
	<td width="160">
		 
	</td>
	<td>
		<input type="submit" value="Отправить сообщение">
	</td>
</tr>
</table>
</form>

Проверка правильности заполнения формы происходит на стороне клиента, для чего реализована JavaScript-функция splash();

  1. function splash()
  2. {
  3. if (document.myForm.username.value  =='')
  4. {
  5. alert ("Заполните имя пользователя!");
  6. return false;
  7. }
  8. if (document.myForm.msg.value  =='')
  9. {
  10. alert ("Заполните текст сообщения!");
  11. return false;
  12. }
  13. return true;
  14. }
function splash()
{
if (document.myForm.username.value  =='')
	{
		alert ("Заполните имя пользователя!");
		return false;	
	}
	
if (document.myForm.msg.value  =='')
	{
		alert ("Заполните текст сообщения!");
		return false;	
	}

return true;   
}

Данные из формы передаются в файл action.php.

3. Добавляем записи в гостевую книгу

Файл action.php - ядро гостевой книги. В этот файл принимаются данные из формы отправки сообщения и может выполняться одно из двух действий:
- добавление записи в гостевую книгу (при параметре action=add)
- удаление всех записей из гостевой книги (при параметре action=delete)

Заметим, что случай, когда action=delete может наступить только тогда, когда эта команда будет передана в ручную, с помощью вызова action.php?action=delete.

  1. <?php
  2. include ("dbconnect.php");
  3. // получаем переменные из формы
  4. $username=$_REQUEST['username'];
  5. $msg=$_REQUEST['msg'];
  6. $action=$_REQUEST['action'];
  7. if ($action=="add")
  8. {
  9. // добавление данных в БД
  10. $sql="INSERT INTO gb(username, dt, msg) VALUES ('$username', NOW(), '$msg')";
  11. $r=mysql_query ($sql);
  12. }
  13. if ($action=="delete")
  14. {
  15. // удаление базы гостевой
  16. $sql="DELETE FROM gb";
  17. $r=mysql_query($sql);
  18. }
  19. header("Location: index.php");
  20. ?>
<?php
	include ("dbconnect.php");

	// получаем переменные из формы
	$username=$_REQUEST['username'];
	$msg=$_REQUEST['msg'];
	$action=$_REQUEST['action'];
	
	if ($action=="add")
	{
		// добавление данных в БД 
		$sql="INSERT INTO gb(username, dt, msg) VALUES ('$username', NOW(), '$msg')";
		$r=mysql_query ($sql);
	}
	
	if ($action=="delete")
	{
		// удаление базы гостевой
		$sql="DELETE FROM gb";
		$r=mysql_query($sql);
	}
	
	header("Location: index.php");
?>

Файл action.php создан специально для того, чтобы не передавать данные в файл index.php. Если бы мы передавали данные в index.php, то при обновлении страницы или при пользовании кнопками "назад", "вперед" в браузере, мы бы могли встретиться с ситуацией излишней повторной отправки данных. Что приводило бы созданию дубликатов записей в гостевой книге и излишней путанице пользователей.

Файл action.php ничего не возвращает браузеру. При выполнении action.php происходит редирект на файл index.php.

дизайн вашего дома

обеспечим теплом загородный дом

утилизация вредных отходов