За последние 24 часа нас посетили 17850 программистов и 1700 роботов. Сейчас ищет 1631 программист ...

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

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

  1. mkramer

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

    С нами с:
    20 июн 2012
    Сообщения:
    8.583
    Симпатии:
    1.761
    Если хочешь в эту профессию, то развивай логику. Без логики можешь диплом на следующий день смывать в унитаз, извини за грубость. Ты никогда без логики собеседование не пройдёшь. Я, к примеру, перестал заниматься серьёзным программированием, потому что понял, что серьёзную логику я не тяну. Но в веб-программировании зачастую логика уровня "вытащить из базы сообщения пользователя" - это же игрушки. Конечно, перед сотрудниками компаний типа Google или Яндекс стоят задачи сложнее, и я в такие компании и не сунусь - я знаю свой потолок, но то что мы в этой теме обсуждаем - это же просто элементарные вещи. Читай больше книг, раз проблемы, про базы данных, про алгоритмы. Кнута вряд ли потянешь, но "Алгоритмы + структуры данных=программы" Вирта - это must read для каждого. Вообще, всё, что по алгоритмизации найдёшь, старайся читать. Кнута я не потянул в своё время, может и зря себя не пересилил, скорее всего, был бы сейчас лучшим программистом, чем есть.

    Даже когда чужой код берёшь, надо сначала разобраться глубоко, что и как. Вот я сегодня изучал код JS из битрикс24, поскольку передо мной похожую задачу поставили. Так я теперь точно знаю, что и зачем они в нём написали, и почему именно так, а не по-другому.

    Извини за резкость, но просто ты жуткую чушь в коде приводишь... А задачи даже у нас не всегда стандартные, иногда приходится и своё решение придумывать, и надо быть способным, если ты уж занимаешься программированием.
     
  2. _ne_scaju_

    _ne_scaju_ Старожил

    С нами с:
    25 ноя 2016
    Сообщения:
    2.149
    Симпатии:
    118
    @mkramer
    да че нормальная критика, скажу честно мне книги не помогают, когда я читаю я вообще не понимаю о чем речь идет.
    Я хорошо понимаю когда объясняют да и еще правильно вообще супер.
    Спасибо за наставление! Кстати я прочитал мануал что означает многие ко многим, и тут я понял, обычно это 3 таблицы и обе имеют первичный ключ который будет применяться ну или соединятся с таблицей общей для двух таблиц.
    Вот и получается у нас таблица dialog_user это под таблица которая содержит в себе первичные ключи 2-х таблиц (users и dialogs) и она является общей для них.
    Ну и перейдем теперь к запросам))) и к логике)))
    По сути это элементарно, но для человека который только начал не много понимать запросы буквально в этом месяце, ошибки допустимы, так как опыта в запросах тяжелых еще маловато.
     
  3. mkramer

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

    С нами с:
    20 июн 2012
    Сообщения:
    8.583
    Симпатии:
    1.761
    Я читаю постоянно, когда работаю. На русском, на английском, свой код, чужой код. Так что учись понимать написанное
    Не, это всё понятно. Но когда ты пишешь в запросе, что у тебя id диалога должно быть равно id строчки в таблице, то просто невозможно понять, какая мысль двигала тобой при написании такого запроса
    --- Добавлено ---
    Или вот это предположение. Ну какая мысль двигала тобой, когда ты решил сравнивать id пользователя с id диалога?

    За каждой строкой кода, за каждым запросом стоит какая-то мысль. Вот я сегодня разбирал код от битрикса, на javascript-е, не сказать, чтоб сильно сложный, но я такого ещё не программировал, не попадалось в заказаз. Мне нужно написать мини-апи такое, чтоб чел вставлял на свой сайт кусок js, и у него там появлялась форма, которую он создал на нашем сайте. Вот я стал смотреть, как такая же штука реализована в битрикс24. И задача была именно понять, почему они написали каждую строчку, какая причина у них была для каждого действия, с какой мыслью программист писал этот код. Вот это и есть логическое мышление.
    --- Добавлено ---
    Вирта почитай всё-таки, если ещё не читал, там он очень просто всё объясняет, в отличие от Кнута. И книжечка маленькая совсем.
     
  4. _ne_scaju_

    _ne_scaju_ Старожил

    С нами с:
    25 ноя 2016
    Сообщения:
    2.149
    Симпатии:
    118
    @igordata
    @mkramer
    Всем доброе утро, не много потренировался в той штуке, делал запросы которые только в голову шли но мыслей мало, вот ссылка:
    http://sqlfiddle.com/#!9/e39ae/48
    и хочу у вас попросить дайте мне задания какое то чтобы я мог по сложнее запросы сделать + проверьте те запросы которые я написал, спасибо.
     
  5. _ne_scaju_

    _ne_scaju_ Старожил

    С нами с:
    25 ноя 2016
    Сообщения:
    2.149
    Симпатии:
    118
    @mkramer
    Можно задам не серьезный вопрос? когда я пишу пользователю и диалог еще не был создан, какая должна быть запись при создании диалога?
    Вот мое решение правильно ли оно, когда создаешь диалог то надо сделать так типа и юзеру1 и юзеру2 присвоить id диалога созданной записи в таблице dialogs, в запросах у меня выглядит так:
    PHP:
    1. //Здесь я проверяю существует ли диалог между 2 пользователями
    2. //Проверка на наличии созданного диалога между 2 пользователями
    3. //Правильно ли я делаю проверку диалога???
    4. $check_dialogs = $pdo->prepare('
    5. SELECT ds.*
    6. FROM `dialogs` ds
    7. JOIN `dialog_user` du
    8. ON (ds.`id` = du.`dialog_id`)
    9. WHERE du.`user_id` = "'.$user_id.'" AND du.`user_id` = "'.$to.'"');
    10. $check_dialogs->execute();
    11. $result_check = $check_dialogs->fetch();
    12.  
    13. $dialog_id = $result_check['dialog_id'];//Создаем переменную для определения id диалога
    14. $date = date('Y.m.d H:i:s');//создаем переменную для работы с датой
    15. if($dialog_id){//если диалог между 2-мя пользователями существует то просто обновляем его
    16. echo 'Просто обновляем диалог';
    17. //здесь запросы на обновления диалога
    18.  
    19. }else{//иначе создаем новый диалог
    20. echo 'вставка нового диалога между пользователями';
    21.  
    22. //создаю новую запись в dialogs
    23. $dialogs = $pdo->prepare('INSERT INTO `dialogs` SET `pm_read` = :pm_read, `idate` = :idate, `msg_num` = 0, all_msg_num = 0');
    24. $dialogs->execute(['pm_read' => 'no', 'idate' => $date]);
    25. $dialog_new_result = $dialogs->fetch();
    26.  
    27. //вставка диалога юзеру который пишет и присваиваем id диалог из таблицы dialogs
    28. $dialog_user_insert = $pdo->prepare('INSERT INTO `dialog_user` SET `dialog_id` = :dialog_id, `user_id` = :user_id');
    29. $dialog_user_insert->execute(['dialog_id' => $dialog_id_users, 'user_id' => $user_id]);
    30. $dialog_user_new_result = $dialog_user_insert->fetch();
    31.  
    32. //вставка диалога юзеру которому пишем и присваиваем id диалог из таблицы dialogs
    33. $dialog_user_insert = $pdo->prepare('INSERT INTO `dialog_user` SET `dialog_id` = :dialog_id, `user_id` = :user_id');
    34. $dialog_user_insert->execute(['dialog_id' => $dialog_id_users, 'user_id' => $to]);
    35. $dialog_user_new_result = $dialog_user_insert->fetch();
    36. }
    Правильная у меня логика сейчас? По новым созданным таблицам создаю скрипт отправки сообщения и создания диалога между пользователями.
     
  6. mkramer

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

    С нами с:
    20 июн 2012
    Сообщения:
    8.583
    Симпатии:
    1.761
    Это не логика, это её отсутствие... Как может быть в одной записи user_id быть равно двум числам?
    --- Добавлено ---
    Хотя этот запрос действительно не самый простой. Тут приём такой: join сам на себя
    Код (Text):
    1. select dialog.* from dialog  join dialog_user du1 du1.dialog_id=dialog.id join dialog_user du2 (du1.dialog_id=du2.dialog_id) where du1.user_id=1 and du2.user_id=3
    Что-то в этом роде
     
  7. _ne_scaju_

    _ne_scaju_ Старожил

    С нами с:
    25 ноя 2016
    Сообщения:
    2.149
    Симпатии:
    118
    @mkramer
    Как как это же id писавшего а второй это id принимавшего.
    Объясни мне какая должна быть запись в диалоге? Когда пишешь одно сообщение от юзера1 кому юзеру2. Должно быть 2 запроса?
     
  8. mkramer

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

    С нами с:
    20 июн 2012
    Сообщения:
    8.583
    Симпатии:
    1.761
    Я тебе показал запрос. У нас связь многие-ко-многим, про которую я тебе давал ссылку. У одной строки таблицы не может быть два разных значения одного поля - что в этом не понятного? Ты таблицу видел вообще, представляешь себе?
     
  9. _ne_scaju_

    _ne_scaju_ Старожил

    С нами с:
    25 ноя 2016
    Сообщения:
    2.149
    Симпатии:
    118
    @mkramer
    Ты показал мне при создании таблицы ты вставляешь запись так в табл. dialogs_user
    Insert (1,1), (1,2)
    Что ты этим добился ты считай такой вставкой вставил 2 записи в таблицу, ведь так ли?
     
  10. _ne_scaju_

    _ne_scaju_ Старожил

    С нами с:
    25 ноя 2016
    Сообщения:
    2.149
    Симпатии:
    118
    @mkramer
    Не срабатывает проверка на существование диалога почему то.(
     
  11. mkramer

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

    С нами с:
    20 июн 2012
    Сообщения:
    8.583
    Симпатии:
    1.761
    Ой, у меня там опечатки в запросе. Поправил бы, чего только после целого дня возни с javascript-ом не напишешь. Я on везде пропустил. Не специально. Но ты должен такие вещи замечать, а ты копипастишь, не разбираясь.
     
  12. _ne_scaju_

    _ne_scaju_ Старожил

    С нами с:
    25 ноя 2016
    Сообщения:
    2.149
    Симпатии:
    118
    @mkramer
    Почему ты думаешь что я не заметил что не хватает ON в JOIN конечно заметил честное слово, и сразу исправил. К статье ты задание мне дашь на запросы по моей таблице!
     
  13. mkramer

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

    С нами с:
    20 июн 2012
    Сообщения:
    8.583
    Симпатии:
    1.761
    Ну заметил, значит хорошо. Вообще, запрос должен работать, но тут не всегда попадаешь с первого раза. Фидл что-то не пашет, а так бы я проверил. Выглядит он для меня логично.
     
  14. _ne_scaju_

    _ne_scaju_ Старожил

    С нами с:
    25 ноя 2016
    Сообщения:
    2.149
    Симпатии:
    118
    @mkramer
    Я проверил ошибок запрос не выдает, но почему-то всегда получается вставка новой строки при проверки на существование диалога.
     
  15. _ne_scaju_

    _ne_scaju_ Старожил

    С нами с:
    25 ноя 2016
    Сообщения:
    2.149
    Симпатии:
    118
    Да и ещё кроме пропущенного ON ты пропустил дописать здесь from dialog (dialog) так как ты в начале запроса указал выбрать все поля SELECT dialig.* это я намикаю на то что я теперь стараюсь не компипастить. Ну это же не суть.
    Теперь к вопросу: я не пойму в моем условии такое...
    Если диалог существует то обновляем его иначе создаём его.
    if($dialogs){
    Обновляем диалог
    }else{
    Создаём диалог
    }
    Я к чему веду, обновлять диалог какой таблицы dialogs или же dialog_user?
    И как он правильно выглядел бы если в dialogs по сути одно поле id записи и что при update подставлять в SET а что в WHERE ну и так же в принципе в dialog_user что обновлять я не пойму, да условие я написал и теперь борюсь с ним)
     
    #240 _ne_scaju_, 19 июн 2017
    Последнее редактирование: 19 июн 2017
  16. igordata

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

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
  17. mkramer

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

    С нами с:
    20 июн 2012
    Сообщения:
    8.583
    Симпатии:
    1.761
    У меня одного фидл не открывается?
    --- Добавлено ---
    диалоги - в dialogs, связи - dialog_users. Когда в таблице один автоинкремент, делаешь "insert into dialogs id=null", и mysql сам поймёт, что вместо null надо следующее значение автоинкремента поставить
    --- Добавлено ---
    Поскольку фидл у меня не открывается, проверил запрос в Heidi SQL. Если не считать синтаксические ошибки, я написал тебе всё правильно:
    upload_2017-6-19_10-1-41.png
    upload_2017-6-19_10-2-5.png
     
  18. _ne_scaju_

    _ne_scaju_ Старожил

    С нами с:
    25 ноя 2016
    Сообщения:
    2.149
    Симпатии:
    118
    @mkramer
    К стати ты перед проверкой делаешь запрос на вывод всех полей из табл dialog_user это обязательно делать перед проверкой?
     
  19. _ne_scaju_

    _ne_scaju_ Старожил

    С нами с:
    25 ноя 2016
    Сообщения:
    2.149
    Симпатии:
    118
    @mkramer
    К стати ты перед проверкой выводиш все поля из табл dialogs это обязательно делать перед проверкой
    @mkramer
    Спасибо но я уже исправил скрипт проверка срабатывает, и все гуд вроде. В итоге я с нуля почти сам написал скрипт отправки сообщения)
    В принципе это у меня в первые такое что сам пишу скрипт, чтобы я без вас делал, а то все время компипастил и методом исключения все делал, по немногу осваиваю php и mysql. Спасибо вам ребята.
    Сегодня допишу скрипт и скину сюда типа на проверку :D а вы по критикуйте его если время у вас будет свободное, может что увидите что я делаю не так)
     
  20. mkramer

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

    С нами с:
    20 июн 2012
    Сообщения:
    8.583
    Симпатии:
    1.761
    Это я просто показал тебе, что у меня в таблице лежит :)
    О, получилось превартить копипастера в программиста. Крутяк :)
     
  21. _ne_scaju_

    _ne_scaju_ Старожил

    С нами с:
    25 ноя 2016
    Сообщения:
    2.149
    Симпатии:
    118
    @mkramer
    Конечно спасибо, но лучше не хвалить раньше времени)))
     
  22. _ne_scaju_

    _ne_scaju_ Старожил

    С нами с:
    25 ноя 2016
    Сообщения:
    2.149
    Симпатии:
    118
    @mkramer
    Все скрипт дописал, протестировал может где чего не увидел, может ты увидишь поправь меня, спасибо.
    Надеюсь будет время посмотришь на скрипт у меня там где то на 64-67 строке вопрос, есть.
     

    Вложения:

    • sendmess.zip
      Размер файла:
      2,8 КБ
      Просмотров:
      2
    #247 _ne_scaju_, 19 июн 2017
    Последнее редактирование: 19 июн 2017
  23. igordata

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

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    залей на гит
     
    denis01 нравится это.
  24. _ne_scaju_

    _ne_scaju_ Старожил

    С нами с:
    25 ноя 2016
    Сообщения:
    2.149
    Симпатии:
    118
    @igordata
    зачем, я не пойму, этот скрипт только отправка сообщения я еще буду допиливать его, полностью вывести диалоги вывести сообщения вывести последнее сообщения удаления сообщения удаления диалога и так дальше.
    Не знаю с чего начать сейчас подкинь совет.
     
  25. igordata

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

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    я вот с телефона
    не буду качать зип чтобы посмотреть код :D
     
    denis01 нравится это.