Реализация нравится / не нравится

_ne_scaju_

Всем привет форумчане.
Вопрос касающийся нравится / не нравится прям как на этом сайте, как такое реализовать сколько нужно таблиц какие связи между таблицами (если их несколько конечно)?
Писать код не нужно, объяснить для начала как это обычно делают на сайтах, по желанию показать пример таблиц БД, спасибо.

 

MouseZver

мои тупые 5 копеек

Таблица: data_likes

Столбцы:

  1. id — очевидно
  2. timestamp — очевидно и смысла нет.
  3. whose — лайки с какого контента ? forum, news, blog основа ? чьи лайки… чтоб id поста новости не сошлась с id поста форума
  4. id_post — айди поста к которому присуждают репутацию.
  5. id_user — юзер который репутацию присудил посту
  6. id_like — может разные лайки быть, вплоть до смайлов всяких.
  7. type — положительный или отрицательный

дальше идет сама система с JOIN в SQL и бла бла бла спать хочу.

 

_ne_scaju_

Это отдельная таблица от постов? Как по мне пункт 2, 3 и 6 не нужены!
Я же попросил как на этом форуме, пример табл., а ты мне уже в табл., пишешь различные смайлы.

 

MouseZver

Все… катастрофа…
Ты сам себе отсеял что нужно, а после читаю — «что за бред» o_O

Это отдельная таблица не зависимая, прием.

 

_ne_scaju_

Прием прием, я на связи, как слишно прием :D
Ок теперь можно приступить к реализации, для начала создам две таблицы:
Таблица post:

PHP:
  1. id (int) incriment
  2. autor (vanchar) автор поста
  3. title (vanchat) название
  4. desc (vanchar) описание
  5. dates (timestamp) время добавления
  6. status (int) 1 отображать 0 скривать

Таблица like:

PHP:
  1. lid (int) incriment
  2. uid (int) id user
  3. pid (int) id поста
  4. counts (int) количество нравится.
  5. 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

MouseZver

Что знает европейская часть населения о России
2021-01-05_16-47-32.png

 

miketomlin

Дислайк в чистом виде превращает сайт в депрессивную помойку. Делай дислайк только для отмены лайка ;)

 

_ne_scaju_

я так и сделаю)
сейчас буду делать разбирать, когда сделаю выложу сюда.

 

_ne_scaju_

И так я сделал систему лайков, написал на процедурном, позже переделаю на ООП и так поехали.
Создал таблицы.

Код (Text):
  1.  
  2. TABLE `likes`
  3.   `lid`- id
  4.   `uid` — id user
  5.   `pid` — id post
  6.   `like_go` — like
  7.  
  8. TABLE `posts`
  9.   `id` — id post
  10.   `uid` — id user кто создал пост
  11.   `title` — название
  12.   `description` — фулл описание
  13.   `count_like` — количество лайков
  14.  
  15. вставил записи в бд
  16. INSERT INTO `posts` (`id`, `uid`, `title`, `description`, `count_like`) VALUES
  17. (null, 1, ‘тест’, ‘Полное описание нашего товара’, 0),
  18. (null, 1, ‘название’, ‘длинное описание’, 0);

Дальше на главной делаю вывод записей, подключение к БД показывать не буду:

HTML:
  1.     <div class=«content»>
  2.         <div class=«row»>
  3.             <div class=«col-md-12»>
  4.         <?php
  5.            # выводим все посты
  6.             $sql = $pdo->prepare(«SELECT * FROM `posts`»);
  7.             $sql->execute();
  8.             $res = $sql->fetchAll();
  9.  
  10.             foreach($res as $value):
  11.               echo ‘название:’. $value[‘title’] .’<br>‘. ‘описание:’ .$value[‘description’]; ?>
  12.               <!— data-uid=»7″ — id пользователя —>
  13.               <div class=«like» data-id=«<?=$value[‘id’]; ?>» data-uid=»7″><span class=«counter»><?=$value[‘count_like’]; ?></span></div>
  14.         <?php endforeach; ?>
  15.             </div>
  16.         </div>
  17.     </div>
  18.     <script src=«http://code.jquery.com/jquery-latest.min.js» type=«text/javascript»></script>
  19.     <script src=«/js/like.js» type=«text/javascript»></script>
  20. </body>

Обработчик логика лайков дизлайков:

PHP:
  1. <?php
  2. # подключаем файл для работы с базой данных
  3. include ‘db.php’;
  4.  
  5. $pid = intval($_POST[‘id’]); # ID поста из запроса
  6. $uid = 7; # это id пользователя, пока мы в ручную делаем а так это id будем из сессии вытаскивать
  7. $count = 0; # насальное значение подсчета лайков
  8.  
  9. # запрос проверяет поставил ли пользователь лайк или нет
  10. $sql = $pdo->prepare(«SELECT `like_go` FROM `likes` WHERE `uid` = ? AND `pid` = ?»);
  11. $sql->execute([$uid, $pid]);
  12. $res = $sql->fetch();
  13.  
  14. # проверяем ставил ли пользователь like
  15. if($res[‘like_go’] == 0) {
  16.     $sql = $pdo->prepare(«INSERT INTO `likes` (`uid`, `pid`, `like_go`) VALUES (?,?,?)»);
  17.     $sql -> execute([$uid, $pid, 1]);
  18.  
  19.     $sql = $pdo->prepare(«UPDATE `posts` SET `count_like` = `count_like`+1  WHERE `id` = ?»);
  20.     $sql->execute([$pid]);
  21.  
  22.     $isActive = 1;
  23. }else{
  24.     $sql = $pdo->prepare(«DELETE FROM `likes` WHERE `pid` = ?»);
  25.     $sql -> execute([$pid]);
  26.  
  27.     $sql = $pdo->prepare(«UPDATE `posts` SET `count_like` = `count_like`-1  WHERE `id` = ?»);
  28.     $sql->execute([$pid]);
  29.  
  30.     $isActive = 0;
  31. }
  32.  
  33. # запрос для вывода количества лайков для конкретного поста
  34. $sql = $pdo->prepare(«SELECT `count_like` FROM `posts` WHERE `id` = ?»);
  35. $sql->execute([$pid]);
  36. $res = $sql->fetch();
  37. $count = isset($res[‘count_like’]) ? $res[‘count_like’] : 0;
  38.  
  39. // Формируем массив данных для отправки json и отправляем
  40. exit(json_encode([‘count’ => $count, ‘isActive’ => $isActive], JSON_UNESCAPED_UNICODE));

Ну и теперь js обработчик, где мы ловим json данные

Код (Javascript):
  1. $(document).ready(function() {
  2.     $(«.like»).bind(«click», function() {
  3.         var link = $(this);
  4.         var id = link.data(‘id’);
  5.         var uid = link.data(‘uid’);
  6.         $.ajax({
  7.             url: «/like.php»,
  8.             type: «POST»,
  9.             data: {id:id, uid:uid},
  10.             dataType: «json»,
  11.             success: function(result) {
  12.                 if (result.isActive){
  13.                     link.addClass(‘active’);
  14.                 }else{
  15.                     link.removeClass(‘active’);
  16.                 }
  17.                 $(‘.counter’, link).html(result.count);
  18.             }
  19.         });
  20.     });
  21. });

На этом все, если есть замечания по коду или ошибки пишите выслушаю, я постараюсь поправить их как нужно. Спасибо за внимание ;)

 

MouseZver

[​IMG]

Обработчик

  1. Notice: Undefined index: id in 5 line
  2. от intval смысла нет, как и с подготовленным выражением если используешь int
  3. 12 line а если не поставил ?
  4. Notice: Undefined index: like_go in 15 line
  5. 15 line если ошибки скрыть то null == 0 получаем true :D
  6. так же и с 36 + 37 строкой :D
 

artoodetoo

1. что такое `like_go` ?

2. есть ощущение, что ты копировал что-то существующее, но невнимательно :)
DELETE FROM `likes` WHERE `pid` = ?
удалит ВСЕ лайки, относящиеся к указанному посту. это и требовадось? не думаю!

 

miketomlin

Я о том, зачем два счетчика? Это обычный счетчик количества. Можно сделать его обновление триггерами БД на таблице лайков ;)

 

_ne_scaju_

PHP:
  1. $res = $sql -> fetch();
  2. if (!is_null($res[0]))
  3. {
  4.   if(isset($res[‘like_go’]))
  5.   {
  6.      $sql = $pdo ->prepare ();
  7.      #….
  8.   }else{
  9.      $sql = $pdo ->prepare ();
  10.      #….
  11.  }
  12. }
  13. $sql = $pdo ->prepare ();
  14. $res = $sql -> fetch();
  15. if (!is_null($res[0]))
  16. {
  17.   $count = …;
  18. }

Надеюсь правильно сделал.
— Добавлено —

Да то что в голову пришло так и обозвал это поле like_go :D
По поводу запроса, Delete
Да нужно скорее всего так:

PHP:
  1. DELETE FROM `likes` WHERE `uid` = ? AND `pid` = ?
 

miketomlin

У тебя спрашивают, зачем поле like_go вообще нужно. Походу его смысл понятен только тебе :)

 

_ne_scaju_

Это поле для определения лайк поставил или нет ( 1 поставил 0 нет)
Да действительно поле бессмысленно, так как я могу проверить существует ли uid пользователя для pid поста, если да делаем одни действия, иначе другие.

 

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *