Задача 3. Гостевая книга.
Сегодня я опять хочу поговорить о БД. Кое-что мы делать уже научились. И пора двигаться дальше.
Когда речь идёт о кодинге, то изобретать колесо я думаю очень полезно. И как ни банально бы это звучало, я решил сделать на php гостевую книгу. Прежде чем смотреть на мой код. Сначала создайте БД с именем ‘inovice’ через phpmyadmin. Только убедитесь, что кодировка везде выставлена utf8_general_ci.
Потом перейдите во вкладку sql и выполните этот код
/*!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.
Значение которого берется из ссылки
Теперь перейдем к выводу данных из таблицы. Для начала нам нужна команда, которая это сделает.
$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.
“При добавлении поста происходит проверка на пустые поля с помощью функции !empty. А добавление происходит функцией insert.”
Мне кажется в данном контексте insert всё таки не функция, а запрос, поправьте меня если я ошибаюсь :).
не могли бы вы подробнее объяснить, что означают строки в вашем коде
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 ;
или подскажите в какой из статей вы это рассматривали, просто я ещё не все прочитала, но мне очень нравится как вы доступно всё объясняете.
Насчет функции спорный вопрос конечно… точнее относительный Для php “insert” это текст запроса, а для mysql-сервера - это уже функция.
Насчет этих непонятных строчек в запросах - честно говоря, не знаю. phpmyadmin их сгенерировал сам, но без них тоже работает.