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

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

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

  1. _ne_scaju_

    _ne_scaju_ Старожил

    С нами с:
    25 ноя 2016
    Сообщения:
    2.149
    Симпатии:
    118
    @igordata
    я часто с телефона сижу!!! Ну я думаю у тебя сенсорный телефон который зип поддерживает а то у меня не сенсорный :D но зип поддерживает, да скачай и посмотри что лучше улучшить или убрать, если конечно сможешь скачать :D
    --- Добавлено ---
    @igordata
    ты издеваешься скачай он не так много весит :D
    вопрос не работает header();
    Ошибочку кидает типа данные были уже отправлены не возможно повторно отправить стандартная ошибка с этим headerom как у всех
    PHP:
    1. echo '<script>document.location.href="?go=all_msg&good=send";</script>';//так срабатывает перенаправленные а если не поддерживает у юзера js что сделать?  
    2. header("location: ?go=all_msg&good=send");//Конечно же использовать header но блин ошибка выскакивает заголовки уже были отправлены, как бороться с этим?
     
  2. igordata

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

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    если тебе нужно - ты делай усилия
    если тебе лень залить, почему мне не должно быть лень качать? Да ещё и нагрубил.
     
    san4ez и mkramer нравится это.
  3. san4ez

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

    С нами с:
    13 авг 2016
    Сообщения:
    331
    Симпатии:
    47
  4. _ne_scaju_

    _ne_scaju_ Старожил

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

    _ne_scaju_ Старожил

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

    Вложения:

    • send_mess.zip
      Размер файла:
      2,5 КБ
      Просмотров:
      1
  6. mkramer

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

    С нами с:
    20 июн 2012
    Сообщения:
    8.583
    Симпатии:
    1.761
    Никто ничего качать не будет. Выкладывай текст или сюда, или на git, или на какой-нибудь pastebin
     
    san4ez нравится это.
  7. _ne_scaju_

    _ne_scaju_ Старожил

    С нами с:
    25 ноя 2016
    Сообщения:
    2.149
    Симпатии:
    118
    @mkramer
    согласен что качать не кто не должен и не обязан)))
    Скрипт отправки сообщения:
    PHP:
    1. <?php
    2. include($_SERVER['DOCUMENT_ROOT'].'/system/data/mysql.php'); /*Подключение к бд*/
    3. error_reporting(E_ALL); // E_ALL - отображаем ВСЕ ошибки
    4.  
    5. if(!defined('BEZ_KEY'))//типа ключ защиты
    6. die('Hacking attempt!');
    7.  
    8. $user_id = $_SESSION['user_id'];//сессия пользователя
    9. $to = intval($_POST['to_user']);//поле из формы кому будем оптравить
    10. $message = $_POST['message'];//поле из формы сообщение
    11. $error = array();//Вывод ошибок может пригодится
    12.  
    13. if(isset($message) AND !empty($message)){//если поля не заполнены то выдаем ошибку
    14.  
    15. //запрос проверка на существование получателя + проверяем активировал ли аккаунт если нет то считаем что такого пользователя нету
    16. $row = $pdo->prepare('SELECT * FROM `users`
    17. WHERE `user_id` = :user_id AND `user_activation` = 1 LIMIT 1');
    18. $row->execute(['user_id' => $to]);
    19. $result_row = $row->fetch();
    20.  
    21. if($result_row){//если пользователь не зареган то говорим что такой пользователь не зареган
    22.  
    23. if($user_id != $to){ //если пользователь старается написать себе сообщение то говорим пользователю что он сам себе не может писать
    24.  
    25. //Проверка на наличии созданного диалога между 2 пользователями
    26. $check_dialogs = $pdo->prepare('
    27. SELECT `ds`.*
    28. FROM `dialogs` ds
    29. JOIN `dialog_user` du1
    30. ON (du1.`dialog_id` = ds.`id`)
    31. JOIN `dialog_user` du2
    32. ON (du1.`dialog_id` = du2.`dialog_id`)
    33. WHERE du1.`user_id` = "'.$user_id.'" AND du2.`user_id` = "'.$to.'"');
    34. $check_dialogs->execute();
    35. $result_check = $check_dialogs->fetch();
    36. $id = $result_check['id'];//этот id будем использовать при обновлении диалога
    37.  
    38. if(!$result_check){//если диалога между 2-мя пользователями не существует то создаем его и отправляем сообщение
    39. echo 'Новый диалог<br>';
    40.  
    41. //создаем диалог между пользователями
    42. $ins_date = date('Y.m.d H:i:s');
    43. $dialogs = $pdo->prepare('INSERT INTO `dialogs` (`id`, `pm_read`, `date`, `msg_num`, `all_msg_num`) VALUES (:id, :pm_read, :dates, :msg_num, :all_msg_num)');
    44. $dialogs->execute(['id' => NULL, 'pm_read' => 'no', 'dates' => $ins_date, 'msg_num' => 1, 'all_msg_num' => 1]);
    45. $dialog_new_result = $dialogs->fetch();
    46.  
    47. //получаем последнюю созданную запись из таблицы dialogs
    48. $posledniy_InsertID = $pdo->lastInsertId();
    49.  
    50. //вставка диалога и id юзера от кого отправляем в общую таблицу dialog_user
    51. $dialog_user_insert_1 = $pdo->prepare('INSERT INTO `dialog_user` (`dialog_id`, `user_id`) VALUES (:dialog_id, :user_id)');
    52. $dialog_user_insert_1->execute(['dialog_id' => $posledniy_InsertID, 'user_id' => $user_id]);
    53.  
    54. //вставка диалога и id юзера тому кому отправляем в общую таблицу dialog_user
    55. $dialog_user_insert_2 = $pdo->prepare('INSERT INTO `dialog_user` (`dialog_id`, `user_id`) VALUES (:dialog_id, :user_id)');
    56. $dialog_user_insert_2->execute(['dialog_id' => $posledniy_InsertID, 'user_id' => $to]);
    57.  
    58. //Отправляем сообщение вставляем в базу
    59. $mess_date = date('Y.m.d H:i:s');
    60. $new_mess = $pdo->prepare('INSERT INTO `messages` (`dialog_id`, `sender_id`, `text`, `date`) VALUES (:dialog_id, :sender_id, :mess, :dates)');
    61. $new_mess->execute(['dialog_id' => $posledniy_InsertID, 'sender_id'=> $user_id, 'mess'=> $message, 'dates'=>$mess_date]);
    62. echo 'сообщение отправлено';
    63. echo '<script>document.location.href="?go=all_msg&good=send";</script>';
    64. // header("location: /system/modules/dialog/all_msg.php");
    65. // exit;
    66.  
    67. }else{//иначе обновляем диалог +1 к количеству сообщений добавляем и отправляем сообщение
    68. echo 'Диалог обновлен или же существует<br>';  
    69.  
    70. //обновляем диалог делаем плюс 1 к сообщениям
    71. $upd_date = date('Y.m.d H:i:s');//создаем переменную для даты
    72. $dialog_update = $pdo->prepare('UPDATE `dialogs` SET `pm_read`= :pm_read, `date`= :dates, `msg_num`= msg_num+1, `all_msg_num`= all_msg_num+1 WHERE `id` = "'.$id.'"');
    73. $dialog_update->execute(['pm_read' => 'no', 'dates' => $upd_date]);
    74.  
    75. //Отправляем сообщение вставляем в базу
    76. $mess_date = date('Y.m.d H:i:s');
    77. $new_mess = $pdo->prepare('INSERT INTO `messages` (`dialog_id`, `sender_id`, `text`, `date`) VALUES (:dialog_id, :sender_id, :mess, :dates)');
    78. $new_mess->execute(['dialog_id' => $id, 'sender_id'=> $user_id, 'mess'=> $message, 'dates'=>$mess_date]);
    79. echo 'сообщение отправлено';
    80. echo '<script>document.location.href="?go=all_msg&good=send";</script>';
    81. // header("location: /system/modules/dialog/all_msg.php");
    82. // exit;
    83. }
    84. }else{
    85.     echo 'вы не можете писать самому себе';
    86. }
    87. }else{
    88.     echo 'пользователь на зарегистрирован';
    89. }
    90. }else{
    91.     echo 'поле сообщение не может быть пустым';
    92. }
    93. ?>
    Форма отправки сообщения
    PHP:
    1. <?php
    2. if (!isset($_SESSION['user_id'], $_GET['to'])) {
    3. die("быстро пошел от сюда");
    4.  
    5. }else{ ?>
    6.  
    7. <div class="content">
    8. <form action="?go=send_msg" method="POST">
    9. <input type="" name="to_user" placeholder="наберите id пользователя..." value="<?= (int)$_GET['to']; ?>"/>
    10. <textarea name="message" placeholder="наберите текст..." cols="40" rows="2"></textarea><br />
    11. <input type="submit" value="Отправить" />
    12. </form>
    13. </div>
    14.  
    15. <?php } ?>
    Посмотрите что в коде не так, когда проверял на ошибки старался исправить их.
     
    #257 _ne_scaju_, 20 июн 2017
    Последнее редактирование: 20 июн 2017
  8. _ne_scaju_

    _ne_scaju_ Старожил

    С нами с:
    25 ноя 2016
    Сообщения:
    2.149
    Симпатии:
    118
    пишу скрипт диалоги, задачу себе придумал сам и заключается в том что надо:
    1 вытащить все диалоги для одного пользователя
    2 в этот диалог поместить последнее сообщение от кого либо если он последний писал то его сообщение вывести
    3 кнопку или ссылку на открытие этого диалога, и кнопку на удаления диалога.
    В принципе последнее сообщение вытащить могу тупо делаю группировку ORDER BY `date` по дате, то есть сообщение что отправилось позже то и выведется у юзера, только выведется его сообщение что он отправлял а не его собеседник, пока что не разобрался, как вывести диалог для юзера.
     
  9. mkramer

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

    С нами с:
    20 июн 2012
    Сообщения:
    8.583
    Симпатии:
    1.761
    Можно сделать вместе join и select - очень мощный приём. Результат select - это тоже таблица. Хотя, когда мне нужно было выводить последнее сообщение, я, как я уже писал, хранил его в таблице с диалогом (и, естественно, каждый раз обновлял) - чтобы не сильно думать над запросом, а то сильно сложно получается.
     
  10. _ne_scaju_

    _ne_scaju_ Старожил

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

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

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

    _ne_scaju_ Старожил

    С нами с:
    25 ноя 2016
    Сообщения:
    2.149
    Симпатии:
    118
    вот тут спрошу, я же предлагал хранить user_id в таблице диалогов.
    Ну если я правильно понял надо хранить в таблице диалогов id сообщения и id юзера либо text сообщения и id юзера.
    Как лучше будет?
     
  13. _ne_scaju_

    _ne_scaju_ Старожил

    С нами с:
    25 ноя 2016
    Сообщения:
    2.149
    Симпатии:
    118
    @mkramer
    и еще как будет идти запись в таблицу диалог, например для последнего сообщения, вот пример: если диалога нет и юзер только пишет вставляется запись в таблицу dialog а как же сообщение последнее если только что написал сообщение юзер? Что нужно будет после вставленного сообщения делать update для таблица dialog?
     
  14. mkramer

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

    С нами с:
    20 июн 2012
    Сообщения:
    8.583
    Симпатии:
    1.761
    Ну ты тогда же не ставил задачу с отображением последнего, поэтому смысла не было, а если есть задача, смысл есть, только назвать как-нибудь типа last_sender_id, и оно меняется при каждом новом сообщении.
    Можно и обновить, можно и сразу поставить. update одной записи - быстрый запрос. Смотря, имеет ли смысл по задаче хранить не только само последнее сообщение, а и его id. А можно, кстати, и просто id последнего сообщения хранить, и тогда вполне человеческий join будет, не сложный. Вариантов масса, главное пользоваться головой :)
     
  15. _ne_scaju_

    _ne_scaju_ Старожил

    С нами с:
    25 ноя 2016
    Сообщения:
    2.149
    Симпатии:
    118
    @mkramer
    я буду просто хранить id сообщения.
    Только не пойму как вставить запись сразу если сообщение только создалось?
    Вы смотрели скрипт который я написал как вам его реализация, код вроде красивый и реализация не сложная!
    А можно его оптимизировать?
     
  16. mkramer

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

    С нами с:
    20 июн 2012
    Сообщения:
    8.583
    Симпатии:
    1.761
    Никак. Запиши сообщение, потом сделай update, один запрос обновления по первичному ключу погоды для быстродействия не сделает
     
  17. _ne_scaju_

    _ne_scaju_ Старожил

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

    _ne_scaju_ Старожил

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

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

    С нами с:
    20 июн 2012
    Сообщения:
    8.583
    Симпатии:
    1.761
    А я не пойму, что в этом сложного? Делаешь insert сообщения, а потом обновляешь какой-нибудь last_message_id у диалога. Не дифуру же решить :)
     
  20. _ne_scaju_

    _ne_scaju_ Старожил

    С нами с:
    25 ноя 2016
    Сообщения:
    2.149
    Симпатии:
    118
    @mkramer
    давно диф уравнения не решал)
    Вот код: помогите доделать я просто не пойму что не так:
    PHP:
    1. <?php
    2. /*
    3.     Appointment: Написать сообщений
    4.     name: Отпрака сообщения
    5.     File: send_msg.php
    6.     Author: _ne_scaju_
    7. */
    8.  
    9. include($_SERVER['DOCUMENT_ROOT'].'/system/data/mysql.php'); /*Подключение к бд*/
    10. error_reporting(E_ALL); // E_ALL - отображаем ВСЕ ошибки
    11.  
    12. if(!defined('BEZ_KEY'))//типа ключ защиты
    13. die('Hacking attempt!');
    14.  
    15. $user_id = $_SESSION['user_id'];//сессия пользователя
    16. $to = intval($_POST['to_user']);//поле из формы кому будем оптравить
    17. $message = $_POST['message'];//поле из формы сообщение
    18. $error = array();//Вывод ошибок может пригодится
    19.  
    20. if(isset($message) AND !empty($message)){//если поля не заполнены то выдаем ошибку
    21.  
    22. //запрос проверка на существование получателя + проверяем активировал ли аккаунт если нет то считаем что такого пользователя нету
    23. $row = $pdo->prepare('SELECT * FROM `users`
    24. WHERE `user_id` = :user_id AND `user_activation` = 1 LIMIT 1');
    25. $row->execute(['user_id' => $to]);
    26. $result_row = $row->fetch();
    27.  
    28. if($result_row){//если пользователь не зареган то говорим что такой пользователь не зареган
    29.  
    30. if($user_id != $to){ //если пользователь старается написать себе сообщение то говорим пользователю что он сам себе не может писать
    31.  
    32. //Проверка на наличии созданного диалога между 2 пользователями
    33. $check_dialogs = $pdo->prepare('
    34. SELECT `ds`.*
    35. FROM `dialogs` ds
    36. JOIN `dialog_user` du1
    37. ON (du1.`dialog_id` = ds.`id`)
    38. JOIN `dialog_user` du2
    39. ON (du1.`dialog_id` = du2.`dialog_id`)
    40. WHERE du1.`user_id` = "'.$user_id.'" AND du2.`user_id` = "'.$to.'"');
    41. $check_dialogs->execute();
    42. $result_check = $check_dialogs->fetch();
    43. $id = $result_check['id'];//этот id будем использовать при обновлении диалога
    44.  
    45. if(!$result_check){//если диалога между 2-мя пользователями не существует то создаем его и отправляем сообщение
    46. echo 'Новый диалог<br>';
    47.  
    48. //создаем диалог между пользователями
    49. $ins_date = date('Y.m.d H:i:s');
    50. $dialogs = $pdo->prepare('INSERT INTO `dialogs` (`id`, `pm_read`, `date`, `msg_num`, `all_msg_num`) VALUES (:id, :pm_read, :dates, :msg_num, :all_msg_num)');
    51. $dialogs->execute(['id' => NULL, 'pm_read' => 'no', 'dates' => $ins_date, 'msg_num' => 1, 'all_msg_num' => 1]);
    52. $dialog_new_result = $dialogs->fetch();
    53.  
    54. //получаем последнюю созданную запись из таблицы dialogs
    55. $posledniy_InsertID = $pdo->lastInsertId();
    56.  
    57. //вставка диалога и id юзера от кого в общую таблицу dialog_user
    58. $dialog_user_insert_1 = $pdo->prepare('INSERT INTO `dialog_user` (`dialog_id`, `user_id`) VALUES (:dialog_id, :user_id)');
    59. $dialog_user_insert_1->execute(['dialog_id' => $posledniy_InsertID, 'user_id' => $user_id]);
    60.  
    61. //вставка диалога и id юзера кому пишем в общую таблицу dialog_user
    62. $dialog_user_insert_2 = $pdo->prepare('INSERT INTO `dialog_user` (`dialog_id`, `user_id`) VALUES (:dialog_id, :user_id)');
    63. $dialog_user_insert_2->execute(['dialog_id' => $posledniy_InsertID, 'user_id' => $to]);
    64.  
    65.  
    66. //Отправляем сообщение вставляем в базу
    67. $mess_date = date('Y.m.d H:i:s');
    68. $new_mess = $pdo->prepare('INSERT INTO `messages` (`id`, `dialog_id`, `sender_id`, `text`, `date`) VALUES (:id, :dialog_id, :sender_id, :mess, :dates)');
    69. $new_mess->execute(['id' => NULL, 'dialog_id' => $posledniy_InsertID, 'sender_id'=> $user_id, 'mess'=> $message, 'dates'=>$mess_date]);
    70. $new_mess_result = $new_mess->fetch();
    71.  
    72. // $id_msgss = $pdo->lastInsertId();
    73. $id_msgss = $new_mess_result['id'];
    74. $sender_id = $new_mess_result['sender_id'];
    75.  
    76. echo 'сообщение отправлено';
    77.  
    78. // echo '<script>document.location.href="?go=all_msg&good=send";</script>';
    79. // header("location: /system/modules/dialog/all_msg.php");
    80. // exit;
    81.  
    82. /*//вставка последнего сообщения для ид пары диалога
    83. $message_user_insert_3 = $pdo->prepare('INSERT INTO `message_user` (`message_id`, `user_id`) VALUES (:message_id, :user_id)');
    84. $message_user_insert_3->execute(['message_id' => $id_msgss, 'user_id' => $user_id]);*/
    85.  
    86.  
    87. }else{//иначе обновляем диалог +1 к количеству сообщений добавляем и отправляем сообщение
    88. echo 'Диалог обновлен или же существует<br>';  
    89. /*
    90. //обновляем диалог делаем плюс 1 к сообщениям
    91. $upd_date = date('Y.m.d H:i:s');//создаем переменную для даты
    92. $dialog_update = $pdo->prepare('UPDATE `dialogs` SET `pm_read`= :pm_read, `date`= :dates, `msg_num`= msg_num+1, `all_msg_num`= all_msg_num+1 WHERE `id` = "'.$id.'"');
    93. $dialog_update->execute(['pm_read' => 'no', 'dates' => $upd_date]);
    94.  
    95. //Отправляем сообщение вставляем в базу
    96. $mess_date = date('Y.m.d H:i:s');
    97. $new_mess = $pdo->prepare('INSERT INTO `messages` (`id`, `dialog_id`, `sender_id`, `text`, `date`) VALUES (:id, :dialog_id, :sender_id, :mess, :dates)');
    98. $new_mess->execute(['id' => NULL,'dialog_id' => $id, 'sender_id'=> $user_id, 'mess'=> $message, 'dates'=>$mess_date]);
    99. $new_mess_result = $new_mess->fetch();
    100. // $id_msg = $new_mess_result['id'];
    101. $id_msg = $pdo->lastInsertId();
    102. echo 'сообщение отправлено';
    103. // echo '<script>document.location.href="?go=all_msg&good=send";</script>';
    104. // header("location: /system/modules/dialog/all_msg.php");
    105. // exit;
    106.  
    107. //обновляем диалог делаем плюс 1 к сообщениям
    108. $message_user_update = $pdo->prepare('UPDATE `message_user` SET `message_id`= :message_id, `user_id`= :user_id');
    109. $message_user_update->execute(['message_id' => $id_msg, 'user_id' => $user_id]);*/
    110.  
    111. }
    112.  
    113. if($result_check){
    114.  
    115. $dial = $pdo->prepare('SELECT * FROM `messages` WHERE `id` = NULL');
    116. $dial->execute();
    117. $id_aaa =$dial->fetch();
    118. $dddd = $id_aaa['id'];
    119.  
    120. $dialog_update = $pdo->prepare('UPDATE `dialogs` SET `message_id`= :message_id, `last_sender_id`= :last_sender_id WHERE `id` = "'.$id.'"');
    121. $dialog_update->execute(['message_id' => $dddd, 'last_sender_id' => $user_id]);
    122.  
    123. }
    124. }else{
    125.     echo 'вы не можете писать самому себе';
    126. }
    127. }else{
    128.     echo 'пользователь на зарегистрирован';
    129. }
    130. }else{
    131.     echo 'поле сообщение не может быть пустым';
    132. }
    133.  
    134. ?>
    помогите логику додумать чтобы последнее сообщение вставить.
     
  21. mkramer

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

    С нами с:
    20 июн 2012
    Сообщения:
    8.583
    Симпатии:
    1.761
    Так у тебя всё написано уже. Не понял совсем 70-ю строку, ведь insert не возвращает данных. Вот 72 - правильная, хоть оно у тебя закомментено

    Теперь что-то вроде
    PHP:
    1. $pdo->query("update dialogs set last_message_id=$id_msgss where id=$posledniy_InsertID");
    И всё. Строка 78 - что там за бредятина? Я по-моему писал, что скрипт обработки post должен редиректить, а не выводить что-то. И редиректить через header, а не через javascript
     
  22. _ne_scaju_

    _ne_scaju_ Старожил

    С нами с:
    25 ноя 2016
    Сообщения:
    2.149
    Симпатии:
    118
    @mkramer
    все исправил, я даже не знал что так можно тупо $pdo->query(); делать но так же данные получаются открыты я не могу плейсхолдеры использовать.
    Теперь второй вопрос, когда я делаю редирект headerom то у меня ошибочки вылетают, стандартная ошибка типа заголовки были уже отправлены.
    Остаточный вариант скрипта на сегодня, проблемы с редиректом.
    PHP:
    1. <?php
    2. include($_SERVER['DOCUMENT_ROOT'].'/system/data/mysql.php'); /*Подключение к бд*/
    3. error_reporting(E_ALL); // E_ALL - отображаем ВСЕ ошибки
    4.  
    5. if(!defined('BEZ_KEY'))//типа ключ защиты
    6. die('Hacking attempt!');
    7.  
    8. $user_id = $_SESSION['user_id'];//сессия пользователя
    9. $to = intval($_POST['to_user']);//поле из формы кому будем оптравить
    10. $message = $_POST['message'];//поле из формы сообщение
    11. $error = array();//Вывод ошибок может пригодится
    12.  
    13. if(isset($message) AND !empty($message)){//если поля не заполнены то выдаем ошибку
    14.  
    15. //запрос проверка на существование получателя + проверяем активировал ли аккаунт если нет то считаем что такого пользователя нету
    16. $row = $pdo->prepare('SELECT * FROM `users`
    17. WHERE `user_id` = :user_id AND `user_activation` = 1 LIMIT 1');
    18. $row->execute(['user_id' => $to]);
    19. $result_row = $row->fetch();
    20.  
    21. if($result_row){//если пользователь не зареган то говорим что такой пользователь не зареган
    22.  
    23. if($user_id != $to){ //если пользователь старается написать себе сообщение то говорим пользователю что он сам себе не может писать
    24.  
    25. //Проверка на наличии созданного диалога между 2 пользователями
    26. $check_dialogs = $pdo->prepare('
    27. SELECT `ds`.*
    28. FROM `dialogs` ds
    29. JOIN `dialog_user` du1
    30. ON (du1.`dialog_id` = ds.`id`)
    31. JOIN `dialog_user` du2
    32. ON (du1.`dialog_id` = du2.`dialog_id`)
    33. WHERE du1.`user_id` = "'.$user_id.'" AND du2.`user_id` = "'.$to.'"');
    34. $check_dialogs->execute();
    35. $result_check = $check_dialogs->fetch();
    36. $id = $result_check['id'];//этот id будем использовать при обновлении диалога
    37.  
    38. if(!$result_check){//если диалога между 2-мя пользователями не существует то создаем его и отправляем сообщение
    39. echo 'Новый диалог<br>';
    40.  
    41. //создаем диалог между пользователями
    42. $ins_date = date('Y.m.d H:i:s');
    43. $dialogs = $pdo->prepare('INSERT INTO `dialogs` (`id`, `pm_read`, `date`, `msg_num`, `all_msg_num`) VALUES (:id, :pm_read, :dates, :msg_num, :all_msg_num)');
    44. $dialogs->execute(['id' => NULL, 'pm_read' => 'no', 'dates' => $ins_date, 'msg_num' => 1, 'all_msg_num' => 1]);
    45. $posledniy_InsertID = $pdo->lastInsertId(); //получаем последнюю созданную запись из таблицы dialogs
    46.  
    47. //вставка диалога и id юзера от кого в общую таблицу dialog_user
    48. $dialog_user_insert_1 = $pdo->prepare('INSERT INTO `dialog_user` (`dialog_id`, `user_id`) VALUES (:dialog_id, :user_id)');
    49. $dialog_user_insert_1->execute(['dialog_id' => $posledniy_InsertID, 'user_id' => $user_id]);
    50.  
    51. //вставка диалога и id юзера кому пишем в общую таблицу dialog_user
    52. $dialog_user_insert_2 = $pdo->prepare('INSERT INTO `dialog_user` (`dialog_id`, `user_id`) VALUES (:dialog_id, :user_id)');
    53. $dialog_user_insert_2->execute(['dialog_id' => $posledniy_InsertID, 'user_id' => $to]);
    54.  
    55. //Отправляем сообщение вставляем в базу
    56. $mess_date = date('Y.m.d H:i:s');
    57. $new_mess = $pdo->prepare('INSERT INTO `messages` (`id`, `dialog_id`, `sender_id`, `text`, `date`) VALUES (:id, :dialog_id, :sender_id, :mess, :dates)');
    58. $new_mess->execute(['id' => NULL, 'dialog_id' => $posledniy_InsertID, 'sender_id'=> $user_id, 'mess'=> $message, 'dates'=>$mess_date]);
    59. $posledniy_InsertID_msg = $pdo->lastInsertId();
    60. echo 'сообщение отправлено';
    61.  
    62. //обновляем запись последнее id сообщения и id юзера отправителя
    63. $pdo->query("UPDATE `dialogs` SET `last_message_id` = $posledniy_InsertID_msg, `last_sender_id` = $user_id WHERE `id` = $posledniy_InsertID");
    64.  
    65. // echo '<script>document.location.href="?go=all_msg&good=send";</script>';
    66. header("Location: ?go=all_msg&good=send");
    67.  
    68. }else{//иначе отправляем сообщение и обновляем диалог таблицу
    69. echo 'Диалог обновлен или же существует<br>';  
    70.  
    71. //Отправляем сообщение вставляем в базу
    72. $mess_date = date('Y.m.d H:i:s');
    73. $new_mess = $pdo->prepare('INSERT INTO `messages` (`id`, `dialog_id`, `sender_id`, `text`, `date`) VALUES (:id, :dialog_id, :sender_id, :mess, :dates)');
    74. $new_mess->execute(['id' => NULL,'dialog_id' => $id, 'sender_id'=> $user_id, 'mess'=> $message, 'dates'=>$mess_date]);
    75. $new_mess_result = $new_mess->fetch();
    76. $posledniy_InsertID_msg = $pdo->lastInsertId();
    77. echo 'сообщение отправлено';
    78.  
    79. //обновляем запись последнее id сообщения и id юзера отправителя
    80. $pdo->query("UPDATE `dialogs` SET `last_message_id` = $posledniy_InsertID_msg, `last_sender_id` = $user_id WHERE `id` = $id");
    81.  
    82. // echo '<script>document.location.href="?go=all_msg&good=send";</script>';
    83. header("Location: ?go=all_msg&good=send");
    84. }
    85.  
    86. }else{
    87.     echo 'вы не можете писать самому себе';
    88. }
    89. }else{
    90.     echo 'пользователь на зарегистрирован';
    91. }
    92. }else{
    93.     echo 'поле сообщение не может быть пустым';
    94. }
    95.  
    96. ?>
    Ошибка снизу: Warning: Cannot modify header information - headers already sent by (output started at
    не хотел показывать саму ошибку, я понимаю что она означает а как бороться с ней, не понимаю. Может объяснить как исправить?
     
  23. mkramer

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

    С нами с:
    20 июн 2012
    Сообщения:
    8.583
    Симпатии:
    1.761
    Поищи по форуму, тысячу раз объясняли, из-за чего она может быть и как с этим бороться.
    Ну поскольку в этот запрос я подставляю только что полученные из базы значения автоинкремента, я как бы уверен, что там ничего кроме целых чисел не будет, в этих переменных. Но хочешь, сделай prepare, не суть :) Мне лень писать было.
    --- Добавлено ---
    Вот эту глубокомысленную надпись обязательно здесь выводить? Ещё раз: после успешной обработки POST (если это не ajax, и ты не пишешь API) не нужно ничего никуда выводить, кроме заголовка переадресации. Точка. Почитай тему с заданием от @Fell-x27, там кучу раз это обсуждалось
     
  24. _ne_scaju_

    _ne_scaju_ Старожил

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

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

    С нами с:
    20 июн 2012
    Сообщения:
    8.583
    Симпатии:
    1.761
    Ну неужели лень самому поискать, надо что в рот положили. Да, перед header не должно быть никакого вывода. Я сторонник не писать вывода перед header, @Fell-x27 сторонник поставить ob_start() в начале скрипта, и забить на всё, поскольку тогда php сам разберётся, что и когда выводить. Разжёвана эта тема в нете 1000 раз, кто-то даже целый сайт сделал, посвящённый этой ошибке. Ну реально. Вот тебя возьмут на работу, ты тоже будешь с каждым вопросом на форум бегать? Так тогда зарплатой делиться придётся. Ты же даже update элементарный не можешь написать без вопроса...