За последние 24 часа нас посетили 17779 программистов и 1714 роботов. Сейчас ищут 1692 программиста ...

Как реализовать смс переписку между авторизованными пользователями сайта PHP MySQL

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

  1. mkramer

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

    С нами с:
    20 июн 2012
    Сообщения:
    8.583
    Симпатии:
    1.761
    Это у них, по видимому, не id пользователя, а ID диалога. А сообщения там ajax-ом отправляются.

    По поводу проверки - зависит от сложности логики. Может у тебя будет логика, что чтобы отправить мне сообщения, пользователь должен решить 5 дифференциальных уравнений, значит ставишь такое условие. Логика зависит от технического задания
     
    Алекс8 нравится это.
  2. Алекс8

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

    С нами с:
    18 май 2017
    Сообщения:
    1.730
    Симпатии:
    359
    Вы чуть чуть сильно сократили код)
    обратите внимания что там стоит фраза "пользователь_имеет_право_отправлять_сообщения", она не просто так там стоит.. это должна быть функция проверки))
     
  3. _ne_scaju_

    _ne_scaju_ Старожил

    С нами с:
    25 ноя 2016
    Сообщения:
    2.149
    Симпатии:
    118
    @Алекс8
    а что isset это уже не функция?
    --- Добавлено ---
    @mkramer
    По поводу что сообщения ajax-ом отправляются я это знаю, смотрю код вк то есть скрипт, как устроен)))

    У меня ситуация сейчас стоит в следующем, отправить письмо я могу, кое как за неделю :D разобрался :D а теперь как ответить пользователю на его смс, то есть, если я правильно понял, скрипт отправки будет один и тот же, что и при отправке смс? Мы просто создаем под письмом ссылку, типа на форму отправки, а форма уже будет обрабатывать данные и передавать опять на тот скрипт который делает отправку? Верная у меня сейчас логика?
     
  4. mkramer

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

    С нами с:
    20 июн 2012
    Сообщения:
    8.583
    Симпатии:
    1.761
    @_ne_scaju_, ну можно и так. Сначала напиши детально, что хочешь получить, а потом пытайся получить
     
  5. mkramer

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

    С нами с:
    20 июн 2012
    Сообщения:
    8.583
    Симпатии:
    1.761
    ну, во-первых, не функция. А во-вторых, @Алекс8 просто как и я не понимает, чем мог смущать id в адресной строке, если даже нету проверки прав пользователя, т.е. любой пользователь имеет право посылать сообщение любому пользователю.
     
  6. _ne_scaju_

    _ne_scaju_ Старожил

    С нами с:
    25 ноя 2016
    Сообщения:
    2.149
    Симпатии:
    118
    @mkramer
    Мини вопрос: Делаю три запроса: вывожу на главной странице кол., не принятых заявок и не прочитанных сообщений (Друзей, Сообщений)+вывожу логин.
    Как лучше поступить все эти три запроса выводят данные из одной таблицы. Лучше оставить так как и есть, или оптимизировать создать один запрос который будет выводить и логин и заявки и сообщения. Ну вот просто интересует как бы вы поступили бы?
     
  7. _ne_scaju_

    _ne_scaju_ Старожил

    С нами с:
    25 ноя 2016
    Сообщения:
    2.149
    Симпатии:
    118
    @mkramer
    Кстати в мануале пишут, что isset() это типа функция для работы с переменными.
     
  8. mkramer

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

    С нами с:
    20 июн 2012
    Сообщения:
    8.583
    Симпатии:
    1.761
    Три или один - большой разницы нету, так что сделал бы как проще.
    https://php.ru/manual/function.isset.html#refsect1-function.isset-notes
    Читаем мануал полностью. Эта конструкция - один из поводов покритиковать php, похожа на функцию, но функцией не является
     
    _ne_scaju_ нравится это.
  9. _ne_scaju_

    _ne_scaju_ Старожил

    С нами с:
    25 ноя 2016
    Сообщения:
    2.149
    Симпатии:
    118
    @mkramer
    Сделаю одним запросом, так будет проще.
    Прочитал, увидел, понял и запомнил)
     
  10. _ne_scaju_

    _ne_scaju_ Старожил

    С нами с:
    25 ноя 2016
    Сообщения:
    2.149
    Симпатии:
    118
    Всем привет, у меня не получается удалить сообщения по условию, с одной стороны я удаляю а с другой нет, как то так опишу:
    1. есть скрипт сообщений, допустим message.php
    2. по дефолду у меня стоит вывод сообщений всех пришедших от других пользователей
    3. а по нажатию на ссылку, отправленные показываю все отправленные сообщения
    Так в чем заключается проблема, в этом скрипте message.php и в отправленных и в полученных я создаю ссылку на удаления сообщения они оба обращаются в скрипт message.php
    PHP:
    1. <?php
    2. switch($act){
    3.  
    4. case "delet":
    5. $mid = intval($_POST['mid']);
    6. $folder = isset($_POST['folder']);
    7. //inbox полученные    outbox отправленные
    8. if($folder == 'inbox')
    9. $folder = 'inbox';
    10. else
    11. $folder = 'outbox';
    12. //тут идут запросы на удаления
    13. break;
    14.  
    15. case "outbox": //отправленные
    16. echo 'все отправленные сообщения';
    17. echo '<a href="">удалить смс</a>';
    18. break
    19.  
    20. default://полученные
    21. echo 'все пришедшие сообщения';
    22. echo '<a href="">удалить смс</a>';
    23. }
    Как бы показал структуры файла message.php и описал наглядно как выглядит у меня вся структура файла.

    По условию из case: delet получается так:
    1. если я нахожусь по дефолту в полученных сообщениях то при нажатии на ссылку я удаляю смс
    2. но когда я перехожу в отправленные сообщения, и пробую удалить сообщения, то не чего не удаляется
    3. ссылки на удаления идентичны что в отправленных что в полученных
    4. если я поменяю в условии inbox на outbox то будет наоборот, в полученных я не смогу удалять а в отправленных удалять смогу.
    5. inbox и outbox это поля в бд и хранятся так:
    id, user1, user2, inbox (id, кому, от кого, inbox)
    id, user2, user1, outbox (id, от кого, кому, outbox)

    Что же мне в таком случае делать, как правильно построить условие, чтобы работало корректно?
    Очень благодарен буду за объяснения, или предложения как быть в такой ситуации.
     
  11. _ne_scaju_

    _ne_scaju_ Старожил

    С нами с:
    25 ноя 2016
    Сообщения:
    2.149
    Симпатии:
    118
    Вопрос в принципе решен)
     
    igordata нравится это.
  12. _ne_scaju_

    _ne_scaju_ Старожил

    С нами с:
    25 ноя 2016
    Сообщения:
    2.149
    Симпатии:
    118
    Вы извините но нет вопрос не решен( он еще в силе, я просто не пойму, в условии стоит у меня, если ты смс отправил то ты его удалить можешь только от себя, а кому отправил не можешь, а если письмо тебе пришло, по принципу его же тоже можно удалить но не удаляется(.
    Помогите пожалуйста ребята!
     
  13. mkramer

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

    С нами с:
    20 июн 2012
    Сообщения:
    8.583
    Симпатии:
    1.761
    многие-ко-многим делать надо. Таблицу
    user_id | message_id
    Привязываешь сообщение и к отправителю, и к получателю. Если получатель удалил сообщение - удаляешь запись их этой таблицы, а у отправителя оно остаётся. И наоборот.
     
  14. _ne_scaju_

    _ne_scaju_ Старожил

    С нами с:
    25 ноя 2016
    Сообщения:
    2.149
    Симпатии:
    118
    @mkramer
    Я так и делаю смотри на сриншоте, что не так в таблице?
    может ему это условие не нравится?
    PHP:
    1. if($folder == 'inbox')
    2. $folder = 'inbox';
    3. else
    4. $folder = 'outbox';
     

    Вложения:

    • 3.png
      3.png
      Размер файла:
      11,1 КБ
      Просмотров:
      2
    #139 _ne_scaju_, 2 июн 2017
    Последнее редактирование: 2 июн 2017
  15. _ne_scaju_

    _ne_scaju_ Старожил

    С нами с:
    25 ноя 2016
    Сообщения:
    2.149
    Симпатии:
    118
    PHP:
    1. Показываю код, может легче будет вам разобраться в чем проблема:
    2. <?php
    3. case "delet":
    4.  
    5. $mid = intval($_POST['mid']);
    6. $folder = intval($_POST['folder']);
    7.  
    8. if($folder == 'inbox')
    9. $folder = 'inbox';
    10. else
    11. $folder = 'outbox';
    12. //$user_id это сессия пользователя $mid пришедшие данные из формы
    13. //которые передаю по $_GET параметру, ну и $folder сами видите от куда беру
    14. //Проверяем на факт существования сообщения для юзера
    15. $row = $pdo->prepare('
    16. SELECT `pm_read`, `from_user_id`
    17. FROM `messages`
    18. WHERE `id` = :id
    19. AND `for_user_id` = :for_user_id
    20. AND `folder` = :folder');
    21. $row->execute(['id' => $mid, 'for_user_id' => $user_id, 'folder' => $folder]);
    22. $res_row = $row->fetch();
    23.  
    24. if($res_row){
    25.  
    26. //Удаляем само сообщение
    27. $del = $pdo->prepare('
    28. DELETE
    29. FROM `messages`
    30. WHERE `id` = :id
    31. AND `folder` = :folder
    32. AND `for_user_id` = :for_user_id');
    33. $del->execute(['id' => $mid, 'folder' => $folder, 'for_user_id' => $user_id]);
    34. }
    А вот форма где происходит нажатия пользователя для подтверждения удаления:
    PHP:
    1. <div class="content">
    2. <form action="?go=msg&act=delet" method="POST">
    3. <input type="" name="mid" placeholder="наберите id пользователя..." value="<?= $_GET['mid']; ?>"/>
    4. <input type="" name="folder" placeholder="наберите id пользователя..." value="<?= $_GET['folder']; ?>"/>//Что подставить сюда я не знаю просто придумал.
    5. <input type="submit" value="Подтвердите действие" />
    6. </form>
    7. </div>
    Может в коде я ошибаюсь?
     
  16. _ne_scaju_

    _ne_scaju_ Старожил

    С нами с:
    25 ноя 2016
    Сообщения:
    2.149
    Симпатии:
    118
    Да исправьте меня уже.
    Что я не так делаю?
     
  17. igordata

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

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    надеешься на других
     
    mkramer нравится это.
  18. _ne_scaju_

    _ne_scaju_ Старожил

    С нами с:
    25 ноя 2016
    Сообщения:
    2.149
    Симпатии:
    118
    @igordata
    Как вытащить полный диалог между пользователя, и по нажатию на него открывался полный список переписки между двумя пользователями?
     
  19. igordata

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

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    а какие варианты приходят в голову?
     
  20. _ne_scaju_

    _ne_scaju_ Старожил

    С нами с:
    25 ноя 2016
    Сообщения:
    2.149
    Симпатии:
    118
    @igordata
    Приходит один вариант, выводит список диалогов сколько их.
    А вот как открыть этот диалог и посмотреть всю переписку между ними, не чего не приходит в голову(.
    PHP:
    1. default:
    2. //################### Вывод всех диалогов ###################//
    3. //Вывод диалогов
    4. $vivod_dailog = $pdo->prepare("
    5. SELECT SQL_CALC_FOUND_ROWS
    6. `tb1`.`msg_num`, `im_user_id`,
    7. `tb2`.`user_id`, `user_login`, `user_photo`
    8. FROM `im` tb1, `users` tb2
    9. WHERE `tb1`.`iuser_id` = ?
    10. AND `tb1`.`im_user_id` = `tb2`.`user_id`
    11. ORDER by `idate`
    12. DESC LIMIT 0, 50");
    13. $vivod_dailog->execute([$user_id]);          
    14. $dialog_result = $vivod_dailog->fetchall();
    15.  
    16. //подключаем форму диалогов
    17. include'./templates/default/im/dialog.php';
    18.  
    19. foreach($dialog_result as $row){
    20. echo $row['user_login'].'<br>';
    21. echo $row['im_user_id'].'<br>';
    22. echo'<a href="?go=msg&for_user='.$row['im_user_id'].'&act=history" onClick="">написать</a>';
    23. }
    Может идейку подкинешь?
     
  21. igordata

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

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    идейку?
    ну просто берёшь из таблицы сообщений все сообщения с номером диалога
    канэц
     
  22. _ne_scaju_

    _ne_scaju_ Старожил

    С нами с:
    25 ноя 2016
    Сообщения:
    2.149
    Симпатии:
    118
    @igordata
    у меня получается одна таблица с диалогами вторая с сообщениями, и при удалении диалога по условию сам диалог удаляется а все сообщения которые с ним связаны не удаляются) таблица диалогов идет многие ко многим.
     
  23. _ne_scaju_

    _ne_scaju_ Старожил

    С нами с:
    25 ноя 2016
    Сообщения:
    2.149
    Симпатии:
    118
    @igordata
    Разобрался, если я создаю диалоги (многие ко многим) то лучше обязательно будет создать и сообщения (многие ко многим)
    И при удалении будет так, если я удалю диалог, то диалог у другого юзера диалог останется, так как переписка записывалась и первому и второму пользователю.
    Ну а если однонаправленная то лучше что в одно что во второй лучше создавать (многие к одному)
     
  24. igordata

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

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    поздравляю! :D молодец!
     
  25. _ne_scaju_

    _ne_scaju_ Старожил

    С нами с:
    25 ноя 2016
    Сообщения:
    2.149
    Симпатии:
    118
    @igordata
    ну спасибо, а теперь как мне открыть весь список сообщений одного диалога, не подкинешь идейку?