_ne_scaju_
Всем привет форумчане.
Вопрос касающийся нравится / не нравится прям как на этом сайте, как такое реализовать сколько нужно таблиц какие связи между таблицами (если их несколько конечно)?
Писать код не нужно, объяснить для начала как это обычно делают на сайтах, по желанию показать пример таблиц БД, спасибо.
MouseZver
мои тупые 5 копеек
Таблица: data_likes
Столбцы:
- id — очевидно
- timestamp — очевидно и смысла нет.
- whose — лайки с какого контента ? forum, news, blog основа ? чьи лайки… чтоб id поста новости не сошлась с id поста форума
- id_post — айди поста к которому присуждают репутацию.
- id_user — юзер который репутацию присудил посту
- id_like — может разные лайки быть, вплоть до смайлов всяких.
- type — положительный или отрицательный
дальше идет сама система с JOIN в SQL и бла бла бла спать хочу.
_ne_scaju_
Это отдельная таблица от постов? Как по мне пункт 2, 3 и 6 не нужены!
Я же попросил как на этом форуме, пример табл., а ты мне уже в табл., пишешь различные смайлы.
MouseZver
Все… катастрофа…
Ты сам себе отсеял что нужно, а после читаю — «что за бред»Это отдельная таблица не зависимая, прием.
_ne_scaju_
Прием прием, я на связи, как слишно прием
Ок теперь можно приступить к реализации, для начала создам две таблицы:
Таблица post:PHP:
id (int) — incriment autor (vanchar) — автор поста title (vanchat) — название desc (vanchar) — описание dates (timestamp) — время добавления status (int) — 1 отображать 0 скриватьТаблица like:
PHP:
lid (int) — incriment uid (int) — id user pid (int) — id поста counts (int) — количество нравится. status (int) — 1 нравится 0 не нравится
Сойдёт такая реализация таблиц?
artoodetoo
@_ne_scaju_ ты начни, жизнь сама подскажет что работает, а что нет.
от себя подскажу, что для пары полей (кто голосовал, за что голосовал) стоит объявить уникальный индекс. и, соответственно, не может сцка быть счетчика в этой таблице, запись либо есть (кагбэ счетчик=1), либо её нет (кагбэ счетчик=0).
— Добавлено —
оффтопик: на ЭТОМ форуме нет системы нравится/не нравится. и слава богу, а то было бы как на хабре.
_ne_scaju_
Ок а вот например захочу показать количество нравится, значит это поле (counts) должно быть в постах?
artoodetoo
вот в постах можно
— Добавлено —или 1 / -1 — тогда расчёт итога будет просто как SELECT SUM(status). компренде?
_ne_scaju_
Хорошо а в случае, если все жмут дислайк, как быть, если для созданного поста начало counts 0, это два поля добавлять что ли в post таблицу?
Типа counts_like, counts_dislike
— Добавлено —Ты знаешь испанский?
artoodetoo
конечно. вот в таком применении: https://www.urbandictionary.com/define.php?term=Comprende
MouseZver
Что знает европейская часть населения о России
miketomlin
Дислайк в чистом виде превращает сайт в депрессивную помойку. Делай дислайк только для отмены лайка
_ne_scaju_
я так и сделаю)
сейчас буду делать разбирать, когда сделаю выложу сюда.
_ne_scaju_
И так я сделал систему лайков, написал на процедурном, позже переделаю на ООП и так поехали.
Создал таблицы.Код (Text):
TABLE `likes` `lid`- id `uid` — id user `pid` — id post `like_go` — like TABLE `posts` `id` — id post `uid` — id user кто создал пост `title` — название `description` — фулл описание `count_like` — количество лайков вставил записи в бд INSERT INTO `posts` (`id`, `uid`, `title`, `description`, `count_like`) VALUES (null, 1, ‘тест’, ‘Полное описание нашего товара’, 0), (null, 1, ‘название’, ‘длинное описание’, 0);Дальше на главной делаю вывод записей, подключение к БД показывать не буду:
HTML:
<body> <div class=«content»> <div class=«row»> <div class=«col-md-12»> <?php # выводим все посты $sql = $pdo->prepare(«SELECT * FROM `posts`»); $sql->execute(); $res = $sql->fetchAll(); foreach($res as $value): echo ‘название:’. $value[‘title’] .’<br>‘. ‘описание:’ .$value[‘description’]; ?> <!— data-uid=»7″ — id пользователя —> <?php endforeach; ?> </div> </div> </div> </body>Обработчик логика лайков дизлайков:
PHP:
<?php # подключаем файл для работы с базой данных include ‘db.php’; $uid = 7; # это id пользователя, пока мы в ручную делаем а так это id будем из сессии вытаскивать $count = 0; # насальное значение подсчета лайков # запрос проверяет поставил ли пользователь лайк или нет $sql = $pdo->prepare(«SELECT `like_go` FROM `likes` WHERE `uid` = ? AND `pid` = ?»); $sql->execute([$uid, $pid]); $res = $sql->fetch(); # проверяем ставил ли пользователь like if($res[‘like_go’] == 0) { $sql = $pdo->prepare(«INSERT INTO `likes` (`uid`, `pid`, `like_go`) VALUES (?,?,?)»); $sql -> execute([$uid, $pid, 1]); $sql = $pdo->prepare(«UPDATE `posts` SET `count_like` = `count_like`+1 WHERE `id` = ?»); $sql->execute([$pid]); $isActive = 1; }else{ $sql = $pdo->prepare(«DELETE FROM `likes` WHERE `pid` = ?»); $sql -> execute([$pid]); $sql = $pdo->prepare(«UPDATE `posts` SET `count_like` = `count_like`-1 WHERE `id` = ?»); $sql->execute([$pid]); $isActive = 0; } # запрос для вывода количества лайков для конкретного поста $sql = $pdo->prepare(«SELECT `count_like` FROM `posts` WHERE `id` = ?»); $sql->execute([$pid]); $res = $sql->fetch(); // Формируем массив данных для отправки json и отправляемНу и теперь js обработчик, где мы ловим json данные
Код (Javascript):
$(document).ready(function() { $(«.like»).bind(«click», function() { var link = $(this); var id = link.data(‘id’); var uid = link.data(‘uid’); $.ajax({ url: «/like.php», type: «POST», data: {id:id, uid:uid}, dataType: «json», success: function(result) { if (result.isActive){ link.addClass(‘active’); }else{ link.removeClass(‘active’); } $(‘.counter’, link).html(result.count); } }); }); });На этом все, если есть замечания по коду или ошибки пишите выслушаю, я постараюсь поправить их как нужно. Спасибо за внимание
MouseZver
Обработчик
- Notice: Undefined index: id in 5 line
- от intval смысла нет, как и с подготовленным выражением если используешь int
- 12 line а если не поставил ?
- Notice: Undefined index: like_go in 15 line
- 15 line если ошибки скрыть то null == 0 получаем true
- так же и с 36 + 37 строкой
artoodetoo
1. что такое `like_go` ?
2. есть ощущение, что ты копировал что-то существующее, но невнимательно
DELETE FROM `likes` WHERE `pid` = ?
удалит ВСЕ лайки, относящиеся к указанному посту. это и требовадось? не думаю!
miketomlin
Я о том, зачем два счетчика? Это обычный счетчик количества. Можно сделать его обновление триггерами БД на таблице лайков
_ne_scaju_
PHP:Надеюсь правильно сделал.
— Добавлено —Да то что в голову пришло так и обозвал это поле like_go
По поводу запроса, Delete
Да нужно скорее всего так:PHP:
DELETE FROM `likes` WHERE `uid` = ? AND `pid` = ?
miketomlin
У тебя спрашивают, зачем поле like_go вообще нужно. Походу его смысл понятен только тебе
_ne_scaju_
Это поле для определения лайк поставил или нет ( 1 поставил 0 нет)
Да действительно поле бессмысленно, так как я могу проверить существует ли uid пользователя для pid поста, если да делаем одни действия, иначе другие.