Задача 3. Гостевая книга.

Сегодня я опять хочу поговорить о БД. Кое-что мы делать уже научились. И пора двигаться дальше.
Когда речь идёт о кодинге, то изобретать колесо я думаю очень полезно. И как ни банально бы это звучало, я решил сделать на php гостевую книгу. Прежде чем смотреть на мой код. Сначала создайте БД с именем ‘inovice’ через phpmyadmin. Только убедитесь, что кодировка везде выставлена utf8_general_ci.

Потом перейдите во вкладку sql и выполните этот код

SET SQL_MODE="NO_AUTO_VALUE_ON_ZERO";


/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
/*!40101

SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */
;
/*!40101 SET

@OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */
;
/*!40101 SET NAMES utf8 */;
CREATE TABLE `guestbook` (
  `id` INT(11) NOT NULL AUTO_INCREMENT,
  `author` text NOT NULL,
  `title` text NOT NULL,
  `post` text NOT NULL,
  `post_date` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
  PRIMARY KEY  (`id`)
)

ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=6 ;

--
-- Дамп данных таблицы `guestbook`
--

INSERT INTO `guestbook` VALUES(5, 'tester', 'test', ' text', '2008-06-03 23:06:44');

/*!40101 SET

CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */
;
/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS

*/
;
/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;

И после выполнения у вас сразу окажется моя таблица с одной вставкой данных.

Теперь можно перейти непосредственно к гостевой книге.
Создайте 2 файла index.php и connect.php

в connect.php должно быть следующее

<?
     $host = "localhost";
     $user = "root";
     $pass = "";
     $dbname = "inovice";

     mysql_connect($host, $user, $pass);
     mysql_select_db($dbname);
?>

Из предыдущей статьи про работу с базой данных, вы должны догадаться что это подключение к бд mysql.
А код index.php вот такой

<?
     include "connect.php";


     // входные данные
     $author = trim($_REQUEST['author']);
     $title = trim($_REQUEST['title']);
     $post = trim($_REQUEST['post']);
     $del_id = $_REQUEST['del_id'];


     // добавляем пост
     if (!empty($author) && !empty($post) && !empty($title)) {

          $sql = "insert into guestbook (author, title, post, post_date) VALUES('".$author."', '".$title."', '".$post."', NOW())";
          mysql_query($sql);          

     }

     // удаляем пост
     if (!empty($del_id)) {
     
          $sql = "delete from guestbook where id=".$del_id;
          mysql_query($sql);

     }

     // выбираем все посты ( последний оставленные - первый в списке )
     $sql = "select * from guestbook order by post_date desc";
     $result = mysql_query($sql);

?>
<html>
<body>

<center>
<h1>Гостевая книга</h1><br>

<!-- Форма для добавления новой записи -->
<form action="index.php" method="post">
Ваше имя: <input type="text" name="author"><br>
Заголовок: <input type="text" name="title"><br>
Текст:<br>
<textarea rows="5" cols="30" name="post"> </textarea><br>
<input type="submit" value="Добавить">
</form>


<!-- Выводим все посты -->
<table width="300">
<?

     while ($post = mysql_fetch_assoc($result)) {
     ?>
          <tr>
               <td colspan="2"><b><?=$post['title']?></b></td>
          </tr>
          <tr>
               <td><?=$post['author']?></td>
               <td><?=$post['post_date']?></td>
          </tr>
          <tr>
               <td colspan="2">
               <?=$post['post']?><br>
               <a href="index.php?del_id=<?=$post['id']?>">Удалить</a><br><br>
               </td>
          </tr>
     <?
     }

?>
</table>

</center>

</body>
</html>

include “connect.php”;
Здесь мы подключаем файл соединения с БД.
Хочу обратить внимание, что данные полученные с формы фильтруются ф-ей trim. Для удобства я вынес это в один блок и поместил наверху скрипта.

При добавлении поста происходит проверка на пустые поля с помощью функции !empty. А добавление происходит функцией insert.

$sql = “insert into guestbook (author, title, post, post_date) VALUES(‘”.$author.”‘, ‘”.$title.”‘, ‘”.$post.”‘, NOW())”;

Мы указываем имя таблицы для вставки, в данном случае это guestbook. Затем в скобках пишем в какие именно столбцы надо вставить значения. А слово VALUES указывает на сами значения. Заметьте, что порядок перечисления в двух скобках должен совпадать.

Процесс удаления еще легче чем вставка.

$sql = “delete from guestbook where id=”.$del_id;

Надо только указать из какой таблицы вы удаляете и по какому маркеру. В данном случаее маркером является поле id.
Значение которого берется из ссылки

<a href="index.php?del_id=<?=$post['id']?>">Удалить</a>

Теперь перейдем к выводу данных из таблицы. Для начала нам нужна команда, которая это сделает.

$sql = “select * from guestbook order by post_date desc”;
$result = mysql_query($sql);

Здесь я применил сортировку значений с помощью order by по убыванию (desc).

while ($post = mysql_fetch_assoc($result))

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

Когда я первый раз написал гостевую книгу и показал код своему знакомому, то он сделал важное замечание по структуре. Все операции по изменению БД надо делать до её вывода. Это нужно, чтобы данные отображали текущее состояние БД, а не на предыдущем шаге или когда-нибудь еще.

Материал изучен, обработан и подготовлен вашим первопроходцем aka novice.





Читайте также:



3 Ответов на “Задача 3. Гостевая книга.”

  1. “При добавлении поста происходит проверка на пустые поля с помощью функции !empty. А добавление происходит функцией insert.”
    Мне кажется в данном контексте insert всё таки не функция, а запрос, поправьте меня если я ошибаюсь :).

  2. не могли бы вы подробнее объяснить, что означают строки в вашем коде
    SET SQL_MODE=”NO_AUTO_VALUE_ON_ZERO”;

    /*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
    /*!40101

    SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
    /*!40101 SET

    @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;
    /*!40101 SET NAMES utf8 */;

    ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=6 ;

    или подскажите в какой из статей вы это рассматривали, просто я ещё не все прочитала, но мне очень нравится как вы доступно всё объясняете.

  3. Насчет функции спорный вопрос конечно… точнее относительный :) Для php “insert” это текст запроса, а для mysql-сервера - это уже функция.

    Насчет этих непонятных строчек в запросах - честно говоря, не знаю. :) phpmyadmin их сгенерировал сам, но без них тоже работает.


© Copyright. . I-Novice. All Rights Reserved. Terms | Site Map