
В данной статье мы разработаем собственную систему лайков на PHP и использованием Ajax. Что такое лайки я думаю вам не стоит обьяснять с таким изобилием социальных сетей в наши дни :)
MYSQL
Информация о лайках будет храниться у нас в Базе Данных 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 шаблон страницы
На странице мы будем выводить статьи из БД, поэтому нужно сначала подключится в БД и сделать выборку наших статтей:
<?php
/** Данные для подключения к Базе Данных */
$host = 'localhost';
$database = 'test';
$user = 'root';
$password = '';
/** Подключаемся в Базе Данных */
$pdo = new PDO('mysql:host='. $host .';dbname='.$database.';charset=utf8', $user, $password);
$pdo->exec("SET NAMES utf8");
/** Выбираем статьи и выводим их */
$query = $pdo->prepare("SELECT * FROM article");
$query->execute();
$articles = $query->fetchAll(PDO::FETCH_ASSOC);
?>
<?php if($articles):?>
<?php foreach($articles as $article): ?>
<div class="like" data-id="<?php print $article['id']?>"><span class="counter"><?php print $article['count_like'] ?></span></div>
<?php endforeach; ?>
<?php endif; ?
в 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{
border: 5px solid #333333;
bottom: -37px;
color: #333333;
font-size: 31px;
left: 27px;
position: absolute;
text-align: center;
width: 64px;
}
Стили для нашей страницы мы вынесем в отдельный файлик
Javascript
После того как подготовили страницу и задали стили, перейдем к javascript. Наша задача будет отправить на сервер запрос с ID статьи и обратно получить количество лайков к статье. Это нужно для того чтобы обновить актуальную информацию по количеству лайков и вывести правильный результат.
Все это нужно сделать без обнволения страницы, т.е. методом Ajax. Использовать будем библиотеку JQuery.
$(document).ready(function() {
$(".like").bind("click", function() {
var link = $(this);
var id = link.data('id');
$.ajax({
url: "/like.php",
type: "POST",
data: {id:id}, // Передаем ID нашей статьи
dataType: "json",
success: function(result) {
if (!result.error){ //если на сервере не произойло ошибки то обновляем количество лайков на странице
link.addClass('active'); // помечаем лайк как "понравившийся"
$('.counter',link).html(result.count);
}else{
alert(result.message);
}
}
});
});
});
PHP
Теперь осталось написать скрит для обработки запросов на сервере. Для этого создаем файлик like.php:
<?php
/** Данные для подключения к Базе Данных */
$host = 'localhost';
$database = 'test';
$user = 'root';
$password = '';
/** Подключаемся в Базе Данных */
$pdo = new PDO('mysql:host='. $host .';dbname='.$database.';charset=utf8', $user, $password);
$pdo->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 id = :id");
$query->execute(array(':id'=>$id));
/** Выбираем количество лайков в статье */
$query = $pdo->prepare("SELECT count_like FROM article WHERE id = :id");
$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 информацию о том, что пользователь уже лайкнул данную статью. Либо самое правильное решение позволить ставить лайки только зарегистрированным пользователям (как это делается в социальных сетях).
Если будут вопросы пишите в комментариях, буду рад помочь.
Frameworks.su Шпаргалка вебмастера
Отлично работает, спасибо
Сделал всё работает только как сделать чтобы с 1 усройства можно было поставить 1 лайк
"В ближайшее время постараюсь расписать эти 3 пункта по подробнее с примерами."
Администратор уже второй год пошел, для Вас ближайшее время это когда?
Сколько вешать в граммах?
Было бы здорово если бы Вы все-таки выполнили свое обещание, пожалуйста)
Если конкретно интересует вариант № 3
скачал ваш пример,сделал как указанно в статье,не работает...
Что конкретно у вас не работало? Ошибки какие то были?
Проверьте, может вы указали неверные доступы к БД.
Согласен оно не работает херня полная
Здравствуйте, вы писали что может реализуете лайки с авторизацией с примерами, если вы это сделали, где можно найти?
при клике на картинку,лайк не прибавляется,показывает 0.
доступы к бд верные
Админ, очень хотелось бы увидеть эти 3 способа
Думаю в ближайшее время найду свободную минутку и напишу статью о них )
У вас оибка в исходниках в Index.php, вы зачем -то делаете выход из папки
<link href="/css/style.css" rel="stylesheet">
(знак "/" - первыйне нужен)
<link href="css/style.css" rel="stylesheet"> - вот так работает, это же относится и к другим путям)))
А так статья хорошая спасибо!))))
Это верно если из папки запускать, если же все это делается на http сервере нужно указывать адрес от корня сайта.
Т.к. например если у вас будет такого вида url http://site.ru/article/ , то css будет пытаться подгрузиться из такой директории http://site.ru/article/css/style.css - естественно это будет ошибкой
Не везде и не всегда, на хостинге у меня уже нужно прописывать локально а не отталкиваться от корня сайта.
Все работает, пытаюсь сделать так, чтобы можно было удалять лайки еще, а не только ставить, ничего не выходит. Как бы получается что-то, то коряво работает очень
При перезагрузке страницы поле колличества лайков равно нулю!
Как исправить, но при первом же клике выводится число из БД...
Александр, нужно в файле index.html подключится к БД и выбрать статьи из таблицы articles, и потом вывести их и количество лайков к каждой статье.
Как это будет работать можете посмотреть в обновленном примере или посмотреть в статье (обновил описание)
Спасибо огромное!
Сейчас буду пробовать.
Привет! Отличная статья, но без записи cookies - не имеет смысла. Как прикрутить защиту от накрутки?
1. Самый лучший способ защититься от накрутки - сделать авторизацию на сайте и разрешить ставить лайки только зарегистрированным пользователям, при этом сохранять в БД (user_id и article_id) чтобы знать какой пользователь какую статью лайкнул. Таким способом врядли можно сделать накрутку лайков, разве что кто-то зарегистрирует много аккаунтов-ботов.
2. Второй способ сохранять IP пользователя который лайкнул статью (user_ip и article_id), но тогда не все пользователи смогут поставить лайк, например из-за динамического IP. Накрутить лайки в таком случае будет не трудно, нужно просто изменить IP (например подключить прокси)
3. Третий вариант - это записывать в куки браузера что этот пользователь уже поставил лайк. Самый легкий способ накрутить лайки - просто очистить куки )
В ближайшее время постараюсь расписать эти 3 пункта по подробнее с примерами.