За последние 24 часа нас посетили 20289 программистов и 1576 роботов. Сейчас ищут 2044 программиста ...

Помогите пожалуйста со скриптом, добавления в друзья.

Тема в разделе "Сделайте за меня", создана пользователем _ne_scaju_, 17 дек 2016.

  1. _ne_scaju_

    _ne_scaju_ Старожил

    С нами с:
    25 ноя 2016
    Сообщения:
    2.149
    Симпатии:
    118
    Всем доброго времени суток, у меня появилась проблема с которой я не могу справится.
    С добавлениям от одного пользователя к другому я разобрался в базу записалось что user1 кинул заявку user2.
    Теперь нужно подтвердить дружбу, да и оповестить пользователя что ему пришла заявка в друзья, но у меня не получается почему то.
    Делаю так, один скрипт показываю он и за добавления отвечает и за подтверждения.
    PHP:
    1. <?php
    2. //Делаем запрос на добавления в друзья!
    3. $users_id = isset($_GET['idfriend']) ? (int)$_GET['idfriend'] : 0;
    4. $sql  = 'INSERT INTO `friends`
    5.        (`friend_one`,`friend_two`,`status`)
    6.         VALUES
    7.        (:friend_one, :friend_two, :status)';
    8.       $stmt = $pdo->prepare($sql);
    9.       $stmt->bindValue(':friend_one',$_SESSION['id'], PDO::PARAM_STR);
    10.       $stmt->bindValue(':friend_two', $users_id, PDO::PARAM_STR);
    11.       $stmt->bindValue(':status', 0);
    12.      if($stmt->execute())
    13.          $_SESSION['friend'] = '<div id="sendmess">Вы отправили заявку в друзья</div>';
    14.         else
    15.          $_SESSION['friend'] = '<div id="sendmess1">Ошибка отправки заявки<div>';
    16.  
    17.         header('Location:'. HOST .'?mode=message&allmess');
    18.         exit;
    19.  
    20. //Делаю запрос на подтверждения что данный пользователь ему друг или нет
    21. if (!empty($_SESSION['friend'])) {
    22.   echo $_SESSION['friend'];
    23.   unset($_SESSION['friend']);
    24. }
    25. $id = isset($_GET['accept']) ? (int)$_GET['accept'] : 0;
    26. $sql  = 'UPDATE `friends`
    27. SET `status`= 1
    28. WHERE
    29. (`friend_one`= :friend_one OR `friend_two`= :friend_one)
    30. AND
    31. (`friend_one`= :friend_two OR `friend_two`= :friend_two)';
    32.             $stmt = $pdo->prepare($sql);
    33.             $stmt->bindValue(':friend_one',$_SESSION['id'],PDO::PARAM_INT);
    34.             $stmt->bindValue(':friend_two', $id,PDO::PARAM_INT);
    35.             $stmt->execute();
    36.  
    37.  
    38. //Проверяем дружат ли пользователи или нет
    39. $sql = '
    40. SELECT `friend_one`,`friend_two`,`status`
    41. FROM `friends`
    42. WHERE
    43. (`friend_one`=:friend_one OR `friend_two`=:friend_one)
    44. AND
    45. (`friend_one`=:friend_two OR `friend_two`=:friend_two)';
    46.         $stmt = $pdo->prepare($sql);
    47.         $stmt->bindValue(':friend_one',$_SESSION['id'],PDO::PARAM_INT);
    48.         $stmt->bindValue(':friend_two', $id,PDO::PARAM_INT);
    49.         //$stmt->bindValue(':status', $id,PDO::PARAM_INT);
    50.      $stmt->execute();
    51. ?>
    Но почему то я подтвердить не могу. Может у кого есть предположения, кто либо предложит помощь, буду очень благодарен.
    Всем спасибо за внимание.
     
  2. SamyRed

    SamyRed Старожил

    С нами с:
    23 июл 2015
    Сообщения:
    1.196
    Симпатии:
    111
    Адрес:
    Украина
    Темы то зачем дублировать?
     
  3. _ne_scaju_

    _ne_scaju_ Старожил

    С нами с:
    25 ноя 2016
    Сообщения:
    2.149
    Симпатии:
    118
    Вы мне поможете? Пожалуйста.
     
    #3 _ne_scaju_, 18 дек 2016
    Последнее редактирование: 18 дек 2016
  4. SamyRed

    SamyRed Старожил

    С нами с:
    23 июл 2015
    Сообщения:
    1.196
    Симпатии:
    111
    Адрес:
    Украина
    Так у тебя нет даже проверки (Дружат ли пользователи)... То что ты сделал запрос это конечно хорошо, нуи что дальше то? Может сделаешь проверку (Как с отправкой предложения дружбы)?
     
  5. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.589
    Симпатии:
    1.763
    Я бы сделал отдельную таблицу для заявок, отдельную таблицу для друзей. В таблице для друзей все записи дублированы (если я твой друг, то и ты мой друг)
     
    denis01 нравится это.
  6. _ne_scaju_

    _ne_scaju_ Старожил

    С нами с:
    25 ноя 2016
    Сообщения:
    2.149
    Симпатии:
    118
    Как нету проверки? Есть третий запрос как раз проверяет дружат или нет. Или я не правильно сделал?
    --- Добавлено ---
    А если по подробней? Как примерно таблицы должны выглядеть? И какая с кем связь должна быть то-есть через какие ключи foregin key, primary key.
    Просто у меня получается так: таблица пользователей.
    users(id, login, email и т.д.)
    Таблица друзей
    friends(friend_id, friend_one, friend_two, status)
    И имеют связь они через foregin key(friend_one, friend_two) с таблицей users(с полем id)
    Это не правильное построение таблицы для друзей?

    Покажите свой пример как бы вы сделали? Может у вас будет правильней.
     
  7. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.589
    Симпатии:
    1.763
    Таблица для друзей нормальная, только я бы добавлял обе пары. А таблица запросов: просто user_id, user_who_requested_id
     
  8. _ne_scaju_

    _ne_scaju_ Старожил

    С нами с:
    25 ноя 2016
    Сообщения:
    2.149
    Симпатии:
    118
    А если по подробней? Как примерно таблицы должны выглядеть? И какая с чем связана то-есть через какие ключи foregin key, primary key.
    Просто у меня получается так: таблица пользователей.
    users(id, login, email и т.д.)
    Таблица друзей
    friends(friend_id, friend_one, friend_two, status)
    И имеют связь они через foregin key(friend_one, friend_two) с таблицей users(с полем id)
    Это не правильное построение таблице
    Не понял тебя, по подробней, просто расписал как то по другому)))
     
  9. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.589
    Симпатии:
    1.763
    Я вообще никогда на уровне базы ключи не ставлю - только программно. А то потом база всякие припоны создаёт
     
  10. _ne_scaju_

    _ne_scaju_ Старожил

    С нами с:
    25 ноя 2016
    Сообщения:
    2.149
    Симпатии:
    118
    О да сейчас база мне эти припоны и дает, какие то ошибки одним слово((. я так понимаю лучше программно делать ключи? чем в базе это делать?
    --- Добавлено ---
    Покажи мне пример, полный объясни что к чему в таблице у тебя) спасибо.
     
  11. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.589
    Симпатии:
    1.763
    таблица друзей - точно как у тебя, только туда всегда добавляются пары значений
    Код (Text):
    1.  
    2. |user_id|friend_id
    3. |    12     | 14
    4. |    14     |  12
    А по поводу таблицы запросов - элементарный один-к-одному
    Код (Text):
    1.  
    2. |user_id|user_who_requested_id
    3. |  12       | 27
    Здесь пользователи 12 и 14 уже друдат, а пользователь 27 только подал заявку пользователю 12.
     
  12. _ne_scaju_

    _ne_scaju_ Старожил

    С нами с:
    25 ноя 2016
    Сообщения:
    2.149
    Симпатии:
    118
    А вот тут еще объясни смысле таблицы запросов? У меня есть таблица friends и в ней поля описаны выше. А таблицы запросов у меня нет.
     
  13. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.589
    Симпатии:
    1.763
    Для меня смысл в том, что в таблицу друзей должно быть по две пары записей, а в таблице запросов только одна. Ну и не мешать разные понятия в одной таблице.
     
  14. _ne_scaju_

    _ne_scaju_ Старожил

    С нами с:
    25 ноя 2016
    Сообщения:
    2.149
    Симпатии:
    118
    Вот тут ты прав.)
     
  15. _ne_scaju_

    _ne_scaju_ Старожил

    С нами с:
    25 ноя 2016
    Сообщения:
    2.149
    Симпатии:
    118
    А вот как ты сделал запрос на добавления в друзья? и что бы юзер подтвердил или отклонил заявку?
     
  16. SamyRed

    SamyRed Старожил

    С нами с:
    23 июл 2015
    Сообщения:
    1.196
    Симпатии:
    111
    Адрес:
    Украина
    Я что-то не пойму зачем дублировать строки? Почему нельзя делать одну строку? Заодно и понятно кто кого пригласил
     
  17. _ne_scaju_

    _ne_scaju_ Старожил

    С нами с:
    25 ноя 2016
    Сообщения:
    2.149
    Симпатии:
    118
    Так будет удобней потом просматривать кто кому друг)
     
  18. SamyRed

    SamyRed Старожил

    С нами с:
    23 июл 2015
    Сообщения:
    1.196
    Симпатии:
    111
    Адрес:
    Украина
    А если написать "friend_one" => "Тот кто пригласил", "friend_two" => "кого пригласили" - не понятно кто кому друг что-ли?
     
  19. _ne_scaju_

    _ne_scaju_ Старожил

    С нами с:
    25 ноя 2016
    Сообщения:
    2.149
    Симпатии:
    118
    Не получается подтвердить дружбу.
     
    #19 _ne_scaju_, 18 дек 2016
    Последнее редактирование: 18 дек 2016
  20. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.589
    Симпатии:
    1.763
    Друзья обычно взаимные. Чтобы при выборке друзей, в моём примере, пользователя 12, отдавался пользователь 14, и наоборот, при максимально простом запросе. Иначе придётся какие-то извращённые запросы писать с or.
     
  21. SamyRed

    SamyRed Старожил

    С нами с:
    23 июл 2015
    Сообщения:
    1.196
    Симпатии:
    111
    Адрес:
    Украина
    Это конечно кто как привык, и кому как удобно, но, как по мне, лучше сделать "извращённый запрос", чем забивать базу одинаковыми записями
    --- Добавлено ---
    (Запрос будет потреблять столько же ресурсов как и простой, а память базы хоть и достаточно большая и ограниченная, и если при 10-ти пользователях будет 20 записей, то при 1 000 - 2 000, что совсем не прикольно)
     
  22. mahmuzar

    mahmuzar Старожил

    С нами с:
    6 апр 2012
    Сообщения:
    4.631
    Симпатии:
    425
    Адрес:
    РД, г. Махачкала.
    @SamyRed, база на то чтобы ее забивать)).
    @_ne_scaju_, вот в этой книжке в качестве примера используется создание сайта соц сети, там насколько я помню, рассматривается вопрос добавления в друзья и подтверждения(если конечно память мне не изменяет).
     
    artoodetoo нравится это.
  23. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.589
    Симпатии:
    1.763
    Одна запись такой таблицы занимает отсилы пару десятков байт, и будет в ней 20 Кбайт или 40Кбайт (для 1000) и даже 20 Мбайт или 40 Мбайт (для миллиона) большой погоды делать не будет на современных серверах.
     
  24. _ne_scaju_

    _ne_scaju_ Старожил

    С нами с:
    25 ноя 2016
    Сообщения:
    2.149
    Симпатии:
    118
    Спасибо посмотреть надо будет в книгу, хотя у меня уже получилось, с чужой помощью подтвердить что пользователи являются друзьями.
    --- Добавлено ---
    Народ с добавлениям и подтверждение справился, а как теперь удалить пользователя из друзей?
     
  25. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    11.119
    Симпатии:
    1.245
    Адрес:
    там-сям
    а свои мысли есть на этот счёт?