За последние 24 часа нас посетили 22448 программистов и 1016 роботов. Сейчас ищут 687 программистов ...

Система друзей и ее реализация php mysql

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

  1. _ne_scaju_

    _ne_scaju_ Старожил

    С нами с:
    25 ноя 2016
    Сообщения:
    2.149
    Симпатии:
    118
    Всем привет, кто может мне помочь с реализацией система друзей на сайте?
    Вообще у меня есть наработка, но я думаю что она не правильная, у меня одна таблица
    requests:
    id, sender_id, reseiver_id, status
    и таблица users
    users_id, login, email и т.д.

    Кто может предложить свой вариант

    Буду рад вашей помощи. И с базой помочь разобраться сколько таблиц и сколько полей надо.
     
  2. MouseZver

    MouseZver Суперстар

    С нами с:
    1 апр 2013
    Сообщения:
    7.745
    Симпатии:
    1.319
    Адрес:
    Лень
    Что я сейчас прочел?
    - Человек создал две таблицы, не зная для чего судя по фразе "помочь разобраться сколько таблиц и сколько полей надо".
    А с какой целью он сюда пришел?
    - Потроллить (с)

    What ?!! :eek:
    - ну лан, проехали...

    Разве есть варианты ?
    - какие варианты ??? тут кодить надо !
    Так у него:
    - ага, по созданию двух таблиц, круто (с)
    А вдруг у него код ?
    - Так я не вижу этот реализованный код...

    А с какой целью он сюда пришел?
    - Потроллить (с)
    - ой нет, сделать за него.
     
    TheHate нравится это.
  3. abrdabr

    abrdabr Новичок

    С нами с:
    28 янв 2017
    Сообщения:
    774
    Симпатии:
    65
    @_ne_scaju_ id и sender_id поменять местами и join наверно поможет. или тупо объеденить таблицы где ид и имена друзей в отдельной ячейке и птом парсить.. но джоин для большого ква друзей получше будет
     
  4. _ne_scaju_

    _ne_scaju_ Старожил

    С нами с:
    25 ноя 2016
    Сообщения:
    2.149
    Симпатии:
    118
    @MouseZver
    @abrdabr
    requests:
    PHP:
    1. id, sender_id, reseiver_id, status
    users:
    PHP:
    1. user_id, login, email, pass
    :
    Тут все понятно что за что отвечает.
    Теперь все по порядку скрипты:
    У пользователя на странице я вывожу ссылку на добавления в друзья:
    PHP:
    1. echo '<a href="?mode=add_friend&add_friend='. $val['user_id'] .'">Добавить в друзья</a>';
    Далее жму на нее и кидаю запрос другому пользователю:
    PHP:
    1. <?php
    2. $sql  = 'INSERT INTO
    3.   `requests`(`tender_id`, `sender_id`, `receiver_id`, `status`)
    4.       VALUES(
    5.   :tender_id, :sender_id, :receiver_id, 0)';
    6. $stmt = $pdo->prepare($sql);
    7. $stmt->bindParam(':tender_id', $tender_id);
    8. $stmt->bindParam(':sender_id', $sender_id);
    9. $stmt->bindParam(':receiver_id', $receiver_id);
    10. $tender_id = 1;
    11. $sender_id = (int)$_SESSION['user_id'];
    12. $receiver_id = (int)$_GET['add_friend'];
    13. if($stmt->execute())
    14. $_SESSION['messFriend'] = 'Вы подали заявку в друзья<br>';
    15. else
    16. $_SESSION['messFriend'] = 'Ошибка отправка заявки';
    17. header('location:'.HOST.'?mode=friends ');
    18. ?>
    Далее тот пользователь которому отправили заявку смотрит у себя кто у него есть в друзьях:
    PHP:
    1. <?php
    2. //Выводим ссылкии уведоление что пришло письмо
    3.     $sql = '
    4.    SELECT `u`.`name`, `u`.`surname`, `r`.`id`
    5.    FROM `requests` AS `r`
    6.    JOIN `users` AS `u` ON `r`.`sender_id` = `u`.`user_id`
    7.    WHERE `r`.`receiver_id`="'. $_SESSION['user_id'] .'" AND `r`.`status`= 0';
    8.     $stmt = $pdo -> prepare($sql);
    9.     if($stmt->execute()) {
    10.     $rows = $stmt->fetchAll(PDO::FETCH_ASSOC);
    11.         if ($rows) {
    12.             echo "Вам пришла заявка в друзья от:<br>";
    13.             foreach($rows as $val) {
    14.             echo $val['name'].' '.$val['surname'].'<br>
    15.            <a href="?mode=request&add_friend='. $val['user_id'] .'">Подтвердить</a> /
    16.            <a href="?mode=reject&reject='. $val['user_id'] .'">Отклонить</a><br><br>';
    17.             }
    18.         }
    19.     }
    20. //Выводим список друзей
    21.     $sql = '
    22.    SELECT `u`.`name`, u.`surname`, `r`.`id`
    23.    FROM `requests` r
    24.    JOIN `users` `u` ON `r`.`sender_id` = `u`.`user_id`
    25.    WHERE r.`receiver_id`="'. $_SESSION['user_id'] .'" AND `r`.`status`= 1';
    26.     $stmt = $pdo -> prepare($sql);
    27.     if($stmt->execute()) {
    28.     $rows = $stmt->fetchAll(PDO::FETCH_ASSOC);
    29.         if ($rows) {
    30.             echo "Список ваших друзей: <br>";
    31.             foreach($rows as $val) {
    32.             echo '<div id="log">'. $val['name'].' '.$val['surname'].'<br></div>
    33.            <a href="?mode=remove&remove='. $val['user_id'] .'">Удалить из друзей</a><br><br>';
    34.             }
    35.         }
    36.     }
    37. ?>
    Но что то идет не так, тот который отправил заявку, не видит что у него есть друзья тому кому отправил, а тот который принял видит что он его друг, и все же ссылки остаются у них на добавления в друзья, что они друг друга могут еще раз добавить в друзья, а этого не должно быть так(

    Ну и скрипты на удаление и отклонения друзей аналогичные друг другу, один напишу, второй такой же:
    PHP:
    1. <?php
    2.  
    3. $sql =
    4.         "DELETE FROM`requests`
    5.        WHERE `id`='".(int)$_GET['reject']."'";
    6.      $stmt = $pdo->prepare($sql);
    7.      $stmt->execute();
    8. ?>
    Еще один скрипт на обновления статуса:
    PHP:
    1. <?php
    2.         $sql =
    3.         "UPDATE `requests`
    4.        SET `status`= '1'
    5.        WHERE `id`='".(int)$_GET['add_friend']."'";
    6.      $stmt = $pdo->prepare($sql);
    7.      $stmt->execute();
    8. ?>
    Ну вот как бы весь скрипт, работает криво и не корректно.
    Кто может предложить как улучшить его, а то все эти скрипты находятся по разным файлам( и мое мнение что это не правильно и глупо.
    Буду рад вашей помощи, или поправки данного скрипта. Буду ждать ваших коментов, только не смейтесь( пожалуйста.
     
    denis01 нравится это.
  5. abrdabr

    abrdabr Новичок

    С нами с:
    28 янв 2017
    Сообщения:
    774
    Симпатии:
    65
    @_ne_scaju_ ахх вот оно что) я то думал надо древо друзей отобразить.........
    тогда по моему оптимальнее всего будет держать id заявителей в таблице пользователя. типа
    user_id, login, email, pass, to_frends

    далее парсить запись to_frends
    или ещё лучше в особую таблицу где ид=юзер_ид
     
  6. _ne_scaju_

    _ne_scaju_ Старожил

    С нами с:
    25 ноя 2016
    Сообщения:
    2.149
    Симпатии:
    118
    @abrdabr
    Я конечно все понимаю, подробней напиши пожалуйста, сколько таблиц сколько полей, ты для меня замудреными словами отвечаешь, мне по проще пожалуйста.)
     
  7. abrdabr

    abrdabr Новичок

    С нами с:
    28 янв 2017
    Сообщения:
    774
    Симпатии:
    65
    @_ne_scaju_ нууууууу лень же мне)))
    создаёшь таблицу "заявки"
    ид, пользователь, заявители

    дело в заявителях там содержатся только ид разделённые пробелом (опционально) и затем получаем всех заявителей через explode
     
  8. _ne_scaju_

    _ne_scaju_ Старожил

    С нами с:
    25 ноя 2016
    Сообщения:
    2.149
    Симпатии:
    118
    @abrdabr
    Спасибо огромное, но я не на столько продвинутый пользователь как ты) Ты вообще писал этот скрипт, когда не-будь?
    Если да покажи свой пример пожалуйста.
     
  9. abrdabr

    abrdabr Новичок

    С нами с:
    28 янв 2017
    Сообщения:
    774
    Симпатии:
    65
    @_ne_scaju_ нет не писал.
    ну а пример я честно собирался настряпать но както ночь напала)))
    если так уж нужен пример то его можно взять с пабличных скриптов соцок.

    ну и было бы не плохо знать что уже имеется те пределываешь скрипт форума\игры итп или всё делается с нуля. но это уже завтра)(
     
  10. _ne_scaju_

    _ne_scaju_ Старожил

    С нами с:
    25 ноя 2016
    Сообщения:
    2.149
    Симпатии:
    118
    @abrdabr ок жду тебя завтра здесь на форуме.
    Может что посоветуешь или научишь, спасибо)
     
  11. abrdabr

    abrdabr Новичок

    С нами с:
    28 янв 2017
    Сообщения:
    774
    Симпатии:
    65
    @_ne_scaju_ нужна одна-две таблицы в зависимости от нагружености. для простоты можно сделать всё в одной:
    Код (Text):
    1. id, username, mail, password, friends, wantfriendship
    далее при подаче запроса в друзья такой код:
    PHP:
    1. $result = mysql_query('SELECT wantfriendship FROM $table WHERE id=ид_того_кому_подали_заявку'); // выбираем все существующие заявки
    2. $res=mysql_result($result, 0);
    3. $query="UPDATE $table SET wantfriendhip=$res. ид того кто подаёт заявку+ пробел WHERE id=$того_кому_подают_заявку"; // вставляем заявку в таблицу
    при удалении
    PHP:
    1. $result = mysql_query('SELECT wantfriendship FROM $table WHERE id=ид_того_кому_подали_заявку'); //выбираем все заявки
    2. $res=mysql_result($result, 0);
    3. $res2=explode($res,пробел); // преобразовываем их в массив
    4. $res2[array_search(ид_того_чья_заявка_не_приинята)]=null; // анулируем заявку
    5. $res3=implode($res2,пробел);
    6. $query="UPDATE $table SET wantfriendhip=$res3 WHERE id=$того_кому_подают_заявку" ;// сохраняем
    при подтверждении
    PHP:
    1. $result = mysql_query('SELECT friends FROM $table WHERE id=ид_того_кому_подали_заявку');
    2. $res=mysql_result($result, 0);
    3. $query="UPDATE $table SET friends=$res. ид того кто подаёт заявку+ пробел WHERE id=$того_кому_подают_заявку";
    + копия запросов для подавшего заявку так как нужно и ему добавить нового друга
    + тоже что и при удалении чтобы убрать заявку
    + различные действия типа отослать письмо


    ну ессна это пример
     
    #11 abrdabr, 15 мар 2017
    Последнее редактирование модератором: 15 мар 2017
  12. _ne_scaju_

    _ne_scaju_ Старожил

    С нами с:
    25 ноя 2016
    Сообщения:
    2.149
    Симпатии:
    118
    @abrdabr
    Благодарю) но я сейчас сразу начал изучать PDO запросы, их реализацию так как mysql уже устарел)
    Плюс я использую 2 таблицы, users, friend.
     
  13. abrdabr

    abrdabr Новичок

    С нами с:
    28 янв 2017
    Сообщения:
    774
    Симпатии:
    65
    @_ne_scaju_ тогда тоже самое только добавив join к запросам
     
  14. _ne_scaju_

    _ne_scaju_ Старожил

    С нами с:
    25 ноя 2016
    Сообщения:
    2.149
    Симпатии:
    118
    @abrdabr Сколько ты уже программируешь в веб технологии? Сколько тебе лет?
     
  15. abrdabr

    abrdabr Новичок

    С нами с:
    28 янв 2017
    Сообщения:
    774
    Симпатии:
    65
    @_ne_scaju_ я не знакомлюсь в первой теме))))
     
    TeslaFeo нравится это.
  16. _ne_scaju_

    _ne_scaju_ Старожил

    С нами с:
    25 ноя 2016
    Сообщения:
    2.149
    Симпатии:
    118
    я просто хочу знать, стоит ли мне стремится обогнать человека который уже знает как программировать на php )
    --- Добавлено ---
    Да и плюс узнать возраст а не имя, это же не знакомство)
     
  17. abrdabr

    abrdabr Новичок

    С нами с:
    28 янв 2017
    Сообщения:
    774
    Симпатии:
    65
  18. _ne_scaju_

    _ne_scaju_ Старожил

    С нами с:
    25 ноя 2016
    Сообщения:
    2.149
    Симпатии:
    118
    Ок зайду с другой стороны, сколько ты программируешь на этом языке php и базой данных sql?
     
  19. abrdabr

    abrdabr Новичок

    С нами с:
    28 янв 2017
    Сообщения:
    774
    Симпатии:
    65
    @_ne_scaju_ достаточно)) я вот только не пойму откуда такой интерес к моей персоне
     
  20. _ne_scaju_

    _ne_scaju_ Старожил

    С нами с:
    25 ноя 2016
    Сообщения:
    2.149
    Симпатии:
    118
    У меня началось, все с регистрации и авторизации, и дальше я начал расширять знания, но я еще не твердо знаю регистрацию и авторизацию. И всякие мелочи в php. Особенно построение function хотелось бы научится, так как мне надо учителя просто, дело быстрее пошло бы. Только языки другие учим! А мне этот больше нравится php и sql языки)
    --- Добавлено ---
    Интерес, в том что ты хоть мне в теме что то стараешься объяснить) Ты знаешь такую программу как timeviewer?
     
  21. abrdabr

    abrdabr Новичок

    С нами с:
    28 янв 2017
    Сообщения:
    774
    Симпатии:
    65
    @_ne_scaju_ знать знаю но не использую. я предпочитаю переписываться.
    php на 100% не знает ни кто.
    ну с функциями могу помочь наверно
     
  22. _ne_scaju_

    _ne_scaju_ Старожил

    С нами с:
    25 ноя 2016
    Сообщения:
    2.149
    Симпатии:
    118
    Как они реализуются можешь мне помочь? Я конечно примерно знаю, но на 20 процентов где то) слабовато одним словом. Если не затруднит помоги мне с ними)
     
  23. abrdabr

    abrdabr Новичок

    С нами с:
    28 янв 2017
    Сообщения:
    774
    Симпатии:
    65
    @_ne_scaju_ нууууууу а на 20% это как?)))))))))
    грубо говоря функция обрабатывает переменные и\или выполняет какито действия
    допустим напишем такую функцию
    function alfa($a,&$b,$c=123){
    $a -простая пердача переменной
    & используется для передачи массива по ссылке в основном
    с - здесь установлено по умолчанию то есть если вызвать функцию с двумя параметрами с будет равно 123 а если с тримя то будет использовано переданное значение, так же умолчания могут быть только в конце параметров те так нельзя alfa($c=123,$a) точнее можно но будет путаница

    и для использовани переменных которые не были переданы функции нужно писать както так
    global $d;
    or
    $GLOBAL['d'];

    есть ещё static если установлен этот указатель то переменная не будет обнулятся при каждом новом вызове функции те будет сохранятся




    }
     
  24. _ne_scaju_

    _ne_scaju_ Старожил

    С нами с:
    25 ноя 2016
    Сообщения:
    2.149
    Симпатии:
    118
    я вообще примерно знаю, 20 это типа не как не знаю, мало работал с функциями) одним словом.
    Например если писать не куда не подсматривать то:
    function reg($login, $pass, $email){
    ну как бы что то того, а дальше что хотелось пишешь тут условия.
    И как ее использовать подставлять в другие скрипты я не понимаю.
    И как с ней дальше работать не знаю(
    Вот тебе и 20 процентов.
    }
     
  25. mkramer

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

    С нами с:
    20 июн 2012
    Сообщения:
    8.553
    Симпатии:
    1.754
    @_ne_scaju_, сначала надо прочитать книжку по php, хотя бы одну, а потом лезть программировать на нём социальные сети. А ты нифига не читал, видно по заявлениям "я выучил, как делать регистрацию" (т.е. нашёл, где скопипастить :) То, что ты описываешь, это не 20%, это где-то 1%. https://secure.php.net/manual/ru/langref.php

    А вообще, можно и с более элементарных вещей начать. Вот, к примеру, той же регистрации блоксхему нарисовать в состоянии?