За последние 24 часа нас посетили 34240 программистов и 1717 роботов. Сейчас ищут 786 программистов ...

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

Тема в разделе "PHP для новичков", создана пользователем _ne_scaju_, 4 янв 2021.

  1. Вероломство

    Вероломство Активный пользователь

    С нами с:
    19 июн 2017
    Сообщения:
    626
    Симпатии:
    24
    это делается одним столбцом с начальным значением - 0 и двумя кнопками [+][-], нажатие одной делает значению этого столбца инкремент, второй - декремент, всё :)
     
  2. MouseZver

    MouseZver Суперстар

    С нами с:
    1 апр 2013
    Сообщения:
    7.816
    Симпатии:
    1.333
    Адрес:
    Лень
    Notice: Undefined index: 0 in 2 line :D
     
  3. miketomlin

    miketomlin Старожил

    С нами с:
    9 авг 2016
    Сообщения:
    3.860
    Симпатии:
    657
    @Вероломство, ну все с вами понятно: не читатель :) ТС хотел, как на этом форуме, т.е. ему нужны имена/ники проставивших лайки (всех или по крайней мере нескольких человек, чтобы можно было дописать «и еще N человек»).
    --- Добавлено ---
    Лайки выбираешь с небольшим лимитом, например 5, а потом по положительной разнице значения счетчика и кол-ва выбранных лайков дописываешь к списку выбранных «и еще N человек».
     
  4. Вероломство

    Вероломство Активный пользователь

    С нами с:
    19 июн 2017
    Сообщения:
    626
    Симпатии:
    24
    То есть я сейчас напишу вопрос: Как мне написать такой-то сайт один в один и ты мне ответишь? Я в комментарии дал правильный ответ, видимо забыл json указать :)
    --- Добавлено ---
    И где мы тут видим что я ИМЕННО уже лайкнул какой-то пост?
     
  5. _ne_scaju_

    _ne_scaju_ Старожил

    С нами с:
    25 ноя 2016
    Сообщения:
    2.149
    Симпатии:
    118
    Нет я так как на форуме не хочу, принцип такой хотел, без имён кто подставил лайк, просто подсчет количества лайков и все, но при этом можно лайкнуть если понравилось, если разнравилось отлайкнуть. Я написал выше код, который делает в принципе то что мне нужно, теперь с помощью вашей и форумчан буду поправлять скрипты.
     
  6. miketomlin

    miketomlin Старожил

    С нами с:
    9 авг 2016
    Сообщения:
    3.860
    Симпатии:
    657
    Если даже не увидим, алгоритм не позволит поставить одному человеку несколько лайков одному посту. В вашем варианте один чел может накликивать одному посту столько лайков, сколько захочет :)
    --- Добавлено ---
    В любом случае нужна таблица лайков, чтобы контролировать «накликивание», о чем я выше написал.
     
  7. _ne_scaju_

    _ne_scaju_ Старожил

    С нами с:
    25 ноя 2016
    Сообщения:
    2.149
    Симпатии:
    118
    Думаю такое мне не пойдет, должно быть для всех постов ставится лайк, если юзер поставил лайк, я в базу заношу данные uid, pid чтобы в последующий раз он мог только отлайкнуть при этом запись из бд удалится.
    --- Добавлено ---
    Да что такое, сейчас гляну. Ок под рукой нет инструмента, буду лишь догадываться, или аж вечером отпишусь если получится обойти эту ошибку.
     
  8. MouseZver

    MouseZver Суперстар

    С нами с:
    1 апр 2013
    Сообщения:
    7.816
    Симпатии:
    1.333
    Адрес:
    Лень
    Подскажу: перед употреблением данных, воспользуйся $pdo -> rowCount() в инете почитай про него
     
  9. Dimon2x

    Dimon2x Старожил

    С нами с:
    26 фев 2012
    Сообщения:
    2.211
    Симпатии:
    186
    то же самое, что и закладки
     
  10. _ne_scaju_

    _ne_scaju_ Старожил

    С нами с:
    25 ноя 2016
    Сообщения:
    2.149
    Симпатии:
    118
    почитал, там написано что в некоторых субд работает не корректно)
    может еще есть обход?)
     
  11. miketomlin

    miketomlin Старожил

    С нами с:
    9 авг 2016
    Сообщения:
    3.860
    Симпатии:
    657
    В доках написано, что может некорректно работать на SELECT'е. Т.е. это скорее аналог $affected_rows, чем $num_rows в нативном расширении для мускула ;)
    --- Добавлено ---
    P.S. Я тебе выше написал, что в обработчике SELECT на таблице лайков вообще не нужен.
     
  12. _ne_scaju_

    _ne_scaju_ Старожил

    С нами с:
    25 ноя 2016
    Сообщения:
    2.149
    Симпатии:
    118
    ок понял, тогда что делать с запросом, убрал его, а как же проверка на что мне нужно проверять чтобы вставить запись?
    Проверку перед вставкой нужно делать?
     
  13. _ne_scaju_

    _ne_scaju_ Старожил

    С нами с:
    25 ноя 2016
    Сообщения:
    2.149
    Симпатии:
    118
    групповым это типа
    GROUP BY `uid`, `pid` ?
    или
    UNIQUE KEY d (`uid`, `pid`)
     
    #38 _ne_scaju_, 8 янв 2021
    Последнее редактирование: 8 янв 2021
  14. miketomlin

    miketomlin Старожил

    С нами с:
    9 авг 2016
    Сообщения:
    3.860
    Симпатии:
    657
    Естественно, второе.

    Первое – это группировка записей в запросе.
    --- Добавлено ---
    После вставки. Я же написал, что нужно отлавливать ошибку дублирующего ключа. Если произошла именно такая ошибка при вставке, то делаете дислайк (удаление записи из таблицы лайков).
     
  15. _ne_scaju_

    _ne_scaju_ Старожил

    С нами с:
    25 ноя 2016
    Сообщения:
    2.149
    Симпатии:
    118
    PHP:
    1. CREATE TABLE `likes` (
    2.   `id_user` int(11) NOT NULL COMMENT 'id пользователя',
    3.   `id_post` int(11) NOT NULL COMMENT 'id поста'
    4. ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
    5. --
    6. -- Индексы таблицы `likes`
    7. --
    8. ALTER TABLE `likes`
    9.   ADD UNIQUE KEY `id_user_id_post` (`id_user`,`id_post`) USING BTREE;
    10. COMMIT;
    Обработчик лайков
    PHP:
    1. <?php
    2. # подключаем файл для работы с базой данных
    3. include 'db.php';
    4.  
    5. $uid = 2; # это id пользователя, пока мы в ручную делаем а так это id будем из сессии вытаскивать
    6. $count = 0; # начальное значение подсчета лайков
    7.  
    8.  
    9. # проверяем какой метод используется на веб странице
    10. if ($_SERVER['REQUEST_METHOD'] == 'POST') {
    11.  
    12.   # массив данных, для проверки полей
    13.   $rulles = [
    14.     'id' => FILTER_DEFAULT,
    15.   ];
    16.   # фильтруем данные при необходимости
    17.   $filter = filter_input_array(INPUT_POST, $rulles);
    18.  
    19.   $sql = $pdo->prepare("INSERT INTO `likes` (`id_user`, `id_post`) VALUES (?,?)");
    20.  
    21.   # если запрос вернул true обновляем количество лайков
    22.   if ($sql -> execute([$uid, $filter['id']]))
    23.   {
    24.     $post = $pdo->prepare("UPDATE `posts` SET `count_like` = `count_like`+1  WHERE `id` = ?");
    25.     $post->execute([$filter['id']]);
    26.  
    27.     $isActive = 1;
    28.   }else{
    29.     $sql = $pdo->prepare("DELETE FROM `likes` WHERE `id_user` = ? AND `id_post` = ?");
    30.     $sql -> execute([$uid, $filter['id']]);
    31.  
    32.     $post = $pdo->prepare("UPDATE `posts` SET `count_like` = `count_like`-1  WHERE `id` = ?");
    33.     $post->execute([$filter['id']]);
    34.  
    35.     $isActive = 0;
    36.   }
    37.  
    38.   # запрос для вывода количества лайков для конкретного поста
    39.   $post = $pdo->prepare("SELECT `count_like` FROM `posts` WHERE `id` = ?");
    40.   $post->execute([$filter['id']]);
    41.   $res = $post->fetch();
    42.  
    43.   $count = isset($res['count_like']) ? $res['count_like'] : 0;
    44.  
    45.   # формируем массив данных для отправки json
    46.   exit(json_encode(['count' => $count, 'isActive' => $isActive], JSON_UNESCAPED_UNICODE));
    47. }
    Прошу прокоментировать, спасибо.
    если все гуд, перейду на ООП.
     
    #40 _ne_scaju_, 8 янв 2021
    Последнее редактирование: 8 янв 2021
  16. _ne_scaju_

    _ne_scaju_ Старожил

    С нами с:
    25 ноя 2016
    Сообщения:
    2.149
    Симпатии:
    118
    Еще протестировал и добавил запрос на проверку поста, перед insertom делаю проверку и уже после этого делаю вставку, ибо могут подменить id поста в форме, и в базу добавится не существующий пост.
    PHP:
    1.   # запрос для проверки существования поста по записи id
    2.   $post = $pdo->prepare("SELECT `id` FROM `posts` WHERE `id` = ?");
    3.   $post->execute([$filter['id']]);
    4.   $res = $post->fetch();
    5.   if ($res['id'] == 0)
    6.   {
    7.     header('location: /');
    8.     exit('досвидос');
    9.   }
     
  17. MouseZver

    MouseZver Суперстар

    С нами с:
    1 апр 2013
    Сообщения:
    7.816
    Симпатии:
    1.333
    Адрес:
    Лень
    ты так и ничему не научился
     
  18. _ne_scaju_

    _ne_scaju_ Старожил

    С нами с:
    25 ноя 2016
    Сообщения:
    2.149
    Симпатии:
    118
    не ну rowCount() хорошо использовать когда upd, ins, del а не когда sel
    покажи как правильно, тогда научусь)
     
  19. MouseZver

    MouseZver Суперстар

    С нами с:
    1 апр 2013
    Сообщения:
    7.816
    Симпатии:
    1.333
    Адрес:
    Лень
    Просто вопрос: Чёё ?
     
  20. _ne_scaju_

    _ne_scaju_ Старожил

    С нами с:
    25 ноя 2016
    Сообщения:
    2.149
    Симпатии:
    118
    так мануал подсказывает.
     
  21. miketomlin

    miketomlin Старожил

    С нами с:
    9 авг 2016
    Сообщения:
    3.860
    Симпатии:
    657
    Первичный ключ всегда указывайте явно. Раз вы отказались от поля lid, сделайте uid/pid первичным ключом. Первичный ключ – юник по определению.

    И что не понятно в словах, что нужно отлавливать именно ошибку дублирующегося ключа?

    https://stackoverflow.com/questions/10774943/check-for-duplicate-entry-vs-use-pdo-errorinfo-result

    Возможно, в PDO можно использовать собственные коды ошибок, чтобы не привязываться к конкретной СУБД. У меня в распоряжении только код, в котором используются нативные расширения.
    --- Добавлено ---
    В смысле другие ошибки вы оформляете, как ошибки, а при ошибке дублирующегося ключа пытаетесь выполнить удаление.
    --- Добавлено ---
    Он все верно написал. В доках так написано.
     
    _ne_scaju_ нравится это.
  22. _ne_scaju_

    _ne_scaju_ Старожил

    С нами с:
    25 ноя 2016
    Сообщения:
    2.149
    Симпатии:
    118
    я показал таблицу правильно сделать с юником? если что то не так тыкну в муАдмин для uid/pid первичный ключи
    разве мы не так договорились, удалить запись, если возникла ошибка (дублирования ключей)?
     
  23. MouseZver

    MouseZver Суперстар

    С нами с:
    1 апр 2013
    Сообщения:
    7.816
    Симпатии:
    1.333
    Адрес:
    Лень
    Да там все так и написано, если еще поковыряться в носу для счастья и ничего не выяснить что мы используем.
    2021-01-09_00-43-53.png
     
  24. Вероломство

    Вероломство Активный пользователь

    С нами с:
    19 июн 2017
    Сообщения:
    626
    Симпатии:
    24
    ты подстраховался плейсхолдером в запросе, но в execute данные массива передаются строками :) надо тогда уже биндить айдишник к int или проверить его на int перед вбросом в массив для execute :)

    может это и шиза, но аккуратность

    и ещё через execute ты не сможешь делать пагинацию - limit ?, ?, так как строки не будут обработаны для limit, лимиту в запросе стопудово нужны int, надо в любом случае биндить к int либо отключать эмуляцию, но в этом случае все значения должны иметь свой плейсхолдер, при отключении эмуляции PDO будет сама всё биндить, но один именованный плейсхолдер нельзя будет несколько раз использовать в запросе - я так делаю, потому то у меня нет повторов заранее, нет заморочек тупо вот с той же пагинацией
     
    #49 Вероломство, 9 янв 2021
    Последнее редактирование: 9 янв 2021
  25. miketomlin

    miketomlin Старожил

    С нами с:
    9 авг 2016
    Сообщения:
    3.860
    Симпатии:
    657
    Ты на произвольную ошибку пытаешься удалять. А вдруг эта ошибка не является ошибкой дублирующегося ключа. Все ответы по ссылке просмотри. Там разные способы обработки ошибок показаны, в том числе и при помощи исключений.
    --- Добавлено ---
    PDO вы используете прежде всего для универсальности. Вон я выше писал ТСу по поводу собственных кодов ошибок PDO, чтобы не привязываться к мускулу.