За последние 24 часа нас посетили 60262 программиста и 1810 роботов. Сейчас ищут 1990 программистов ...

Сообщения между пользователями.

Тема в разделе "PHP для новичков", создана пользователем Salvat, 5 мар 2016.

  1. Salvat

    Salvat Новичок

    С нами с:
    4 мар 2016
    Сообщения:
    101
    Симпатии:
    0
    В этом коде должен идти диалог между пользователями
    Код (PHP):
    1.  $messa = mysql_query("SELECT * FROM message WHERE `to_u`='$id' AND from_u='$mess_user'");
    2.  
    3.          if(mysql_num_rows($messa)>0){
    4.  
    5.               while($rowmess = mysql_fetch_array($messa)){
    6.  
    7.             $rowmessu = $rowmess['from_u'];
    8.  
    9.         
    10.  
    11.            $from_user = mysql_query("SELECT*FROM users WHERE id='$mess_user'");
    12. ;
    13.             if(mysql_num_rows($from_user)){
    14.  
    15.               while($row_from = mysql_fetch_array($from_user)){
    16.  
    17.      $mess .= $row_from['first_name']. " " . $row_from['last_name'] . " Тема: ".$rowmess['subject'] . " " . $rowmess['date'] . "<br/>" . $rowmess['message'] . "<br>";
    18.               }
    19.              }
    20.           }
    21.         }
    22.  
    23.  $messa_from = mysql_query("SELECT * FROM message WHERE `from_u`='$id' AND to_u='$mess_user'");
    24.  
    25.          if(mysql_num_rows($messa_from)>0){
    26.  
    27.       while($rowmess_from = mysql_fetch_array($messa_from)){
    28.  
    29.            $from_user_from = mysql_query("SELECT*FROM users WHERE id={$rowmess_from['from_u']}");
    30.  
    31.              if(mysql_num_rows($from_user_from)){
    32.  
    33.               while($row_from_user = mysql_fetch_array($from_user_from)){
    34.  
    35.      $mess .= $row_from_user['first_name']. " " . $row_from_user['last_name'] . " Тема: ".$rowmess_from['subject'] . " " . $rowmess_from['date'] . "<br/>" . $rowmess_from['message'] . "<br>";
    36.  
    37.               }
    38.              }
    39.        }
    40.     }
    Но лог сообщений идет вот так
    Код (PHP):
    1. admin1 admin Тема: 1 2016-03-04 21:46:13
    2. 3
    3. admin1 admin Тема: 1 2016-03-04 21:54:28
    4. 2
    5. admin1 admin Тема: 1 2016-03-04 22:07:45
    6. 2
    7. admin1 admin Тема: test 2016-03-05 22:35:11
    8. test
    9. admin1 admin Тема: test2 2016-03-05 22:37:13
    10. test2
    11. admin1 admin Тема: test 2016-03-05 23:02:17
    12. test
    13. adminus adminus Тема: test 2016-03-05 22:36:32
    14. test
    15. adminus adminus Тема: test 2016-03-05 22:36:42
    16. test
    17. adminus adminus Тема: test 2016-03-05 22:37:29
    18. test
    19. adminus adminus Тема: test 2016-03-05 22:40:46
    20. test
    21. adminus adminus Тема: test 2016-03-05 22:41:12
    22. test
    23. adminus adminus Тема: test 2016-03-05 22:41:14
    24. test
    25. adminus adminus Тема: test 2016-03-05 22:41:40
    26. test
    27. adminus adminus Тема: test 2016-03-05 22:42:40
    28. test
    29. adminus adminus Тема: te 2016-03-05 23:03:03
    30. te
    Каким образом можно сделать поочередно по времени?
     
  2. denis01

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

    С нами с:
    9 дек 2014
    Сообщения:
    12.227
    Симпатии:
    1.714
    Адрес:
    Молдова, г.Кишинёв
    Отсортировать по времени?
     
  3. Salvat

    Salvat Новичок

    С нами с:
    4 мар 2016
    Сообщения:
    101
    Симпатии:
    0
  4. denis01

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

    С нами с:
    9 дек 2014
    Сообщения:
    12.227
    Симпатии:
    1.714
    Адрес:
    Молдова, г.Кишинёв
    Смотри mysql order by, надеюсь дата хранится в timestamp или datetime.
     
  5. Salvat

    Salvat Новичок

    С нами с:
    4 мар 2016
    Сообщения:
    101
    Симпатии:
    0
    Дата хранится в datetime, только данные ведь выводятся в mess, ORDER BY date DESC не помогает. Сначала работает один кусок кода, а потом второй.
     
  6. Salvat

    Salvat Новичок

    С нами с:
    4 мар 2016
    Сообщения:
    101
    Симпатии:
    0
    Укоротил код до такого
    Код (PHP):
    1. $messa = mysql_query("SELECT `users`.id AS id, `users`.last_name, `users`.first_name, `message`.to_u AS to_u,`message`.from_u AS from_u,`message`.subject AS subject, `message`.message AS message,`message`.date FROM message,users WHERE `users`.id=`message`.from_u");
    2.  while($row = mysql_fetch_array($messa)){
    3. echo "Сообщение:" . " ". $row['first_name'] .  $row['last_name'] . " " .$row['date']."<br/>Тема:" . $row['subject']. "<br/>" .$row['message'] ."<br/>";
    4. } 
    Не сталкивался с выводом из нескольких таблиц, поэтому вопрос, каким образом можно вывести данныe определенных пользователей в зависимости от значения $id? С таким запросом и не нужна еще одна колонка, to_u или from_u, можно в одну писать иды пользователей и выводить их в зависимости кому написали сообщения, я верно понимаю?

    Добавлено спустя 44 секунды:
    Все-таки необходимо 2 колонки, что-то перепутал...

    Добавлено спустя 10 минут 36 секунд:
    Код (PHP):
    1.  $messa = mysql_query("SELECT `users`.id AS id, `users`.last_name, `users`.first_name, `message`.to_u AS to_u,`message`.from_u AS from_u,`message`.subject AS subject, `message`.message AS message,`message`.date FROM message,users WHERE `users`.id=`message`.to_u='$id'"); 
    Таким образом работает, а такими нет...
    Код (PHP):
    1.  $messa = mysql_query("SELECT `users`.id AS id, `users`.last_name, `users`.first_name, `message`.to_u AS to_u,`message`.from_u AS from_u,`message`.subject AS subject, `message`.message AS message,`message`.date FROM message,users WHERE `users`.id=`message`.to_u='$id' AND `message`.from_u='$mess_user'");
    2.  
    3.  
    4.  $messa = mysql_query("SELECT `users`.id AS id, `users`.last_name, `users`.first_name, `message`.to_u AS to_u,`message`.from_u AS from_u,`message`.subject AS subject, `message`.message AS message,`message`.date FROM message,users WHERE `users`.id=`message`.to_u='$id' AND users.id = `message`.from_u='$mess_user'"); 
     
  7. Salvat

    Salvat Новичок

    С нами с:
    4 мар 2016
    Сообщения:
    101
    Симпатии:
    0
    Код (PHP):
    1.  $messa = mysql_query("SELECT DISTINCT `users`.id AS id, `users`.last_name, `users`.first_name, `message`.from_u AS from_u, `message`.to_u AS to_u,`message`.subject AS subject, `message`.message AS message,`message`.date AS date, message.id FROM message,users WHERE users.id=message.to_u=$mess_user or users.id=message.to_u=$id GROUP BY date");
    2.  
    3.  while($row = mysql_fetch_array($messa)){
    4.   
    5.    $mess .= "Сообщение: " .  $row['first_name'] .  $row['last_name'] . " " .$row['date']."<br/>Тема:" . $row['subject']. "<br/>" .$row['message'] ."<br/>";
    6.  
    7.  }
    Вот собственно и все господа. Теперь такой вопрос, он конечно не к месту, просто не охота новую тему открывать. У меня не получается разрушить POST, при нажатии на ctrl+R данные снова пишутся в базу, использую для этого unset как только данные записались.

    Добавлено спустя 20 минут 15 секунд:
    Не, так не подходит, нужно чтобы два параметра были обязательны, а не OR, нужно AND
     
  8. artoodetoo

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

    С нами с:
    11 июн 2010
    Сообщения:
    11.128
    Симпатии:
    1.248
    Адрес:
    там-сям
    Вообще-то новый вопрос должен быть в новой теме.

    После обработки пост делают редирект. Пусть даже на тот же адрес. Главное чтобы последним стал гет, а не пост.

    Добавлено спустя 4 минуты 6 секунд:
    Про "и" и "или" в запросе: ты на бумажке порисуй свои данные и попробуй так и сяк, изобрази из себя сервер БД :) Тогда в голове отпечатаются правила.
     
  9. Salvat

    Salvat Новичок

    С нами с:
    4 мар 2016
    Сообщения:
    101
    Симпатии:
    0
    Учту.
    Буду пробовать, хотел совета как лучше поступить.
     
  10. Salvat

    Salvat Новичок

    С нами с:
    4 мар 2016
    Сообщения:
    101
    Симпатии:
    0
    У меня к сожалению никак не получается. Я бы не стал писать на форуме по пустекам, перебробовл точно 101 способ, в прямом смысле этого слова. Перечитал кучу статей, гугл мой лучший друг:) поэтому и написал код с выводов в одном запросе с двух таблиц. Т.к. читал. И раздел для новичком:) Укажите хотябы на ошибку. В последнем коде была ошибка, исправил. Но не получается вывести с двух колонок иды юзеров для вывода их сообщения и их данных.
    Код (PHP):
    1. $messa = mysql_query("SELECT DISTINCT `users`.id AS id, `users`.last_name, `users`.first_name, `message`.from_u AS from_u, `message`.to_u AS to_u,`message`.subject AS subject, `message`.message AS message,`message`.date AS date, message.id FROM message,users WHERE users.id=message.from_u=$mess_user or users.id=message.to_u=$id GROUP BY date");
    2.  
    3.  while($row = mysql_fetch_array($messa)){
    4.   
    5.    $mess .= "Сообщение: " .  $row['first_name'] .  $row['last_name'] . " " .$row['date']."<br/>Тема:" . $row['subject']. "<br/>" .$row['message'] ."<br/>";
    6.  
    7.  }
    8.  
    Я знаю, что ошибка в данном кусочке кода, но именно какая, понять никак не могу...
    Код (PHP):
    1. WHERE users.id=message.from_u=$mess_user or users.id=message.to_u=$id GROUP BY date
    C AND не выводятся данные, почему? Если я выложу сколько перепробовал, боюсь питон тут родится, всмысле, много текста с маленьким скроллом:)
     
  11. artoodetoo

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

    С нами с:
    11 июн 2010
    Сообщения:
    11.128
    Симпатии:
    1.248
    Адрес:
    там-сям
    так нельзя писать. ты попробуй выполнить запрос с уже подставленными значениями в phpmyadmin или что там у тебя есть, увидишь ошибки.
     
  12. Salvat

    Salvat Новичок

    С нами с:
    4 мар 2016
    Сообщения:
    101
    Симпатии:
    0
    Я пробовал, просто выдает не те значения которые мне необходимо получить.
    Код (PHP):
    1. SELECT DISTINCT `users`.id AS id, `users`.last_name, `users`.first_name, `message`.from_u AS from_u, `message`.to_u AS to_u,`message`.subject AS subject, `message`.message AS message,`message`.date AS date, message.id FROM message,users WHERE `users`.id IN (1,2) and `message`.from_u=2 and `message`.to_u=1 GROUP BY date
    Таким условием получаю одно значение, выводится только ID 1, второй никак не хочет.
     
  13. machetero

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

    С нами с:
    25 окт 2014
    Сообщения:
    499
    Симпатии:
    21
    Вам надо почитать про связи между таблицами. Про первичный ключ и внешний ключ. Про то как извлекать такие данные INNER JOIN'ом или LEFT JOIN.
     
  14. artoodetoo

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

    С нами с:
    11 июн 2010
    Сообщения:
    11.128
    Симпатии:
    1.248
    Адрес:
    там-сям
    Сформулируй своими словами русским языком какое ограничение надо наложить на выборку из базы.
    Мне кажется ты слишком рано начал писать программу.
     
  15. Salvat

    Salvat Новичок

    С нами с:
    4 мар 2016
    Сообщения:
    101
    Симпатии:
    0
    Необходимо вывести данные двух пользователей по id из таблицы users и так же вывести их общение между собой, где from_u от кого, to_u - кому. Почему же рано, если все приходит с опытом, раздел соответствующий, где спрашивают что к чему, и зачем.
    Спасибо за совет, почитаю.
     
  16. artoodetoo

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

    С нами с:
    11 июн 2010
    Сообщения:
    11.128
    Симпатии:
    1.248
    Адрес:
    там-сям
    Я только намекаю, что программа это идея или мысль, оформленная по определенным правилам. Правила ты быстро узнаешь. А мыслить алгоритмически не у всех получается.

    Короче, правила таковы, что если нужны данные двух пользователей в одной строке, то надо таблицу пользователей подключать дважды. Чтобы избежать путаницы каждому экземпляру users придумываешь свой псевдоним. Например ufrom и uto. Как объединять таблицы надо почитать (искать слова алиас и join). Я не готов объяснять. Показать готовое могу, но это будет медвежья услуга. Ты должен сам добиться, мы только подсказываем.
     
  17. Salvat

    Salvat Новичок

    С нами с:
    4 мар 2016
    Сообщения:
    101
    Симпатии:
    0
    Я решил свой вопрос, прочитал много литературы, узнал новое для себя. А вопрос свой решил таким образом.
    Код (PHP):
    1. $messa = mysql_query("SELECT first_name,last_name,date,avatar,from_u,to_u,subject,message FROM `users`,`message` WHERE `users`.id = `message`.from_u");
    2.   while($row = mysql_fetch_array($messa)){
    3.     
    4. if($id == $row['to_u'] and $mess_user == $row['from_u']){
    5.  
    6. ?>
    7. <?=$row['first_name'] ."&nbsp".  $row['last_name']?><br/><img style='height:70px;width:50px;' src="<?=$row['avatar']?>"><br/><?=$row['date']?><br/>Тема: <?=$row['subject']?><br/><?=$row['message']?><hr><br/></div>
    8. <?php
    9.  }elseif($mess_user == $row['to_u'] and $id == $row['from_u']){
    10.  
    11. ?>
    12. <?=$row['first_name'] ."&nbsp".  $row['last_name']?><br/><img style='height:70px;width:50px;' src="<?=$row['avatar']?>"><br/><?=$row['date']?><br/>Тема: <?=$row['subject']?><br/><?=$row['message']?><hr><br/></div>
    13. <?php
    14.  }
    15. }
     
  18. Period

    Period Новичок

    С нами с:
    29 дек 2014
    Сообщения:
    148
    Симпатии:
    1
    Не надо использовать джоины и объединения таблиц для такой задачи.
    Код (PHP):
    1. $messa = mysql_query("
    2.     SELECT
    3.         first_name,
    4.         last_name,
    5.         date,
    6.         avatar,
    7.         from_u,
    8.         to_u,
    9.         subject,
    10.         message
    11.     FROM
    12.         `users`, `message`
    13.     WHERE
    14.         `users`.id = `message`.from_u"
    15. );
    16.  
    17. while($row = mysql_fetch_array($messa)){
    18.     if($id == $row['to_u'] and $mess_user == $row['from_u']){
    19.  
    Честно? Это клиника. Так нельзя делать по множеству причин.

    Вы знаете id'шники обоих юзеров, чью переписку надо вывести?
    Получите её
    Код (PHP):
    1. $perepiska = SELECT * FROM messages WHERE from=id AND to=id
    2. $user1 = SELECT * FROM users WHERE id=id
    3. $user2 = SELECT * FROM users WHERE id=id
    А потом уже генерируйте шаблон.

    Подсказка от модератора:
    Любой код или текст конфигурации пишите между тегом [code=php] и [/code].
    Используйте отступы в коде для форматирования текста.
    Это помогает быстрее понять вас, увеличивает шанс на получение ответа.
    Что выделять? Например: PHP, HTML, CSS, JavaScript, SQL, XML, .htaccess, ini, регулярные выражения, код шаблонизаторов, любая другая разметка, результаты array/object dump и т. д.
     
  19. Salvat

    Salvat Новичок

    С нами с:
    4 мар 2016
    Сообщения:
    101
    Симпатии:
    0
    Это не клиника, это решение задачи когда нет на нее ответа.
    id конечно же известны. Почему так нельзя делать, поясните.
     
  20. Period

    Period Новичок

    С нами с:
    29 дек 2014
    Сообщения:
    148
    Симпатии:
    1
    Во-первых, джоины - это зло. При высокой нагрузке они ведут себя очень и очень плохо. Почитайте, что происходит в кишках базы, когда вы херачите джоин - как они обрабатываются.

    По мне, так лучше сто примитивных селектов в цикле с выборкой по айдишнику, чем один джоин. Естественно, речь идёт про крупные таблицы, где не одня сотня записей. Но это религиозный вопрос, я знаю.

    В любом случае, правило одно: если можно обойтись без джоина, без него нужно обойтись.

    Второй момент. То, что сделали вы "FROM `users`, `message` WHERE `users`.id = `message`.from_u" - это даже не джоин. Вы объединили каждую запись одной таблицы со всеми записями другой. WHERE - это не совсем условие объединения. У вас в одной таблице 10 записей, а в другой - 20. При таком объединении, если я правильно считаю, в результирующей таблице у вас получается 200 записей, которые нужно обработать. Представьте, что произойдёт, если у вас сотня пользователей и пара тысяч сообщений между ними. База крякнется.

    Третье. Я не вижу разницы между
    Код (PHP):
    1. if($id == $row['to_u'] and $mess_user == $row['from_u']) 
    и
    Код (PHP):
    1. elseif($mess_user == $row['to_u'] and $id == $row['from_u']) 
    . Может, это вы так скопипастили сюда, но там всё одинаково.

    Подсказка от модератора:
    Любой код или текст конфигурации пишите между тегом [code=php] и [/code].
    Используйте отступы в коде для форматирования текста.
    Это помогает быстрее понять вас, увеличивает шанс на получение ответа.
    Что выделять? Например: PHP, HTML, CSS, JavaScript, SQL, XML, .htaccess, ini, регулярные выражения, код шаблонизаторов, любая другая разметка, результаты array/object dump и т. д.
     
  21. Salvat

    Salvat Новичок

    С нами с:
    4 мар 2016
    Сообщения:
    101
    Симпатии:
    0
    Благодарю за пояснение.
    Тут идет диалог, в to_u кому адресовано сообщение, в from_u от кого. Когда id_1 пишет, в to_u добавляется 1, в from_u добавляется 2 или 3 и т.д, смотря кому пишет пользователь. Пользователь отвечает, его id заносится в from_u, а кому отвечает в to_u. И тем самым необходимо поднять данные из двух колонок, чтобы получился диалог.

    Добавлено спустя 24 минуты 42 секунды:
    В самом моем первом сообщении и было написано как Вы сказали. Там описана проблема, которую я не смог решить, попросил помощи, полистал гугл и пришел к выводу, что если нет другого решения моей проблемы, тогда лучше объединить таблицы.
     
  22. Period

    Period Новичок

    С нами с:
    29 дек 2014
    Сообщения:
    148
    Симпатии:
    1
    Вы реально думаете, что кто-то изучал ваш код? Я больше 3-х строчек на форумах вообще не смотрю, так бегло прогляжу. Изучение чужого кода - очень времязатратное мероприятие. Это так к слову, на будущее.

    Вы пишите:
    $messa = mysql_query("SELECT * FROM message WHERE `to_u`='$id' AND from_u='$mess_user'");
    $messa_from = mysql_query("SELECT * FROM message WHERE `from_u`='$id' AND to_u='$mess_user'");

    А зачем?
    SELECT * FROM message WHERE (`from_u`='$id' AND to_u='$mess_user') OR (`to_u`='$id' AND from_u='$mess_user')
    Получаете сразу всю переписку и от того к этому, и от этого к тому. Сортируете по времени и у вас один массив со всей перепиской, готовый к выводу.
     
  23. igordata

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

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    это старый джоин

    Добавлено спустя 1 минуту 20 секунд:
    а ещё можно чуток структуру бд поменять и выбирать по айдишнику диалога.
     
  24. mahmuzar

    mahmuzar Старожил

    С нами с:
    6 апр 2012
    Сообщения:
    4.631
    Симпатии:
    425
    Адрес:
    РД, г. Махачкала.
    Это просто соединение двух таблиц.

    Указав две таблицы, вы так же указываете тип соединеня, возможно, даже не зная его. Запятая между названиями таблиц эквивалента констукции INNER JOIN (внутреннее соединение) или CROSS JOIN (перекрестное соединение). Такой тип соединения еще называют полным соединением (full join) или декартовым произведением (Cartesian product) таблиц. Это означает следующее: "Взять указанные таблицы и сделать из них одну большую. Большая таблица должна содержать строку для любой возможной комбинации строк из каждой указанноой в списке таблицы, независимо от того имеют они смысл или нет".
     
  25. igordata

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

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    ты написал ровно то же самое, что написал он =)