Как сделать динамическое добавление комментариев, используя Ajax.
Всем привет! В этой статье я хочу рассказать вам, как сделать добавление комментариев через Ajax.
Наша система будет очень простой, чтобы показать суть, а дальше вы сможете сами все улучшить как нужно именно вам.
Для начала создайте файл index.html в корне сайта. Создайте папку libs, а в ней файл add_comment.php
Откроем файл index.html и создадим там простую форму.
<form action="" method="post">
<span>Имя: </span><br>
<input type="text" id="name"><br>
<span>Комментарий</span><br>
<textarea id="comment" cols="30" rows="10"></textarea><br>
<button id="button">Отправить</button>
</form>
Теперь создайте базу данных, у меня она называется comments. Создайте там табличку
CREATE TABLE IF NOT EXISTS `comm` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`name` varchar(30) NOT NULL,
`comment` varchar(255) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=36 ;
Теперь откроем файл add_comment.php и пропишем следующее
<?php
$name = $_POST['name'];
$comment = $_POST['comment'];
$mysqli = new Mysqli('localhost', 'root', '', 'comments');
$mysqli->query("SET NAMES utf8");
$mysqli->query("INSERT INTO `comm`(`name`, `comment`) VALUES('$name', '$comment')");
?>
Думаю, тут все понятно. Получаем данные из массива post, записываем их в переменные, подключаемся к базе данных, отправляем запрос на установление кодировки, отправляем запрос на добавление комментария.
Теперь переходим к самому интересному - javascript. Сразу после формы пишем следующее:
<script>
var button = document.getElementById('button'),
xmlhttp = new XMLHttpRequest();
button.addEventListener('click', function() {
var name = document.getElementById('name').value.replace(/<[^>]+>/g,''),
comment = document.getElementById('comment').value.replace(/<[^>]+>/g,'');
if(name === '' || comment === '') {
alert('Заполните все поля!');
return false;
}
xmlhttp.open('post', 'libs/add_comment.php', true);
xmlhttp.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
xmlhttp.send("name=" + encodeURIComponent(name) + "&comment=" + encodeURIComponent(comment));
});
</script>
Вот такой небольшой кусочек кода нужен для решения этой задачи. Что мы тут сделали? Давайте разберемся.
Сначала мы находим кнопку и вешаем на нее обработчик события, который при клике вызывает анонимную функцию. В анонимной функции мы получаем значения имени и комментария и сразу же убираем там все html теги. Теперь проверяем, если хотя бы одно из полей является пустым, пишем об этом автору комментария и останавливаем скрипт. Если все нормально, то подключаемся к php файлу, отправляем заголовки с кодировкой и затем отправляем имя пользователя и текст его сообщения, кодируя русские символы.
Все, теперь вы можете ввести свой комментарий, нажать кнопку отправить, и он появится в базе данных без перезагрузки страницы.
На этом я заканчиваю эту статью, а в следующей мы разберем, как динамически подгружать комментарии. Эта задача также довольно нетрудная.
Итак, спасибо за внимание и удачи!
-
- Михаил Русаков
Комментарии (7):
А должно ли это работать на Denwer`е? Скопировал, создал таблицу, изменил название базы, не работает. Просто не подключается php файл, как я понимаю.
Ответить
Конечно, должно! Если вы поменяли название базы, то не забудьте изменить ее название и в php файле. Также не забудьте проверить, где находится php файл. Он должен быть в папке libs и называться add_comment.php Если вы поменяли название файла или его путь, то поменяйте соответствующую строчку в JavaScript.
Ответить
Не работает. Сделал как написано. Пользуюсь FireFox, при нажатии кнопки, если поля пустые появляется сообщения, если поля не пустые то просто перегружает страницу. JavaScript ничего не пытается отправить. Сообщений ошибок нет. Поэкспериментировал, обнаружил странное поведение JavaScript, если в конце кода JavaScript добавить просто пустой alert(); , скрипт работает, оправляет на сервер данные и происходит запись в БД, я так понимаю в коде что то не хватает для нормального запуска JavaScript в FireFox, alert как то активарует скрипт. Что может быть? Попробовал другим браузером Expiorer, JavaScript отрабатывает без alert(); в конце.
Ответить
Работает не стабильно, как исправить? Кто нибудь подскажите.
Ответить
У меня почему то айди равен 36 зачем столько ?
Ответить
После отправки данных возникает ошибка Cannot POST /Index.html. Что не так мог сделать? Проверил все как в уроке.
Ответить
Обязателен alert в конце скрипта, как указано у SHOKIN выше. После первого вызова этого самого alert-a, при последующих вызовах ajax, alert уже не нужен. И что бы это могло быть?
Ответить
Для добавления комментариев надо войти в систему.
Если Вы ещё не зарегистрированы на сайте, то сначала зарегистрируйтесь.