За последние 24 часа нас посетили 18927 программистов и 1667 роботов. Сейчас ищут 1029 программистов ...

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

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

  1. _ne_scaju_

    _ne_scaju_ Старожил

    С нами с:
    25 ноя 2016
    Сообщения:
    2.149
    Симпатии:
    118
    @mkramer
    Сейчас почитаю, я просто не пойму я не чего перед header не отправляю форма же где сообщение заполняет юзер не считается же?
    + не могу написать запрос на UPDATE согласен, для того чтобы написать надо потренироваться.
    Вот например напиши мне задачу для моих таблиц, что то связано с выводом диалогов, сейчас скрипт буду просто писать вывод всех пришедших и отправленных диалогов + последнее сообщение вытаскивать.
     
  2. mkramer

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

    С нами с:
    20 июн 2012
    Сообщения:
    8.580
    Симпатии:
    1.760
    Слушай, включай мозги, посмотри свой скрипт. А то я сейчас буду демонстрировать знания разных слов русского языка :)
     
  3. _ne_scaju_

    _ne_scaju_ Старожил

    С нами с:
    25 ноя 2016
    Сообщения:
    2.149
    Симпатии:
    118
    @mkramer
    :D я переместил в начало скрипта, хотел проверить что же не так, и он меня отредиректил отлично, но не на ту страницу которая указана в location, получается отредактировал на ту страницу где кнопка отправить сообщение:D ведь это же не выход из ситуации, в начало пихануть header в начала скрипта)
    header("Location: ?go=all_msg&good=send");
    exit;
    Лучше маты не пиши, да к стати уже почти сплю так, что извини бошку не включу сейчас :D занята она мыслей даже придумать запрос нету :D
     
    #278 _ne_scaju_, 21 июн 2017
    Последнее редактирование: 22 июн 2017
  4. _ne_scaju_

    _ne_scaju_ Старожил

    С нами с:
    25 ноя 2016
    Сообщения:
    2.149
    Симпатии:
    118
    @mkramer
    готов включать свои мозги) дай пожалуйста задания на запросы работа с диалогами.
     
  5. mkramer

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

    С нами с:
    20 июн 2012
    Сообщения:
    8.580
    Симпатии:
    1.760
    Какие задания? То, что ты просишь (составление и проверка заданий) люди за деньги делают, у меня на это времени нету. Ты же там пилишь чегой-то, ну вот и пили :)
     
  6. _ne_scaju_

    _ne_scaju_ Старожил

    С нами с:
    25 ноя 2016
    Сообщения:
    2.149
    Симпатии:
    118
    @mkramer
    все понял молчу) буду сейчас пробовать сделать вывод диалогов)
    Не пойму просто JOIN нужен ли использовать будет в запросе, попробую отпишусь)
     
  7. _ne_scaju_

    _ne_scaju_ Старожил

    С нами с:
    25 ноя 2016
    Сообщения:
    2.149
    Симпатии:
    118
    @mkramer
    разобрался как вытащить все диалоги пришедшие и отправленные сообщения
    PHP:
    1. $all_dialogs = $pdo->prepare('
    2. SELECT `ds`.*, ms.*
    3. FROM `dialogs` ds
    4. JOIN `dialog_user` du
    5. ON (ds.`id` = du.`dialog_id`)
    6. JOIN `messages` ms
    7. ON (ds.`last_message_id` = ms.`id`)
    8. WHERE du.`user_id` = "'.$user_id.'"');
    9. $all_dialogs->execute();
    10. $all_dialog_result = $all_dialogs->fetchall();
     
    #282 _ne_scaju_, 22 июн 2017
    Последнее редактирование: 22 июн 2017
  8. _ne_scaju_

    _ne_scaju_ Старожил

    С нами с:
    25 ноя 2016
    Сообщения:
    2.149
    Симпатии:
    118
    @mkramer
    разобрался как вытащить все диалоги, и к этому диалогу вытащить последнее сообщение кто его отправил, делал все в одном запросе. $user_id беру из сессии.
    PHP:
    1. $all_dialogs = $pdo->prepare('
    2. SELECT `ds`.*, ms.*
    3. FROM `dialogs` ds
    4. JOIN `dialog_user` du
    5. ON (ds.`id` = du.`dialog_id`)
    6. JOIN `messages` ms
    7. ON (ds.`last_message_id` = ms.`id`)
    8. WHERE du.`user_id` = "'.$user_id.'"');
    9. $all_dialogs->execute();
    10. $all_dialog_result = $all_dialogs->fetchall();
    Как вам такой запрос, а может он где то не правильно сделан)
     
    #283 _ne_scaju_, 22 июн 2017
    Последнее редактирование: 22 июн 2017
  9. mkramer

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

    С нами с:
    20 июн 2012
    Сообщения:
    8.580
    Симпатии:
    1.760
    Ничего. Только зачем prepare, если ты динамически ничего не подставил?
     
  10. _ne_scaju_

    _ne_scaju_ Старожил

    С нами с:
    25 ноя 2016
    Сообщения:
    2.149
    Симпатии:
    118
    @mkramer
    Запрос правильный в принципе? А что использовать если не prepare?
    $all_dialogs = $pdo->query('query что ли использовать??? ');
     
  11. mkramer

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

    С нами с:
    20 июн 2012
    Сообщения:
    8.580
    Симпатии:
    1.760
    Тебе в документации банят что-ли? Посмотри, попробуй.
    --- Добавлено ---
    prepare без плейсхолдеров бесполезен, только лишний запрос к БД
    --- Добавлено ---
    Видишь - join сам попробовал, почти без подсказки, и получилось :)
     
  12. _ne_scaju_

    _ne_scaju_ Старожил

    С нами с:
    25 ноя 2016
    Сообщения:
    2.149
    Симпатии:
    118
    я тут начудил еще больше запрос, вытягиваю еще логин отправителя:
    PHP:
    1. $all_dialogs = $pdo->prepare('
    2. SELECT `ds`.*, ms.*, us.*
    3. FROM `dialogs` ds
    4. JOIN `dialog_user` du
    5. ON (ds.`id` = du.`dialog_id`)
    6. JOIN `messages` ms
    7. ON (ds.`last_message_id` = ms.`id`)
    8. JOIN `users` us
    9. ON (ms.`sender_id` = us.`user_id`)
    10. WHERE du.`user_id` = "'.$user_id.'"');
    11. $all_dialogs->execute();
    12. $all_dialog_result = $all_dialogs->fetchall();
    Вот по скорости объясни что лучше:
    Сделать 2 запроса:
    в первом я буду вытягивать весь диалог
    а во втором вытягивать последнее сообщения и логин пользователя.
    Либо же использовать запрос который показываю сейчас.
    Что по скорости будет быстрее, и оптимальней с твоей точки зрения.
     
  13. mkramer

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

    С нами с:
    20 июн 2012
    Сообщения:
    8.580
    Симпатии:
    1.760
    По первичным адресам быстро всё ищется, так что тут всё равно. Эти join-ы очень простые, так что никаких проблем с производительностью не будет.
     
  14. _ne_scaju_

    _ne_scaju_ Старожил

    С нами с:
    25 ноя 2016
    Сообщения:
    2.149
    Симпатии:
    118
    @mkramer
    понятно спасибо, а вот про prepare я понял, если я не использую плейсхолдеры то толку от prepare ноль, лучше просто query в этом случае использовать?
     
  15. mkramer

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

    С нами с:
    20 июн 2012
    Сообщения:
    8.580
    Симпатии:
    1.760
    Ну да. Зачем лишние строчки писать?
     
  16. _ne_scaju_

    _ne_scaju_ Старожил

    С нами с:
    25 ноя 2016
    Сообщения:
    2.149
    Симпатии:
    118
    @mkramer
    покажи на примере как бы я мог уменьшить код?
    и что за лишние строчки я использую?
    в мануале почитал если я не передаю не какие переменные лучше использовать query() она вернет специальный объект типа PDO startament)
     
    #291 _ne_scaju_, 22 июн 2017
    Последнее редактирование: 22 июн 2017
  17. mkramer

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

    С нами с:
    20 июн 2012
    Сообщения:
    8.580
    Симпатии:
    1.760
    Ну раз прочитал, так и делай. Обязательно, чтоб ещё кто-то другой подсказал. Зачем prepare, потом execute, когда можно сразу query ?
     
  18. _ne_scaju_

    _ne_scaju_ Старожил

    С нами с:
    25 ноя 2016
    Сообщения:
    2.149
    Симпатии:
    118
    @mkramer
    да потому что не получается вытащить данные через query
     
  19. _ne_scaju_

    _ne_scaju_ Старожил

    С нами с:
    25 ноя 2016
    Сообщения:
    2.149
    Симпатии:
    118
    @mkramer
    вы говорили за такой примерно вывод через query:
    PHP:
    1. $user_id = $_SESSION['user_id'];
    2. $all_dialogs = $pdo->query('
    3. SELECT `ds`.*
    4. FROM `dialogs` ds
    5. JOIN `dialog_user` du
    6. ON (du.`dialog_id` = ds.`id`)
    7. WHERE du.`user_id` = "'.$user_id.'"');
    8. foreach ($all_dialogs as $value) {
    9.  
    10. $last_sender_id = $value['last_sender_id'];
    11. $last_message_id = $value['last_message_id'];
    12. $pm_read = $value['pm_read'];
    13. echo '<hr>';
    14. echo '<span style=color:silver;>sender: </span>'.$last_sender_id.'<br>';
    15. echo '<span style=color:silver;>msg: </span> '.$last_message_id.'<br>';
    16. echo '<span style=color:silver;>read: </span> '.$pm_read.'<br>';
    17. echo '<hr>';
    18. }
    что код будет не много меньше, как по мне так, в принципе не чего не поменялось за исключением execute выполнить и prepare подготовить исчезло. А разница в чем то? Запрос остался прежним, а что на счет sql-инекций query подвергается им.
     
  20. mkramer

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

    С нами с:
    20 июн 2012
    Сообщения:
    8.580
    Симпатии:
    1.760
    prepare без плейсхолдера тоже :) Защищает не prepare как таковой, а именно плейсхолдеры.

    Но ты же не будешь в сессию писать инъекцию?
     
  21. _ne_scaju_

    _ne_scaju_ Старожил

    С нами с:
    25 ноя 2016
    Сообщения:
    2.149
    Симпатии:
    118
    @mkramer
    я не буду писать, а кто то другой попробует, понял за prepare, и что в этом случае делается? вот ты бы делал бы query?
     
    #296 _ne_scaju_, 22 июн 2017
    Последнее редактирование: 22 июн 2017
  22. mkramer

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

    С нами с:
    20 июн 2012
    Сообщения:
    8.580
    Симпатии:
    1.760
    Я знаю, что у меня лежит в сессии - только то, что я сам туда положил :)

    И ещё раз, твой prepare ни от чего не защищает. Хочешь делать prepare - делай плейсхолдеры. Если бы там был плейсхолдер, я бы посчитал, ну ладно, чел хочет перестраховаться, не повредит. Это бы имело смысл. А так - просто смысла не имеет. Всё равно, что мыть руки после туалета в грязной луже, и считать, что этим себя обезопасил от микробов. prepare сам по себе ни от чего не защищает, защищает именно использование плейсхолдеров.
     
  23. igordata

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

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    Поздравляю, по слухам телеканал ТНТ забронировал под ваше шоу два сезона в 2017 и 2018 годах.
     
  24. gruth

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

    С нами с:
    13 май 2017
    Сообщения:
    224
    Симпатии:
    18
    :D
     
  25. _ne_scaju_

    _ne_scaju_ Старожил

    С нами с:
    25 ноя 2016
    Сообщения:
    2.149
    Симпатии:
    118
    @mkramer
    да я понял понял))) что этом запросе я не как не смогу использовать плейсхолдеры, так как нужны переменные чтобы подставить потом вместо этих плейсхолдеров в массив... А так как их нету можно воспользоваться query!!!
    --- Добавлено ---
    @igordata
    @gruth
    :D название у шоу есть? :D