Помогите пожалуйста что только уже не делал, работаю над соц-сетью, возник вопрос про личные сообщения, т.к делаю все на библиотеке redbeanphp, запросы к бд пока что плохо получаются, так вот, я хочу, что бы сообщения выводились от пользователя, которые он отослал другому, так и к пользователю, но они выводятся так : сверху к пользователю, снизу от него, вот код генератора сообщений(обновляю форму с помощью ajax): PHP: <?php require 'db.php'; $b = '4'; $c = $_SESSION['logged_user']->id; $for = R::findLike('mes', array('for'=>$c), 'ORDER BY sendtime ASC'); if($for) { foreach ($for as $key) { echo '<div class="ChatBlock"><span>'.$key['sendtime'].'</span>'.$key['message'].'</div>'; $key->active = '0'; R::store($key); } $from = R::findLike('mes', array('from'=>$c), 'ORDER BY sendtime ASC'); foreach ($from as $key) { echo '<div class="ChatBlock"><span>'.$key['sendtime'].'</span>'.$key['message'].'</div>'; $key->active = '0'; R::store($key); } } ?> а вот код страницы: <?php require 'db.php'; if(isset($_POST['enter'])) { $y = R::dispense('mes'); $y->message = $_POST['text']; $y->from = $_SESSION['logged_user']->id; $y->for = $_POST['id']; $y->active = '1'; $y->sendtime = time('now'); R::store($y); header("Location: ".$_SERVER["REQUEST_URI"]); } ?> <!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" content="text/html; Charset=UTF-8"> <link rel="stylesheet" type="text/css" href="style.css"> <script type="text/javascript" src="jquery.js"></script> <title>chat1</title> </head> <body> <? echo $_SESSION['logged_user']->name; ?> <div class="ChatBox" id="block"> <div id="display"> <script type="text/javascript"> function mode() { $.ajax({ url: "chatlc.php", success: function(data) { $("#display").html(data); } }); } $(document).ready(function(){ mode(); setInterval('mode()',5000); }); </script> </div> </div> <div class="area"> <form method="post" action="/chatp.php"> <input type="text" name="id" placeholder="Введите ид пользователя..." autofocus required autocomplete="off"> <input type="text" name="text" placeholder="Текст сообщения..." class="ChatMessage" autofocus required autocomplete="off"> <button type="submit" name="enter" class="but">Отправить</button> </form> <a href="page.php">Back</a> </div> </body> </html> Помогите пожалуйста все уже испробовал.
Может стоит: 1. Получить сообщения, отправленные от user1 к user2 и от пользователя user2 к user1 2. Сделать сортировку по дате DESC. 3. Вывести каждое сообщение в обертке div. Перебираем каждое сообщение: если user_id автора сообщения равен id текущего пользователя, то прижать контент дива к левой части, если не равен, то вправо.
@виталий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): select * from messages where dialog_id=1 order by `time` desc На свою ORM сам переводи, я конкретно этой не пользовался никогда
@Dimon2x, зачем? Я же показал - самый элементарный запрос Я сначала делал два поля: from, to, и пытался всякие or, and делать, но получалось сложно, громоздко. Потом пришёл к этой архитектуре, и таскаю из проекта в проект
@mkramer , топовая структура, жаль что раньше не нашел) Для конференций даже переделывать не надо, разве что дату добавления в конференцию.
Что это "dialogs - messages - связь один-ко-многим, dialogs - users - связь многие ко многом" значит ? --- Добавлено --- Что значит прижать ? И как в обертке див мне обновлять чат ? Можно пример код.
Ну эти основы надо знать, прежде чем соц. сети ваять. На, просвещайся: http://habrahabr.ru/post/193136/, http://habrahabr.ru/post/193284/, https://habrahabr.ru/post/193380/
Архитектура @mkramer, далее запрос из базы выделяет сообщения конкретного диалога и сортирует их по дате в обратном порядке, независимо от того кто написал, т.е. вперемешку сообщения диалога идут. Уже все готово. Но для эстетики: Основной див, а в нем куча сообщений в отдельных div-ах, которым придать можно float: left или right. Для flexbox, точно не помню, margin-left: auto для выравнивания по правому краю и для левого края наоборот. В исходниках bootstrap-а можно подглядеть) Для обновления можно использовать longpoll, т.е. js функцию setInterval(), или же поднять свой node js сервер с socket.io (для него на php скорее всего, по крайней мере я сделал, придётся сделать что-то типо API для проверки, что пользователь прошёл успешно аутентификацию и может отсылать сообщения)