За последние 24 часа нас посетили 32002 программиста и 1380 роботов. Сейчас ищут 902 программиста ...

Логика личных сообщений

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

  1. Danil005

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

    С нами с:
    2 янв 2015
    Сообщения:
    528
    Симпатии:
    30
    Ломаю голову, как правильно реализовать логику личных сообщений.
    PHP:
    1. $stmt = $db->prepare("SELECT * FROM `messages` WHERE `from`=:mfrom AND `to`=:to");
    2. $stmt->bindParam(':mfrom', $USER);
    3. $stmt->bindParam(':to', $to);
    4. $stmt->execute();
    5.  
    6. while ($row = $stmt->fetch()){$message=$row['message'];$from=$row['from']; $to=$row['to'];
    7.   echo $from.':'.' '.$message.'<br>';
    8. }
    И БД:
    [​IMG]
     
  2. SamyRed

    SamyRed Старожил

    С нами с:
    23 июл 2015
    Сообщения:
    1.196
    Симпатии:
    111
    Адрес:
    Украина
    Ну так а проблема то в чём?
     
  3. TeslaFeo

    TeslaFeo Старожил

    С нами с:
    9 мар 2016
    Сообщения:
    2.984
    Симпатии:
    759
    Тоже думал об этом как то...
    ИМХО тут одной таблицей не отделаешься.
    Я бы, наверное, подумал о, минимум, двух табцицах.
    В одной сами сообщения с датой. + id автора и id переписки в виде внешних ключей.
    Вторая такая как у тебя в спойлере, кроме последнего поля.

    офф топ: полез попгуглить этот вопрос - там тело доказывает, что в вк у каждого пользователя своя папка с его переписками)))
     
  4. Danil005

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

    С нами с:
    2 янв 2015
    Сообщения:
    528
    Симпатии:
    30
    Дело в том, что как я написал, отображает лишь сообщения одного пользователя, а второго нет, причем с двух сторон должно быть.
     
  5. SamyRed

    SamyRed Старожил

    С нами с:
    23 июл 2015
    Сообщения:
    1.196
    Симпатии:
    111
    Адрес:
    Украина
    Ну так вы, ведь, и выводите только со стороны того, кто отправил.
    --- Добавлено ---
    Только запрос неправильный. "SELECT * FROM `messages` WHERE `from`=$myname OR `to`=$myname"
     
  6. TeslaFeo

    TeslaFeo Старожил

    С нами с:
    9 мар 2016
    Сообщения:
    2.984
    Симпатии:
    759
    Я наверное хрень какую-то написал)
     
  7. SamyRed

    SamyRed Старожил

    С нами с:
    23 июл 2015
    Сообщения:
    1.196
    Симпатии:
    111
    Адрес:
    Украина
    Может и не хрень, но я ничего не понял :) Мне лень вникать)) Я бы ограничился одной БД. Хотя логика вполне нормальная. В одной таблице сообщения, а в другой - связки.
     
  8. TeslaFeo

    TeslaFeo Старожил

    С нами с:
    9 мар 2016
    Сообщения:
    2.984
    Симпатии:
    759
    @SamyRed Мне не нравится ограничение в 2 пользователя. А вдруг ты завтра захочешь реализовать переписку между 3 и более пользователями...
     
  9. alexblack

    alexblack Старожил

    С нами с:
    20 янв 2016
    Сообщения:
    640
    Симпатии:
    381
  10. SamyRed

    SamyRed Старожил

    С нами с:
    23 июл 2015
    Сообщения:
    1.196
    Симпатии:
    111
    Адрес:
    Украина
    Ну это уже совсем другой вопрос, и совсем другая постановка задачи
     
  11. Danil005

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

    С нами с:
    2 янв 2015
    Сообщения:
    528
    Симпатии:
    30
    Если так делать, то вывода от двух сторон не будет.
     
  12. igordata

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

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    (`from`=111 AND `to`=222) OR (`from`=222 AND `to`=111)
    --- Добавлено ---
    это ты все свои беседы затащишь в один тред.
     
    Danil005 нравится это.
  13. TeslaFeo

    TeslaFeo Старожил

    С нами с:
    9 мар 2016
    Сообщения:
    2.984
    Симпатии:
    759
    Выспался и всё придумал :)
    Создаешь три таблицы.
    1. переписки --- | id_переписки | id_инициатора_переписки | ну и дальше сам смотри. Темы, даты, хераты, как сам хочешь...
    2. участники переписки --- | id_записи | id_переписки | id_участника |
    3. сообщения --- | id_сообщения | текст сообщения | id_автора | id_переписки |

    Вытягиваешь все переписки, в которых участвует пользователь, если надо, вытягиваешь инфу о самих переписках и вытягиваешь все сообщения этих переписок.

    Логика, думаю, ясна...

    Плюс этой схемы в том, что у тебя нет ограничений на количество участников переписки.
     
    Danil005 нравится это.
  14. Danil005

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

    С нами с:
    2 янв 2015
    Сообщения:
    528
    Симпатии:
    30
    Вот это гениально! Как я не додумался до этого... Спасибо большое!
    --- Добавлено ---
    Слишком много запросов, мне не нужны участники переписки, однако спасибо, возьму на заметку.)