Добрый день! Сегодня мы будет делать простую гостевую на PHP с использованием MySQLi и Memcache.
Внимание! Все что я делал, я тестировал на OpenServer.
Внимание, для использования Memcache сначала необходимо включить этот модуль в настройках: Настройки -> Модули -> Memcached
В данном файле у нас будет форма отправки сообщения
Здесь у нас самое интересное. Я подробно опишу каждую строку из кода.
Здесь у нас всего одна функция, но я ее решил вынести в отдельный файл.
Нужно это или нет, но я решил создать ещё парочку файлов))
Здесь у нас вывод ошибок. Файл: system/header.php
И ноги сайта, файл system/footer.php — здесь пока пусто)
Теперь все вышеперечисленное нужно склеить!
Внимание! Все что я делал, я тестировал на OpenServer.
1. Подключение к БД
Создадим файл system/connect.php
<?php
$db = new mysqli('localhost', 'root', '', 'mini-chat') or die('Ошибка подключения к БД');
?>
2. Создание таблиц
Создадим таблицу `posts`
CREATE TABLE IF NOT EXISTS `posts` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` text NOT NULL,
`message` text NOT NULL,
`time` int(11) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ;
3. Подключение Memcached
Внимание, для использования Memcache сначала необходимо включить этот модуль в настройках: Настройки -> Модули -> Memcached
Создадим файл system/memcache.php
<?php
$memcache = new Memcache;
$memcache->connect('127.0.0.1', 11211) or dir('Ошибка соединения с Memcached');
?>
4. Форма отправки сообщения
В данном файле у нас будет форма отправки сообщения
Создадим файл system/form.php
<form method="POST">
Имя:<br />
<input type="text" name="name" placeholder="Ваше имя..." value /><br />
Сообщение:<br />
<textarea name="message" placeholder="Ваше сообщение..."></textarea><br />
<input type="submit" name="send" value="Отправить сообщение" />
</form>
5. Обработчик формы (Отправка сообщения)
Создадим файл system/query.php
<?php
if (isset($_POST['send'])) {
$name = isset($_POST['name']) ? trim($_POST['name']) : null;
$message = isset($_POST['message']) ? trim($_POST['message']) : null;
if (empty($name) or mb_strlen($name) > 24) {
$error = true;
$errors[] = 'Недопустимая длина имени!';
}
if (empty($message) or mb_strlen($message) > 5000) {
$error = true;
$errors[] = 'Недопустимая длина сообщения!';
}
if ($error == false) {
$query = $db->query('INSERT INTO `posts` (`name`, `message`, `time`) VALUES ("'.$db->real_escape_string($name).'", "'.$db->real_escape_string($message).'", "'.TIME.'")');
if ($query == true) {
echo '<h1>Сообщение отправлено!</h1>';
} else {
$error = true;
$errors[] = 'Ошибка отправки сообщения!';
}
}
}
?>
6. Вывод постов
Здесь у нас самое интересное. Я подробно опишу каждую строку из кода.
Создадим файл system/posts.php
<?php
$query = $db->query('SELECT `id` FROM `posts` ORDER BY `id` DESC'); # Запрос на выбор всех ID из таблицы
$list = $query->fetch_row();
$count = count($list); # Считаем кол-во записей
for($i = 0; $i < $count; ++$i) {
$query = 'SELECT * FROM `posts` WHERE `id` = '.$list[$i]; # Запрос на выборку всех данных из таблицы по ID
$post = $memcache->get(md5($query)); # Пытаемся найти данные в кэше
$from = 'Cache'; # Сообщения для наглядности
if (empty($post)) { # Если данных в кэше нет
$post = $db->query($query)->fetch_assoc(); # Получаем данные из БД
$memcache->add(md5($query), $post, false, 3600); # Запишем данные в кэш без компрессии на 1 час
$from = 'DB'; } # Сообщения для наглядности
echo '<div class="post">
Имя: '.$post['name'].'<br />
Сообщение: '.out_text($post['message']).'<br />
From: '.$from.'<br />
</div>';
}
# $memcache->flush() - эта функция удаляет все кэшированные данные.
?>
7. Файл с функциями
Здесь у нас всего одна функция, но я ее решил вынести в отдельный файл.
Создадим файл system/functions.php
<?php
function out_text($text) {
return nl2br(htmlspecialchars($text));
}
?>
8. Шапка и ноги сайта
Нужно это или нет, но я решил создать ещё парочку файлов))
Шапка
Здесь у нас вывод ошибок. Файл: system/header.php
<?php
if (is_array($errors) and count($errors)) {
$count_errors = count($errors);
for($i = 0; $i <= $count_errors; ++$i) {
echo $errors[$i].'<br />';
}
}
?>
И ноги сайта, файл system/footer.php — здесь пока пусто)
9. Собрать все в кучу (index.php)
Теперь все вышеперечисленное нужно склеить!
Создадим файл index.php
<?php
define('ROOT', dirname(__FILE__));
define('TIME', $_SERVER['REQUEST_TIME']);
$error = false;
$errors = array();
require(ROOT.'/system/connect.php');
require(ROOT.'/system/memcache.php');
require(ROOT.'/system/functions.php');
require(ROOT.'/system/query.php');
require(ROOT.'/system/header.php');
require(ROOT.'/system/form.php');
require(ROOT.'/system/posts.php');
require(ROOT.'/system/footer.php');
?>