- Собственная система лайков на PHP и JQuery
- HTML
- CSS
- Javascript
- PHP
- Пишем функцию лайков для постов блога
- Система «лайков» Facebook’а с помощью Jquery, MySQL и PHP
- Проектирование Базы Данных
- Таблица пользователей
- Таблица сообщений
- Таблица отметок «Нравится»
- Код HTML
- Код PHP
- Код PHP
- JavaScript
- message_like_ajax.php
- Итоговый код PHP
- db.php
Собственная система лайков на PHP и JQuery
Информация о лайках будет храниться у нас в Базе Данных MYSQL. Для начала создадим структуру таблицы.
CREATE TABLE `article` ( `id` int(11) NOT NULL auto_increment, `name` varchar(255) NOT NULL, `description` text NOT NULL, `count_like` int(11) default 0, PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 ;
И добавим в таблицу одну статью
INSERT INTO `article` (`id`, `name`, `description`, `count_like`) VALUES (1, 'Первая статья', 'Текст первой статьи!', 0);
HTML
Для начала подготовим html шаблон страницы
На странице мы будем выводить статьи из БД, поэтому нужно сначала подключится в БД и сделать выборку наших статтей:
exec("SET NAMES utf8"); /** Выбираем статьи и выводим их */ $query = $pdo->prepare("SELECT * FROM article"); $query->execute(); $articles = $query->fetchAll(PDO::FETCH_ASSOC); ?>в data-id будем хранить ID нашей статьи которую будем лайкать.
Желательно блок с подключением к БД вынести в отдельный файл и потом везде его подключать, чтобы не дублировать везде доступы к БД.
CSS
.like < cursor:pointer; width:128px; height:128px; margin:10px auto 40px; position:relative; >.like:hover.active, .like < background: url('../images/like.png') no-repeat; >.like.active, .like:hover < background: url('../images/like_active.png') no-repeat; >.like .counterСтили для нашей страницы мы вынесем в отдельный файлик
Javascript
После того как подготовили страницу и задали стили, перейдем к javascript. Наша задача будет отправить на сервер запрос с ID статьи и обратно получить количество лайков к статье. Это нужно для того чтобы обновить актуальную информацию по количеству лайков и вывести правильный результат.
Все это нужно сделать без обнволения страницы, т.е. методом Ajax. Использовать будем библиотеку JQuery.
$(document).ready(function() < $(".like").bind("click", function() < var link = $(this); var $.ajax(< url: "/like.php", type: "POST", data: , // Передаем ID нашей статьи dataType: "json", success: function(result) < if (!result.error)< //если на сервере не произойло ошибки то обновляем количество лайков на странице link.addClass('active'); // помечаем лайк как "понравившийся" $('.counter',link).html(result.count); >else < alert(result.message); >> >); >); >);PHP
Теперь осталось написать скрит для обработки запросов на сервере. Для этого создаем файлик like.php:
exec("SET NAMES utf8"); /** Получаем наш ID статьи из запроса */ $id = intval($_POST['id']); $count = 0; $message = ''; $error = true; /** Если нам передали ID то обновляем */ if($id)< /** Обновляем количество лайков в статье */ $query = $pdo->prepare("UPDATE article SET count_like = count_like+1 WHERE $query->execute(array(':id'=>$id)); /** Выбираем количество лайков в статье */ $query = $pdo->prepare("SELECT count_like FROM article WHERE $query->execute(array(':id'=>$id)); $result = $query->fetch(PDO::FETCH_ASSOC); $count = isset($result['count_like']) ? $result['count_like'] : 0; $error = false; >else < /** Если ID пуст - возвращаем ошибку */ $error = true; $message = 'Статья не найдена'; >/** Возвращаем ответ скрипту */ // Формируем масив данных для отправки $out = array( 'error' => $error, 'message' => $message, 'count' => $count, ); // Устанавливаем заголовок ответа в формате json header('Content-Type: text/json; charset=utf-8'); // Кодируем данные в формат json и отправляем echo json_encode($out);Мы в данной статье привели общее понимание как делается система лайков на PHP с использованием Ajax. Однако, для идеального скрипта его нужно еще дорабатывать и дорабатывать. Во-первых, еще нужно сделать защиту от накруток лайков, для этого нужно или записывать в cookie информацию о том, что пользователь уже лайкнул данную статью. Либо самое правильное решение позволить ставить лайки только зарегистрированным пользователям (как это делается в социальных сетях).
Если будут вопросы пишите в комментариях, буду рад помочь.
Пишем функцию лайков для постов блога
Для чего нужна функция лайков? В первую очередь, чтобы пользователи могли оценить Вашу запись, а также видеть, как её оценивают другие. Как сделать самостоятельно такой функционал - я расскажу в данном посте. Если Вам понравится данный пост - поставьте лайк! 🙂
Первым делом нам нужно создать таблицу в базе данных. Допустим, у нас сайт с базой данных MySQL. Если у Вас в проекте используется другая БД - перечень действий будет аналогичным, за исключением некоторых команд.
❶ Создаём таблицу. Назовём её likes . Если Вы используете phpMyAdmin - находясь в корне всех таблиц, ниже кнопки "Создать таблицу" вводим имя likes , количество столбцов ставим 3 , нажимаем " Вперёд ".
Первому столбцу вводим имя - id , тип - INT , Индекс - PRIMARY (во всплывающем окне нажимаем ВПЕРЁД), ставим галочку A_I (auto increment).
Второму столбцу вводим имя - client_ip , тип - VARCHAR , длина - 15 .
Третьему столбцу вводим имя - article_id , тип INT
Сравнение ставим utf8_general_ci , тип InnoDB .
Если Вы работаете с базой данных из консоли - находясь в режиме sql выполняем команду:
CREATE TABLE likes (id INT NOT NULL AUTO_INCREMENT, client_ip VARCHAR(15) NOT NULL, article_id INT NOT NULL, PRIMARY KEY (id)) ENGINE = InnoDB CHARSET=utf8 COLLATE utf8_general_ci;Далее, для оптимизации таблицы сделаем уникальными связку "IP пользователя" - "ID поста" . Это нужно для того, чтобы, если вдруг пользователь попытается проголосовать повторно за один и тот же пост, не происходило лишней записи в базу данных. Таким образом, с одного IP адреса проголосовать за один пост можно будет только один раз.
ALTER TABLE likes ADD UNIQUE INDEX (client_ip, article_id);❷ Далее создаём файл, назовём его like.php
В файле первым делом создаём подключение к базе данных:
$link = mysqli_connect('имя_хоста', 'имя_пользователя', 'пароль', 'имя_БД'); $link->set_charset('utf8'); $link->query("SET NAMES utf8 COLLATE utf8_general_ci"); ?>Если у Вас уже есть подключение к базе данных в отдельном файле, то просто подключаем этот файл через requi re_once() .
Затем в файле like.php создаём переменные и делаем запрос к БД на вставку новых данных:
$clientIp = $_POST['ip']; $article_id = $_POST['id']; $sql ; $query = mysqli_query($link, $sql); ?>❸ Затем создаём PHP функцию для подсчёта лайков:
ction quantityLikes($postID) < // функция принимает ID поста global $link; $sql ; // выбираем IP из таблицы likes с уникальными значениями $query = mysqli_query($link, $sql); $likes = mysqli_fetch_all($query, 1); return $likes; > ?>В результате вызова данной функции мы получим ассоциативный массив со значениями вида:
Array ( [0] => Array ( [client_ip] => 77.111.247.27 ) [1] => Array ( [client_ip] => 80.92.29.98 ) . )Поскольку мы передавали ID конкретного поста, то мы получаем список IP-адресов только для данного поста.
❹ При загрузке страницы нам нужно определять, голосовал ли данный пользователь ранее за данный пост. Т.е. нам нужно определить его IP-адрес и проверить, есть ли он в массиве, полученном нами выше. К сожалению, стандартная функция PHP in_array() не подходит для проверки вхождения значений в ассоциативных массивах, поэтому мы будем использовать свою функцию:
tion is_in_array($array, $key, $key_value) < $within_array = false; foreach($array as $k=>$v) < if(is_array($v)) < $within_array = is_in_array($v, $key, $key_value); if($within_array == true) < break; >> else < if($v == $key_value && $k == $key) < $within_array = true; break; > > > return $within_array; > ?>Функция возвратит нам true или false в зависимости от того, будет ли присутствовать IP-адрес пользователя в массиве адресов ранее голосовавших пользователей. Вызывать функцию будем со следующими параметрами:
is_in_array($likesArr, 'client_ip', $_SERVER['REMOTE_ADDR'])❺ Далее заходим в файл шаблона, формирующий наш пост и в верху файла пишем PHP-код:
$likesArr = quantityLikes($post['id']); // в функцию quantityLikes мы передаём ID текущего поста. В моём блоге - это $post['id']. В Вашем это будет другое значение $likes = count($likesArr); // считаем лайки с помощью подсчёта общего значения количества элементов массива ?>Далее в html-разметке вставляем:
$likesArr, 'client_ip', $_SERVER['REMOTE_ADDR'])): ?> $likes?> $likes?>
Таким образом, уже при загрузке страницы мы выводим разные иконки для новых или голосовавших ранее пользователей: для новых стандартно используется с пустым сердечком, для голосовавших - с заполненным. Также выводим в разных случаях разный title .
В data-параметрах для новых пользователей мы указали IP-адрес и ID данного поста. Эти параметры мы будем использовать в javascript-запросе к серверу при нажатии на иконку лайка.
❼ И напоследок, минимальный набор стилей:
.icon_head < height: 15px; width: 15px; cursor: pointer; >.noClick < pointer-events: none; /* делаем элемент некликабельным */ >В итоге мы имеем удобный функционал:
- считающий лайки;
- с уникальными значениями в базе данных;
- с возможностью проголосовать 1 раз только с одного IP;
- не требующий никаких авторизаций через социальные сети или сервисы;
- не требующий зависимостей и сторонних библиотек.
Подписывайтесь на группу в ВКонтакте, вступайте в сообщество на Facebook, чтобы всегда быть в курсе актуальных выпусков
W e b d e v e l o p m e n t b l o g !
Система «лайков» Facebook’а с помощью Jquery, MySQL и PHP
Система « лайков » Facebook ’а – это одна из лучших реализаций подобных систем в социальных сетях. Возможно в будущем на основе данных по « лайкам » Facebook решит запустить механизм семантического поиска. В этой статье я расскажу, как реализовать систему « Нравится»/«Не нравится »: проектирование базы данных и веб-реализация с помощью PHP и jQuery.
Проектирование Базы Данных
Чтобы построить систему сообщений, вам надо создать три таблицы: Users (Пользователи), Messages (Сообщения) и Messages_Like (Отметки « Нравится »). Следующие изображения сгенерированы, используя Mysql Workbench.
Таблица пользователей
Таблица пользователей содержит всю информацию о зарегистрированных пользователях.
CREATE TABLE `users` ( `uid` int NOT NULL PRIMARY KEY AUTO_INCREMENT , `username` varchar(25) NOT NULL UNIQUE, `password` varchar(50) NOT NULL , `email` varchar(100) NOT NULL );
Данные будут храниться в следующем виде (здесь пароли зашифрованы в формате MD5):
Таблица сообщений
Эта таблица содержит статусы пользователей. Здесь uid_fk – это внешний ключ, ссылающийся на поле users.uid.
CREATE TABLE `messages` ( `msg_id` int(11) NOT NULL PRIMARY KEY AUTO_INCREMENT, `message` varchar(200) NOT NULL, `uid_fk` int(11) NOT NULL, `like_count` int(11) DEFAULT NULL, `created` int(11) DEFAULT NULL, FOREIGN KEY (uid_fk) REFERENCES users(uid) );
Таблица отметок «Нравится»
Содержит всю информацию об отметках « Нравится » к статусам. Здесь uid_fk – внешний ключ, ссылающийся на поле users.uid , а msg_id_fk внешний ключ, ссылающийся на поле messages.msg_id
CREATE TABLE `message_like` ( `like_id` int(11) NOT NULL PRIMARY KEY AUTO_INCREMENT, `msg_id_fk` int(11), `uid_fk` int(11) NOT NULL, `created` int(11) NOT NULL, FOREIGN KEY (uid_fk) REFERENCES users(uid), FOREIGN KEY (msg_id_fk) REFERENCES messages(msg_id) );