За последние 24 часа нас посетили 110362 программиста и 6353 робота. Сейчас ищут 1608 программистов ...

Вывод сообщений в чате, redbean

Тема в разделе "PHP для новичков", создана пользователем Madwyn, 29 мар 2018.

Метки:
  1. Madwyn

    Madwyn Новичок

    С нами с:
    29 мар 2018
    Сообщения:
    2
    Симпатии:
    0
    Помогите пожалуйста что только уже не делал, работаю над соц-сетью, возник вопрос про личные сообщения, т.к делаю все на библиотеке redbeanphp, запросы к бд пока что плохо получаются, так вот, я хочу, что бы сообщения выводились от пользователя, которые он отослал другому, так и к пользователю, но они выводятся так : сверху к пользователю, снизу от него, вот код генератора сообщений(обновляю форму с помощью ajax):
    PHP:
    1. <?php require 'db.php';
    2.  
    3. $b = '4';
    4.  
    5. $c = $_SESSION['logged_user']->id;
    6.  
    7. $for = R::findLike('mes', array('for'=>$c), 'ORDER BY sendtime ASC');
    8. if($for) {
    9.  
    10.     foreach ($for as $key) {
    11.         echo '<div class="ChatBlock"><span>'.$key['sendtime'].'</span>'.$key['message'].'</div>';
    12.  
    13.     $key->active = '0';
    14.     R::store($key);
    15.     }
    16.  
    17. $from = R::findLike('mes', array('from'=>$c), 'ORDER BY sendtime ASC');
    18.  
    19.     foreach ($from as $key) {
    20.         echo '<div class="ChatBlock"><span>'.$key['sendtime'].'</span>'.$key['message'].'</div>';
    21.  
    22.     $key->active = '0';
    23.     R::store($key);
    24.     }
    25.  
    26. }
    27. ?>
    28.  
    29. а вот код страницы:
    30.  
    31. <?php require 'db.php';
    32.  
    33. if(isset($_POST['enter'])) {
    34.  
    35. $y = R::dispense('mes');
    36. $y->message = $_POST['text'];
    37. $y->from = $_SESSION['logged_user']->id;
    38. $y->for = $_POST['id'];
    39. $y->active = '1';
    40. $y->sendtime = time('now');
    41. R::store($y);
    42. header("Location: ".$_SERVER["REQUEST_URI"]);
    43. }
    44.  
    45. ?>
    46.  
    47. <!DOCTYPE html>
    48. <html>
    49. <head>
    50. <meta http-equiv="Content-Type" content="text/html; Charset=UTF-8">
    51. <link rel="stylesheet" type="text/css" href="style.css">
    52. <script type="text/javascript" src="jquery.js"></script>
    53.     <title>chat1</title>
    54. </head>
    55. <body>
    56. <? echo $_SESSION['logged_user']->name; ?>
    57. <div class="ChatBox" id="block">
    58.   <div id="display">
    59.   <script type="text/javascript">
    60.   function mode() {
    61.     $.ajax({
    62.         url: "chatlc.php",
    63.         success: function(data) {
    64.             $("#display").html(data);
    65.         }
    66.     });
    67.   }
    68.  
    69.   $(document).ready(function(){
    70.             mode();
    71.             setInterval('mode()',5000);
    72.         });
    73.   </script>
    74.   </div>
    75. </div>
    76. <div class="area">
    77. <form method="post" action="/chatp.php">
    78. <input type="text" name="id" placeholder="Введите ид пользователя..." autofocus required autocomplete="off">
    79. <input type="text" name="text" placeholder="Текст сообщения..." class="ChatMessage" autofocus required autocomplete="off">
    80. <button type="submit" name="enter" class="but">Отправить</button>
    81. </form>
    82. <a href="page.php">Back</a>
    83. </div>
    84.  
    85. </body>
    86. </html>
    Помогите пожалуйста все уже испробовал.
     
    #1 Madwyn, 29 мар 2018
    Последнее редактирование модератором: 31 мар 2018
  2. виталий032

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

    С нами с:
    31 янв 2014
    Сообщения:
    227
    Симпатии:
    30
    Адрес:
    Владивосток
    Может стоит:
    1. Получить сообщения, отправленные от user1 к user2 и от пользователя user2 к user1
    2. Сделать сортировку по дате DESC.
    3. Вывести каждое сообщение в обертке div. Перебираем каждое сообщение: если user_id автора сообщения равен id текущего пользователя, то прижать контент дива к левой части, если не равен, то вправо.
     
    #2 виталий032, 30 мар 2018
    Последнее редактирование: 30 мар 2018
    Madwyn нравится это.
  3. mkramer

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

    С нами с:
    20 июн 2012
    Сообщения:
    8.497
    Симпатии:
    1.726
    @виталий032, ну вы представляете, что советуете? Писать тонну сложной хрени, когда всё можно поручить базе данных.

    @Madwyn, вообще ORM надо осваивать, когда уже знаком с базой данных. Поскольку она в итоге генерирует запросы, и ты должен понимать, какие и зачем, и переводить самостоятельно с ORM на SQL и обратно. И ещё, оформляй код кнопкой </>, она в верхнем левом углу окошка сообщения.

    По твоей проблеме: я пришёл к организации таких вещей через 3 таблицы: dialogs (id, last_message_id), messages (id, dialog_id, from, time, text). dialog_user (dialog_id, user_id). dialogs - messages - связь один-ко-многим, dialogs - users - связь многие ко многом, у dialogs важен впринципе только id, в неё ещё можно записать последнее сообщение, дату, ну что-нибудь для ускорения доступа. Чуть усложняется добавление сообщений в эту систему, зато такая выборка, как ты хочешь, получается сама собой с одного простого запроса:
    Код (Text):
    1. select * from messages where dialog_id=1 order by `time` desc
    На свою ORM сам переводи, я конкретно этой не пользовался никогда
     
    Madwyn и виталий032 нравится это.
  4. Dimon2x

    Dimon2x Старожил

    С нами с:
    26 фев 2012
    Сообщения:
    2.199
    Симпатии:
    183
    здесь наверно надо джоины знать
     
  5. mkramer

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

    С нами с:
    20 июн 2012
    Сообщения:
    8.497
    Симпатии:
    1.726
    @Dimon2x, зачем? Я же показал - самый элементарный запрос :) Я сначала делал два поля: from, to, и пытался всякие or, and делать, но получалось сложно, громоздко. Потом пришёл к этой архитектуре, и таскаю из проекта в проект
     
  6. виталий032

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

    С нами с:
    31 янв 2014
    Сообщения:
    227
    Симпатии:
    30
    Адрес:
    Владивосток
    @mkramer , топовая структура, жаль что раньше не нашел) Для конференций даже переделывать не надо, разве что дату добавления в конференцию.
     
  7. Madwyn

    Madwyn Новичок

    С нами с:
    29 мар 2018
    Сообщения:
    2
    Симпатии:
    0
    Что это "dialogs - messages - связь один-ко-многим, dialogs - users - связь многие ко многом" значит ?
    --- Добавлено ---
    Что значит прижать ? И как в обертке див мне обновлять чат ? Можно пример код.
     
  8. mkramer

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

    С нами с:
    20 июн 2012
    Сообщения:
    8.497
    Симпатии:
    1.726
  9. виталий032

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

    С нами с:
    31 янв 2014
    Сообщения:
    227
    Симпатии:
    30
    Адрес:
    Владивосток
    Архитектура @mkramer, далее запрос из базы выделяет сообщения конкретного диалога и сортирует их по дате в обратном порядке, независимо от того кто написал, т.е. вперемешку сообщения диалога идут.

    Уже все готово. Но для эстетики:
    Основной див, а в нем куча сообщений в отдельных div-ах, которым придать можно float: left или right. Для flexbox, точно не помню, margin-left: auto для выравнивания по правому краю и для левого края наоборот. В исходниках bootstrap-а можно подглядеть)

    Для обновления можно использовать longpoll, т.е. js функцию setInterval(), или же поднять свой node js сервер с socket.io (для него на php скорее всего, по крайней мере я сделал, придётся сделать что-то типо API для проверки, что пользователь прошёл успешно аутентификацию и может отсылать сообщения)
     
  10. Fell-x27

    Fell-x27 Суперстар
    Команда форума Модератор

    С нами с:
    25 июл 2013
    Сообщения:
    12.012
    Симпатии:
    1.679
    Адрес:
    :сердА
    Это значит, что, прежде, чем пользоваться базами данных, нужно изучить хотя бы основы оных.
     
    Dimon2x нравится это.