За последние 24 часа нас посетили 17687 программистов и 1715 роботов. Сейчас ищут 1757 программистов ...

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

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

  1. _ne_scaju_

    _ne_scaju_ Старожил

    С нами с:
    25 ноя 2016
    Сообщения:
    2.149
    Симпатии:
    118
    не как сообразить не могу, как отправить смс методом post.
    Есть форма, write_mess.php
    PHP:
    1. <form action="/phpmessages/send_mess.php" method="post" enctype="multipart/form-data">
    2. <input name="to", value="<?php echo $_SESSION['user_id']; ?>"><br>
    3. <textarea name="message" placeholder="Введите Ваше сообщение.."></textarea><br />
    4. <input type="submit"  value="Отправить" />
    5. </form>
    И обработчик к этой форме, send_mess.php
    PHP:
    1. <?php
    2. session_start();//Подключаю сессию
    3. //Подключаю БД и разные функции
    4. include($_SERVER['DOCUMENT_ROOT'].'/system/inc/inc.php');
    5. error_reporting(E_ALL); // E_ALL - отображаем ВСЕ ошибки
    6.  
    7. $user_id = $_SESSION['user_id'];
    8. if(isset($_POST['send']) && isset($_POST['to']) && isset($_POST['message'])){
    9.  
    10. $to = (int)$_POST['to'];//кому будем отправлять
    11. $message= htmlspecialchars($_POST['message']);
    12.  
    13. var_dump($to);
    14. if(isset($message) AND !empty($message)){
    15.  
    16. $sql = $pdo->prepare("INSERT INTO `messages1`
    17. (`u_from`, `u_to`, `message`, `flag`) VALUES (?, ?, ?, ?)");
    18. $sql->execute([$user_id, $to, $message, 0]);
    19. $result = $sql->fetch();
    20. $error=$sql->errorInfo();
    21.  
    22. /*Проверка результата запроса*/
    23. if($error[0]==0){
    24.     echo 'Сообщение успешно отправлено';
    25. }else{
    26.     echo 'Ошибка отправки сообщения';
    27. }
    28.  
    29. if($result){
    30.  
    31. $sql = $pdo->prepare('
    32. SELECT `user_login` FROM `users` WHERE `user_id`= ?');
    33. $sql->execute([$to]);
    34. $row = $sql->fetch();
    35. if($row){
    36. echo 'все хорошо';
    37. }else{
    38.     echo 'no_user';
    39. }
    40. }else{
    41.     echo 'no_sms';
    42. }
    43. }else{
    44.     echo 'пустое сообщение';
    45. }
    46. }else{
    47.     echo 'не заполнены поля';
    48. }
    49. ?>
    И чтобы обратится к форме я указываю в скрипте юзеров, кнопку, по которой он переходит на скрипт формы, а из формы должен попасть на обработчик, делаю это так, на странице юзеров users.php
    PHP:
    1. echo '<form action="/phpmessages/write_mess.php" method="POST" enctype="multipart/form-data">
    2. <input type="submit"  value="Написать" />
    3. </form>';
    И получается что я не могу отправить сообщение, помогите пожалуйста, добрые люди укажите на ошибки мои.
    Добавлю еще вопрос ругается на строку $for_user_id = intval($_GET['id']); если убираю проверку на нажатие кнопки. Жду ваших инструкций как это сделать правильно. ПОЖАЛУЙСТА, подскажите с методом POST как отправить сообщение.
    И правильно ли я указываю кнопку на странице юзеров, для перехода к форме а с формы на обработчик?
     
  2. _ne_scaju_

    _ne_scaju_ Старожил

    С нами с:
    25 ноя 2016
    Сообщения:
    2.149
    Симпатии:
    118
    Добавлю еще вопрос ругается на строку не на эту $for_user_id = intval($_GET['id']);
    а на эту ругается, я перепутал
    $to = (int)$_POST['to'];//кому будем отправлять
     
    #102 _ne_scaju_, 19 май 2017
    Последнее редактирование: 19 май 2017
  3. _ne_scaju_

    _ne_scaju_ Старожил

    С нами с:
    25 ноя 2016
    Сообщения:
    2.149
    Симпатии:
    118
    Народ вот у меня такая ситуация, хочу чтобы в поле в форме сразу подставлялся ник юзера типа кому отправляю, у меня получилось сделать только с, id юзера подставлять так как я их беру из сессии и get параметра. Получается так:
    От кого беру из $_SESSION
    Кому беру из $_GET
    И получается подставляется id юзеров.
    Пример в поле выводится так:
    От кого: 1
    Кому: 5
    А как же подставить в поле от кого и кому логина пользователей?
    Надо ли запрос какой-то делать?
    Если да как он примерно выглядит?
     
    #103 _ne_scaju_, 20 май 2017
    Последнее редактирование: 20 май 2017
  4. mkramer

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

    С нами с:
    20 июн 2012
    Сообщения:
    8.583
    Симпатии:
    1.761
    Ты реально не в состоянии сделать выборку ника по ID, и пишешь социальную сеть?
     
  5. _ne_scaju_

    _ne_scaju_ Старожил

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

    _ne_scaju_ Старожил

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

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

    С нами с:
    20 июн 2012
    Сообщения:
    8.583
    Симпатии:
    1.761
    перепиши условие, в чём проблема? Ты что, не хозяин своей программе?
    --- Добавлено ---
    Есть ещё <input type=hidden>, если что :)
     
  8. romach

    romach Старожил

    С нами с:
    26 окт 2013
    Сообщения:
    2.904
    Симпатии:
    719
    _ne_scaju_ нравится это.
  9. _ne_scaju_

    _ne_scaju_ Старожил

    С нами с:
    25 ноя 2016
    Сообщения:
    2.149
    Симпатии:
    118
    @mkramer
    Ура вывести все пришедшие сообщения пользователю, я вывел) Теперь надо разобраться с выводом логина для определенного пользователя, я так понял надо типа сделать запрос который равнялся логину пользователя, и в поле тогда будет логин подставляться?
    Сегодня если получится напишу.
    --- Добавлено ---
    @romach
    Огромное спасибо, попробую этот метод)
     
  10. _ne_scaju_

    _ne_scaju_ Старожил

    С нами с:
    25 ноя 2016
    Сообщения:
    2.149
    Симпатии:
    118
    Форумчане, а если я к get обращаюсь, создавая кнопку типа форм, метод пост, правильно ли так делать?
    Если не понятно опишу, что и как...
     
  11. _ne_scaju_

    _ne_scaju_ Старожил

    С нами с:
    25 ноя 2016
    Сообщения:
    2.149
    Симпатии:
    118
    Народ вы конечно можете меня считать оленем, но как отправить сообщение методом POST?
    Отправить сообщение я могу только методом GET, а метод POST мне не подается.
    Ну покажите пример пожалуйста, я честно уже неделю сижу и не могу понять как метод POST работает.
    Вот например, написать сообщение, кнопка должна быть ссылкой или button?
    Покажите маленький пример, пожалуйста, вот от куда брать id юзера кому мы хотим написать сообщения, вот от кого мы берем из СЕСИИ а вот кому мы пишем я фиг его знаю от куда взять.
    Объясните пожалуйста будьте добры, я уже не могу, неделю парюсь честное слово.
    Спасибо за ранее за ваши объяснения.
     
  12. mahmuzar

    mahmuzar Старожил

    С нами с:
    6 апр 2012
    Сообщения:
    4.631
    Симпатии:
    425
    Адрес:
    РД, г. Махачкала.
    Бро, тебе надо больше отдыхать, и учиться прочитанное "переваривать".
    Вот например так:
    HTML:
    1. <form method="POST">
    2. <input type="text" name="message">
    3. <input type="button" name="sendMessage" value="отправить">
    4. </form>
    --- Добавлено ---
    Чтобы знать кому писать, надо иметь уже список пользователей выведенный на страницу.
    Когда кликаешь "написать сообщение", то GET параметром передаешь id выбранного пользователя, и далее на сервере получив этот ид подставляешь в форму как hidden input.
    В итоге ты будешь иметь такую html форму:
    PHP:
    1. <form method="POST">
    2. <input type="hidden" name="toId" value="<?= $toId ?>">
    3. <input type="text" name="message">
    4. <input type="button" name="sendMessage" value="отправить">
    5. </form>
     
  13. igordata

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

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    @_ne_scaju_
    в смысле? А в чем отличие поста от гета?
     
  14. _ne_scaju_

    _ne_scaju_ Старожил

    С нами с:
    25 ноя 2016
    Сообщения:
    2.149
    Симпатии:
    118
    @mahmuzar
    Вы меня правильно поняли, а вот когда я создаю ссылку типа НАПИСАТЬ СМС то этот id берем из страницы пользователя, или же из страницы из скрипта куда я перенаправляю пользователя?
    Второй вопрос это должна быть ссылка или же кнопка чтобы написать смс пользователю? То есть по клику на ссылку или кнопку он перенаправляется на форму со скриптом. Покажите пример ссылки как должен выглядеть ну или кнопки? СПАСИБО за объяснения.
    @igordata
    Отличие POST от GET в том, что в методе POST в поисковой строке не видно id пользователя, и ты если пишешь одному пользователю, то ты изменить не можешь id в поисковой строке.
    А в методе GET в поисковой строке видно id пользователя, и ты можешь манипулировать ими подставлять id и писать смс данному пользователю.
     
  15. mkramer

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

    С нами с:
    20 июн 2012
    Сообщения:
    8.583
    Симпатии:
    1.761
    Одни и те же вопросы... Ты хозяин своему коду, что хочешь, то и делаешь. Хочешь - ссылку, хочешь - кнопку. Код разный будет. Я бы сделал ссылку
    Как ты можешь что-то "взять" из скрипта, который ещё не запущен? Всё же просто, и я тебе уже описывал
    PHP:
    1. // Скрипт A
    2. <a href="send-message.php?to=<?= $user["id"]; ?>">Отправить сообщение</a>
    3. // скрипт send-message.php
    4. <?php
    5. if ($_SERVER["REQUEST_METHOD"] !== "POST") {
    6.    ?>
    7.    <form action="<?= $_SERVER["REQUEST_URI"]; ?>">
    8.        <input type="hidden" name="to" value="<?= (int) $_GET["to"]; ?>">
    9.       <textarea name='message'></text>
    10.       <button>ОТправить<button>
    11.    </form>
    12.   <?php
    13. } else {
    14.     /* Записываем сообщение для пользователя, id которого в $_POST["to"] */
    15. }
    Ты вот это читал? http://phpfaq.ru/na_tanke Если читал, то всё ли понятно?
     
  16. _ne_scaju_

    _ne_scaju_ Старожил

    С нами с:
    25 ноя 2016
    Сообщения:
    2.149
    Симпатии:
    118
    @mkramer
    Я почти понял, вот to=<?=$user["id"]?> именно TO= от куда ты берешь? из страницы пользователя?
    то-есть там создана строка типа:
    PHP:
    1. вот например у меня на странице пользователей написано так, а ссылка какая будет?
    2. $for_user_id = isset($_GET['id'])  ? $_GET['id'] : false;
    3. //или же
    4. $for_user_id = intval($_GET['id']);
    Например ссылка такая у меня, правильна ли?
    PHP:
    1. echo '<a href="?go=send&for_user_id='.$for_user_id.'">Написать
    Короче я for_user_id перед переменной $for_user_id в ссылке беру из формы.
     
  17. igordata

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

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    @_ne_scaju_
    да, ты прав, в адресной строке. По сути и всё. Т.к. http 1 текстовый протокол - отличий немного. Гетом правда нельзя гарантированно отослать большие данные, потому что кто-то по пути может отрезать лишнее, ибо так сложилось исторически. А данные отправленные постом обычно приходят так как и задумано.

    Но по сути - да. И то и другое приходят текстом, который парсится.

    Поэтому и не понятно, в чем у тебя может быть затык. Шо то, шо это, почти одинаково, то да сё - ну должно работать.

    Чтобы дебагать проблемы при запросах в браузере есть возможность все запросы логировать. В панели разработчика есть вкладка Network, там можно включить лог ajax-запросов - тыкни в XHR

    upload_2017-5-30_1-5-26.png
     
  18. mkramer

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

    С нами с:
    20 июн 2012
    Сообщения:
    8.583
    Симпатии:
    1.761
    Из базы. Я этот момент опустил, сам подумай немного, а? Я же не знаю, куда ты эту ссылку хочешь ставить, и откуда будешь брать данные.
    --- Добавлено ---
    Правильная - это такая, которая работает. Если её твой скрипт правильно обрабатывает, значит она правильная.
    --- Добавлено ---
    Мозг включи, уже пол года на форуме :) Я не знаю, что в твоём приложении правильно, что нет. И никто кроме тебя не знает. Я могу тебе подход продемонстрировать.
     
  19. _ne_scaju_

    _ne_scaju_ Старожил

    С нами с:
    25 ноя 2016
    Сообщения:
    2.149
    Симпатии:
    118
    @igordata
    вроде включил, что дальше с ним делать?
    @mkramer
    Получается у тебя в базе есть поле to. А я думал ты берешь из формы этот TO=
    Надо будет попробовать подставить поле из базы, в ссылку.
     
  20. _ne_scaju_

    _ne_scaju_ Старожил

    С нами с:
    25 ноя 2016
    Сообщения:
    2.149
    Симпатии:
    118
    @mkramer
    Смотри вся фишка какая, в скрипте страница пользователя user_id.php я вывожу полную информацию о пользователе, и указываю ссылку на форму, в которой пользователь будет заполнять данные а точнее писать смс:
    PHP:
    1. <?php
    2. session_start();//Подключаю сессию
    3. //Подключаю БД и разные функции
    4. include($_SERVER['DOCUMENT_ROOT'].'/system/inc/inc.php');
    5.  
    6. $logged = true;
    7. if($logged){
    8.  
    9. //Проверяет, если пользователь в сессии
    10. if(isset($_SESSION['user_id'])){
    11. $user_id = $_SESSION['user_id'];//Сессия пользователя
    12.  
    13. //Создаем гет параметр к нему мы будем обращаться.
    14. $for_user_id = intval($_GET['id']);
    15.  
    16. //Получаем полную информацию о пользователе к которому заходим на страницу
    17. $user = $pdo->prepare('
    18. SELECT `user_id`, `user_login`, `user_photo`
    19. FROM `users`
    20. WHERE `user_id` = ?
    21. LIMIT 1');
    22. $user->execute([$for_user_id]);//Из гет параметра подставляем for_user_id
    23. $result = $user->fetchall();//Выводим результат, что получилось
    24. //проверяем, если данный пользователь, если да выводим инфу о нем
    25. if($result){
    26.   foreach($result as $all_info){
    27.       echo 'Страница '.$all_info['user_login'].'<br>';
    28.       if($all_info['user_photo']){
    29.       echo '<img src="/uploads/users/full_img/'.$all_info['user_photo'].'" height="150px"><br>';
    30.       }else{
    31.       echo '<img src="/uploads/users/full_img/no_ava/no_ava.png'. $all_info['user_photo'] .'" height="50px"><br>';
    32.       }
    33. //указываю ссылку для написания смс берем из таблици users поле user_id
    34. //а for_user получается вымышленный у меня но не суть...
    35.       echo '<a href="?go=send&for_user='.$all_info['user_id'].'">Написать сообщение</a>';
    36.     }
    37.   }else{
    38.     echo 'Пользователь не зарегистрирован, или же он удалил страницу';
    39.   }
    40. }else{
    41.   echo 'Пха вон, авторизуйся';
    42. }
    43. }
    44. ?>
    Далее если авторизованный пользователь нажал написать смс то кидаем этого пользователя на форму, где надо писать смс:
    PHP:
    1. <div class="content">
    2. //в этой строке я указываю скрипт обработки данной формы
    3. <form action="?go=msg&act=send" method="post">
    4. //А вот в эту строку вставляем как раз не известный вымышленный for_user из скрипта user_id.php
    5. <input type="hidden" name="for_user_id" placeholder="наберите id пользователя..." value="<?php echo $_GET['for_user']; ?>"/>
    6. <textarea name="message" placeholder="наберите текст..." cols="40" rows="2"></textarea><br />
    7. <input type="submit" value="Отправить" />
    8. </form>
    9. </div>
    Ну и дальше, если он не заполнил поля, то показываем ошибку, если заполнил поле для смс то оправляем данные, скрипт не полный, лишь кусочек messages.php
    PHP:
    1. <?php
    2. include($_SERVER['DOCUMENT_ROOT'].'/system/inc/inc.php');
    3. error_reporting(E_ALL); // E_ALL - отображаем ВСЕ ошибки
    4.  
    5. $act = isset($_GET['act'])  ? $_GET['act'] : false;
    6. $user_id = $_SESSION['user_id'];//Сессия пользователя
    7.  
    8. switch($act){
    9.  
    10. //################### Отправка сообщения ###################//
    11. case 'send':
    12. $error = array();//Вывод ошибок пустой массив
    13.  
    14. //Мы проверяем, если форма была отправлена эти поля берем из формы от куда и отправляем
    15. if(isset($_POST['for_user_id']) AND !empty($_POST['for_user_id']))
    16. $for_user_id = intval($_POST['for_user_id']);
    17. //Была ли отправлена форма
    18. if(isset($_POST['message']) AND !empty($_POST['for_user_id'])){
    19. $message = $_POST['message'];
    20.  
    21. //Мы проверяем все ли поля заполнены
    22. if($user_id != $for_user_id AND $for_user_id AND isset($message) AND !empty($message)){
    23.                    
    24. //Проверка на существование получателя
    25. $row = $pdo->prepare('
    26. SELECT *
    27. FROM `users`
    28. WHERE `user_id` = ?
    29. AND `user_activation` = 1
    30. LIMIT 1');
    31. $row->execute([$for_user_id]);
    32. $result_row = $row->fetch();
    33.  
    34. //Проверяем получатель существует или нет
    35. if($result_row){
    36.  
    37. //Мы проверяем, если получатель не является фактическим пользователем
    38. if($user_id != $for_user_id){
    39.  
    40. $date = date('Y-m-d H:i:s');//переменая с работой времени написания смс
    41.  
    42. //Отправляем сообщение получателю
    43. $send1 = $pdo->prepare('
    44. INSERT INTO `messages`
    45. SET
    46. `text` = ?,
    47. `for_user_id` = ?,
    48. `from_user_id` = ?,
    49. `date` = ?,
    50. `pm_read` = ?,
    51. `folder` = ?,
    52. `history_user_id` = "'.$user_id.'"');
    53. $send1->execute([$message, $for_user_id, $user_id, $date, 'no', 'inbox']);
    54. $result = $send1->fetch();
    55.  
    56. //получаем последний созданной только записи в таблице users
    57. $dbid = $pdo->lastInsertId();
    58.  
    59. }else{
    60.                 //В противном случае мы говорим, что пользователь не может отправлять сообщения самому себе
    61.     $error = 'Вы не можете отправить сообщение самому себе.';
    62. }
    63. }else{
    64.             //В противном случае мы говорим, что получатель не существует
    65.     $error = 'Получатель не существует.';
    66. }
    67. }else{
    68.         //В противном случае мы говорим, что поле пустое
    69.     $error = 'Поле является пустым. Пожалуйста, заполните поля.';
    70. }
    71.  
    72. }
    73. break;
    74.  
    75. default:
    76. echo 'в разработке вывод всех отправленных ну или полученных сообщений, а может быть не прочитанных))))';
    И что же я не так по вашему мнению делаю, не подскажите мне?

    Я вообще пишу еще раз, у меня в строке поисковой при таких условиях, которые описаны выше, при отправке видно id пользователя ссылка выходит в строке поисковой примерно такая:
    http://site/index.php?go=send&for_user=2
    Можно как то обойти чтобы id этот не видно было?
    Но когда я отправляю данные то обращаюсь к скрипту обработчику, после чего в строке поисковой ссылка получается такая:
    http://site/index.php?go=msg&act=send
    при этом данные отправлены в базу, и id не отображается, как хотелось бы и при открытии формы, сделать.
     
    #120 _ne_scaju_, 30 май 2017
    Последнее редактирование: 30 май 2017
  21. igordata

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

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    а что вообще получается делать с ними? потыкайся, может придёт идея.
     
  22. _ne_scaju_

    _ne_scaju_ Старожил

    С нами с:
    25 ноя 2016
    Сообщения:
    2.149
    Симпатии:
    118
    @igordata
    угу позже придет)
     
  23. _ne_scaju_

    _ne_scaju_ Старожил

    С нами с:
    25 ноя 2016
    Сообщения:
    2.149
    Симпатии:
    118
    @mkramer
    Продемонстрируй подход.
     
  24. mkramer

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

    С нами с:
    20 июн 2012
    Сообщения:
    8.583
    Симпатии:
    1.761
    Зачем? Если у тебя любой пользователь может посылать сообщения любому пользователю, то тебе по барабану, если кто-то id заменит. Если есть ограничения, проверь их в принимающем скрипте. Так нет устроен, часть данных видна в адресной строке
    --- Добавлено ---
    Вот в vk тоже видно: https://vk.com/im?sel=c2412, и ничего, не умирают.
    --- Добавлено ---
    PHP:
    1. // Начальные данные: в $_SESSION["user_id"] лежит текущий пользователь
    2. if (!пользователь_имеет_право_отправлять_сообщения($_SESSION["user_id"], $_GET["for_user_id"])) {
    3.     die("Пошёл на йух");
    4. }
    Вот такой подход все нормальные люди используют
    --- Добавлено ---
    Потом при получении post-запроса проверка ещё раз делается
     
    _ne_scaju_ нравится это.
  25. _ne_scaju_

    _ne_scaju_ Старожил

    С нами с:
    25 ноя 2016
    Сообщения:
    2.149
    Симпатии:
    118
    @mkramer
    Да да спасибо, +1 к репутации)
    Я понял на самой начале эту проверку надо всегда делать?
    PHP:
    1. if (!isset($_SESSION["user_id"], $_GET["for_user_id"])) {
    2.     die("Пошёл на йух");
    3. }else{
    4. echo 'выполняем код ниже ну который отвечает за отправку.';
    Кстати я даже не вижу при отправки письма id пользователей вк, а ты видишь) круто, может я не туда смотрю?
     
    #125 _ne_scaju_, 31 май 2017
    Последнее редактирование: 31 май 2017