Создание доски отзывов на PHP, MySQL и jQuery
Согласно Wikipedia, доска отзывов (гостевая книга) - это специальный раздел сайта, где пользователи могут оставлять свои отзывы, при этом регистрация не требуется.
Сегодня я вам покажу, как создать подобную систему, используя супер популярную технологию jQuery AJAX. Согласно спецификации, нам необходима форма, в которую пользователь будет вводить своё имя и сообщение. После того как форма будет отправлена, мы отправим введённые данные скрипту через AJAX, который вставит данные в БД и обновит содержимое доски. Но нам также нужно обновить информацию и для других пользователей. Как? Это я вам покажу в конце урока.
В первую очередь, нам необходимо создать базу данных и таблицу, где будет копиться информация:
CREATE TABLE IF NOT EXISTS `shoutbox` ( `id` int(11) NOT NULL AUTO_INCREMENT, `date_time` datetime NOT NULL, `name` varchar(20) COLLATE utf8_unicode_ci NOT NULL, `message` varchar(255) COLLATE utf8_unicode_ci NOT NULL, PRIMARY KEY (`id`) ) ENGINE=MyISAM
Как я сказал ранее, нам необходима самая простая форма:
<h2>Shoutbox</h2> <form method="post" action="shout.php"> Name: <input type="text" id="name" name="name" /> Message: <input type="text" id="message" name="message" class="message" /> <input type="submit" id="submit" value="Submit" /> </form> <div id="shout"></div>
Данный код создаст нам форму, которая удовлетворяет всем условиям. Теперь я покажу вам код jQuery, который будет извлекать и отсылать данные:
$(function() { $("#submit").click(function() { // получаем то, что написал пользователь var name = $("#name").val(); var message = $("#message").val(); // Формируем строку запроса var data = 'name='+ name +'&message='+ message; // ajax вызов $.ajax({ type: "POST", url: "shout.php", data: data, success: function(html){ // после получения результата $("#shout").slideToggle(500, function(){ $(this).html(html).slideToggle(500); $("#message").val(""); }); } }); return false; }); });
Всё что является на мой взгляд важным, я отметил комментарием. Этот код собирает ту информацию, которую пользователь ввёл в форму, и отправляет в файл shout.php, который в свою очередь вставляет новые данные в БД и возвращает результат. Выражение return false используется для того чтобы определить, была ли отправлена форма.
А теперь я покажу вам, как использовать расширение PDO, для того чтобы обезопасить себя при помощи подготовленных выражений и других вещей.
PHP Data Objects (PDO) - расширение для PHP, предоставляющее разработчику простой и универсальный интерфейс для доступа к различным базам данных.
Вашему вниманию представляю файл shout.php:
/*** mysql хост ***/ $hostname = 'localhost'; /*** mysql пользователь ***/ $username = 'root'; /*** mysql пароль ***/ $password = ''; $dbname = 'shout'; try { $dbh = new PDO("mysql:host=$hostname;dbname=$dbname", $username, $password); if($_POST['name']) { $name = $_POST['name']; $message = $_POST['message']; /*** превратить все ошибки в исключения ***/ $dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); $sql = "INSERT INTO shoutbox (date_time, name, message) VALUES (NOW(), :name, :message)"; /*** готовим выражение ***/ $stmt = $dbh->prepare($sql); /*** вставляем параметры ***/ $stmt->bindParam(':name', $name, PDO::PARAM_STR); $stmt->bindParam(':message', $message, PDO::PARAM_STR); /*** запускаем sql выражение ***/ if ($stmt->execute()) { populate_shoutbox(); } } } catch(PDOException $e) { echo $e->getMessage(); } /***** Это я объясню позже *****/ if($_POST['refresh']) { populate_shoutbox(); } /********************************/ function populate_shoutbox() { // нам не нужно снова подключаться global $dbh; $sql = "select * from shoutbox order by date_time desc limit 10"; echo '<ul>'; foreach ($dbh->query($sql) as $row) { echo '<li>'; echo '<span class="date">'.date("d.m.Y H:i", strtotime($row['date_time'])).'</span>'; echo '<span class="name">'.$row['name'].'</span>'; echo '<span class="message">'.$row['message'].'</span>'; echo '</li>'; } echo '</ul>'; }
Позвольте мне тут немного объяснить. В первую очередь, мы определяем переменную, через которую будет осуществляться соединение базой.
$dbh = new PDO("mysql:host=$hostname;dbname=$dbname", $username, $password);
Это типичная запись для подключения к базе. В этом контектсе мы также выбираем базу данных, с которой будем работать (вместо mysql_selectdb).
Теперь, когда соединение установлено через PDO, вы должны понять, как PDO осуществляет процесс вставки данных в БД. Если вы никогда не имели дело с подобными системами, то знайте, что они используют 4 фичи: Атомарность, Согласованность, Изолированность и Долговечность (ACID). Если говорить профессиональным языком, то транзакция, даже та, которая осуществляется поэтапно, гарантированно будет выполняться в безопасном режиме, исключая все сторонние вмешательства. Работа транзакций может быть откатана в любой момент при вашем запросе (если вы не закончили сам процесс), что позволяет эффективнее отловить все пойманные ошибки.
Транзакция также позволят вам без особых сложностей применить сразу все обновления; что на самом деле увеличивает эффективность актуализации данных. Другими словами, транзакции могут сделать ваш скрипт быстрым и безопасным (если руки у вас на месте).
Второй момент, который я хотел бы объяснить, - это подготовка выражения для вставки в базу данных. Этот процесс обеспечивает вам высшую степень безопасности. Параметры, которые вы вставляете в выражения не нужно помещать в кавычки; драйвер автоматически сделает это за вас. Если приложение использует подготовленные выражения, то разработчик может быть уверен в том, что никакие SQL инъекции ему не страшны.
Ещё одно преимущество в том, что выражение может быть составлено единожды, а использовано многократно, при чём с таким же или другим числом параметров. Когда выражение будет готово, адаптер проанализирует все данные, скомпилирует и оптимизирует их, а затем создаст запрос. Для очень сложных запросов времени может потребоваться побольше. В общем, используя такие выражения ваши данные пройдут через следующий цикл: анализ/компиляция/оптимизация.
Наша функция populate_shoutbox выбирает последние 10 строк, которые хранятся в таблице и создаёт список, который возвращается на лицевую сторону сайта.
Теперь, если вы помните, я сказал о том, при добавлении, данные отобразятся всем пользователям, которые будут находится на данной странице. Также я упомянул, что при этом мы не будем использовать перезагрузку страницы.
Ну так вот. Метод, который будет заполнять страницу содержимым, запустится один при входе на страницу, а затем будет вызываться каждые 15 секунд. Этого времени вполне хватит – мы же не чат делаем, в конце концов.
function refresh_shoutbox() { var data = 'refresh=1'; $.ajax({ type: "POST", url: "shout.php", data: data, success: function(html){ $("#shout").html(html); } }); } //заполнить страницу в первый раз refresh_shoutbox(); // обновить каждые 15 секунд setInterval("refresh_shoutbox()", 15000);
Далее задействуем следующие строки:
if($_POST['refresh']) { populate_shoutbox(); }
Если мы получили $_POST['refresh'], то нам просто надо вытащить данные и вернуть их в js код.
Вот и всё. В этом уроке мы создали доску отзывов для своих пользователей. Также я рассказал вам о расширении PDO, которое упрощает безопасное общение с БД. Спасибо за внимание!
Источник: http://feedproxy.google.com/~r/ruseller/CdHX/~3/6rNqiLESEB4/lessons.php
Дайджест новых статей по интернет-маркетингу на ваш email
Новые статьи и публикации
- 2024-11-26 » Капитан грузового судна, или Как начать использовать Docker в своих проектах
- 2024-11-26 » Обеспечение безопасности ваших веб-приложений с помощью PHP OOP и PDO
- 2024-11-22 » Ошибки в Яндекс Вебмастере: как найти и исправить
- 2024-11-22 » Ошибки в Яндекс Вебмастере: как найти и исправить
- 2024-11-15 » Перенос сайта на WordPress с одного домена на другой
- 2024-11-08 » OSPanel 6: быстрый старт
- 2024-11-08 » Как установить PhpMyAdmin в Open Server Panel
- 2024-09-30 » Как быстро запустить Laravel на Windows
- 2024-09-25 » Next.js
- 2024-09-05 » OpenAI рассказал, как запретить ChatGPT использовать содержимое сайта для обучения
- 2024-08-28 » Чек-лист: как увеличить конверсию интернет-магазина на примере спортпита
- 2024-08-01 » WebSocket
- 2024-07-26 » Интеграция с Яндекс Еда
- 2024-07-26 » Интеграция с Эквайринг
- 2024-07-26 » Интеграция с СДЕК
- 2024-07-26 » Интеграция с Битрикс-24
- 2024-07-26 » Интеграция с Travelline
- 2024-07-26 » Интеграция с Iiko
- 2024-07-26 » Интеграция с Delivery Club
- 2024-07-26 » Интеграция с CRM
- 2024-07-26 » Интеграция с 1C-Бухгалтерия
- 2024-07-24 » Что такое сторителлинг: техники и примеры
- 2024-07-17 » Ошибка 404: что это такое и как ее использовать для бизнеса
- 2024-07-03 » Размещайте прайс-листы на FarPost.ru и продавайте товары быстро и выгодно
- 2024-07-01 » Профилирование кода в PHP
- 2024-06-28 » Изучаем ABC/XYZ-анализ: что это такое и какие решения с помощью него принимают
- 2024-06-17 » Зачем вам знать потребности клиента
- 2024-06-11 » Что нового в работе Яндекс Метрики: полный обзор обновления
- 2024-06-11 » Поведенческие факторы ранжирования в Яндексе
- 2024-06-11 » Скорость загрузки сайта: почему это важно и как влияет на ранжирование
Всегда храни верность своему начальнику - следующий, может быть еще хуже... |
Мы создаем сайты, которые работают! Профессионально обслуживаем и продвигаем их , а также по всей России и ближнему зарубежью с 2006 года!
Как мы работаем
Заявка
Позвоните или оставьте заявку на сайте.
Консультация
Обсуждаем что именно Вам нужно и помогаем определить как это лучше сделать!
Договор
Заключаем договор на оказание услуг, в котором прописаны условия и обязанности обеих сторон.
Выполнение работ
Непосредственно оказание требующихся услуг и работ по вашему заданию.
Поддержка
Сдача выполненых работ, последующие корректировки и поддержка при необходимости.