За последние 24 часа нас посетил 22651 программист и 1256 роботов. Сейчас ищет 741 программист ...

Передаётся пустой $_POST

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

Метки:
  1. Turte_post

    Turte_post Новичок

    С нами с:
    12 фев 2019
    Сообщения:
    14
    Симпатии:
    0
    Всем привет.

    Имеется форма для отправки писем.
    Также имеются два файла: index.php и ajax.php.
    В index.php написан html код и JS. В ajax.php собственно сам код php.

    В input есть name=applicant, я его пытаюсь передать в $mail->Body = $_POST['applicant'], но мне выдаёт ошибку - Message could not be sent.Mailer Error: Message body empty. Хотя при отправке формы, указанный input имеет данные (заполняются мною). При этом если написать просто текст в $mail->Body, форма отправляется без проблем.
    Что я делаю не так, может кто подсказать? И как правильно написать код и где его правильно написать? Перечитал десяток сайтов с похожей проблемой, но решения я там себе не нашёл. Нашёл только головную боль...

    index.php -> form
    Код (Text):
    1. <form action="ajax.php" method="POST" name="request" id="request">
    2.               <h1>{{ title }}</h1>
    3.               <div class="form-group">
    4.                 <label>Номер магазина: </label>
    5.                 <select v-model="selectedUser" class="form-control">
    6.                   <option name="number" v-for="site in sites" v-bind:value="site">{{site.name}}</option>
    7.                 </select>
    8.               </div>
    9.               <div class="form-group">
    10.                 <label for="exampleInputPassword1">Адрес магазина: </label>
    11.                 <span v-if="selectedUser!==null" class="address form-control">{{selectedUser.address}}</span>
    12.               </div>
    13.               <div class="form-group">
    14.                 <label for="">Заявитель (инициатор заявки)</label>
    15.                 <input name="applicant" type="text" class="form-control"><span></span>
    16.               </div>
    17.               <div class="form-group">
    18.                 <label for="">Телефон заявителя</label>
    19.                 <input name="applicant_tel" type="text" class="form-control"><span></span>
    20.               </div>
    21.               <button type="submit" id="submit" name="submit" class="btn btn-primary">Submit</button><span></span>
    22.             </form>
    ajax.php

    Код (Text):
    1. <?php
    2.    
    3.       require 'phpmailer/class.phpmailer.php';
    4.       require 'phpmailer/class.smtp.php';
    5.       ini_set('post_max_size', '20M');
    6.       $mail = new PHPMailer;
    7.  
    8.       $mail->isSMTP();
    9.  
    10.       $mail->Host = 'smtp.gmail.com';
    11.       $mail->SMTPAuth = true;
    12.       $mail->Username = '<username>@gmail.com'; // логин от вашей почты
    13.       $mail->Password = '<password>'; // пароль от почтового ящика
    14.       $mail->SMTPSecure = 'ssl';
    15.       $mail->Port = '465';
    16.  
    17.       $mail->CharSet = 'UTF-8';
    18.       $mail->setFrom = '<username>@gmail.com'; // адрес почты, с которой идет отправка
    19.       $mail->FromName = 'Александр'; // имя отправителя
    20.       $mail->addAddress('<username>@gmail.com', 'Александр');
    21.       // $mail->SMTPDebug = 1;
    22.  
    23.       $mail->isHTML(true);
    24.  
    25.       $mail->Subject = 'Тема письма';
    26.       $mail->Body = $_POST['applicant'];
    27.  
    28.       if(!$mail->send()) {
    29.         echo 'Message could not be sent.';
    30.         echo 'Mailer Error: ' . $mail->ErrorInfo;
    31.        } else {
    32.         echo 'ok';
    33.        }
    34.        print_r($_POST);
    35.      
    36.     ?>
    Прошу тапками и прочими вещами меня не закидывать :)
     
  2. mkramer

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

    С нами с:
    20 июн 2012
    Сообщения:
    8.555
    Симпатии:
    1.754
    По опыту пустой пост говорит о том, что где-то происходит ненужный редирект. Т.е. косяк с htaccess, перенаправлениями с www на без www, c http на https и прочее. Т.е. открываешь инструменты разработчика в браузере, и смотришь, нету ли редиректов при твоём post-запросе
     
  3. Turte_post

    Turte_post Новичок

    С нами с:
    12 фев 2019
    Сообщения:
    14
    Симпатии:
    0
    вся эта муть пока открывается с помощью OpenServer. Здесь нет ещё никаких .htaccess файлов и перенаправлений...
     
  4. ADSoft

    ADSoft Старожил

    С нами с:
    12 мар 2007
    Сообщения:
    3.824
    Симпатии:
    738
    Адрес:
    Татарстан
    судя по index.php вся
    та муть у вас с использование vue
    и код index.php неполный
    чего там нагорожено - хз
     
  5. MouseZver

    MouseZver Суперстар

    С нами с:
    1 апр 2013
    Сообщения:
    7.752
    Симпатии:
    1.322
    Адрес:
    Лень
    @Turte_post, нужно методом тыка проверять, от и до. Тим Виер есть ?
     
  6. Turte_post

    Turte_post Новичок

    С нами с:
    12 фев 2019
    Сообщения:
    14
    Симпатии:
    0
    Да я уже тыкал вчера, куда только можно. Подскажите направления куда потыкать, я потыкаю. А Тим Виер, найдём если понадобиться, но не сегодня.
    --- Добавлено ---
    Vue действительно использую, полный код index.php могу только после 21 часов по МСК кинуть. Только в input с name=applicant нет кода vue. Туда пишу ручками буквы и цифры.
     
  7. ADSoft

    ADSoft Старожил

    С нами с:
    12 мар 2007
    Сообщения:
    3.824
    Симпатии:
    738
    Адрес:
    Татарстан
    в самом начале скрипта
    PHP:
    1. <?php
    2. print_r($_POST);
    3. .....
    и посмотри (выложи сюда) что там
     
  8. Turte_post

    Turte_post Новичок

    С нами с:
    12 фев 2019
    Сообщения:
    14
    Симпатии:
    0
    upload_2019-2-13_21-16-55.png
    В ответе пустой массив...

    Полный index.php:

    Код (Text):
    1. <!DOCTYPE html>
    2. <html>
    3.   <head>
    4.     <meta charset="utf-8">
    5.     <meta name="viewport" content="width=device-width,initial-scale=1.0">
    6.     <title>requestkraftway</title>
    7.     <link rel="stylesheet" href="css/style.css">
    8.     <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0/css/bootstrap.min.css" integrity="sha384-Gn5384xqQ1aoWXA+058RXPxPg6fy4IWvTNh0E263XmFcJlSAwiGgFAW/dAiS6JXm" crossorigin="anonymous">
    9.   </head>
    10.   <body>
    11.  
    12.     <div class="container">
    13.       <div class="row">
    14.         <div class="col-6 offset-3">
    15.           <div id="app">
    16.             <form action="ajax.php" method="POST" name="request" id="request">
    17.               <h1>{{ title }}</h1>
    18.               <div class="form-group">
    19.                 <label>Номер магазина: </label>
    20.                 <select v-model="selectedUser" class="form-control">
    21.                   <option name="number" v-for="site in sites" v-bind:value="site">{{site.name}}</option>
    22.                 </select>
    23.               </div>
    24.               <div class="form-group">
    25.                 <label for="exampleInputPassword1">Адрес магазина: </label>
    26.                 <span v-if="selectedUser!==null" class="address form-control">{{selectedUser.address}}</span>
    27.               </div>
    28.               <div class="form-group">
    29.                 <label for="">Заявитель (инициатор заявки)</label>
    30.                 <input name="applicant" type="text" class="form-control"><span></span>
    31.               </div>
    32.               <div class="form-group">
    33.                 <label for="">Телефон заявителя</label>
    34.                 <input name="applicant_tel" type="text" class="form-control"><span></span>
    35.               </div>
    36.               <button type="submit" id="submit" name="submit" class="btn btn-primary">Submit</button><span></span>
    37.             </form>
    38.           </div>
    39.         </div>
    40.       </div>
    41.     </div>
    42.  
    43.    
    44.     <script src="http://code.jquery.com/jquery-latest.js"></script>
    45.     <script src="vue.js"></script>
    46.     <script>
    47.         var app = new Vue({
    48.             el: '#app',
    49.             data: {
    50.                 sites:[
    51.                     {name:'203', address:'!'},
    52.                     {name:'452', address:'!'},
    53.                  
    54.                 ],
    55.                 selectedUser: 'Выбери номер магазина',
    56.                 title: '!'
    57.             },
    58.          
    59.         });
    60.      
    61.         $(function(){
    62.           'use strict';
    63.             $('#request').on('submit', function(e){
    64.               e.preventDefault();
    65.               var errors = false;
    66.               $(this).find('input, textarea').each(function(){
    67.                 if( $.trim( $(this).val() ) == '' ) {
    68.                   errors = true;
    69.                   $(this).next().text( 'Не заполнено поле ' + $(this).prev().text() );
    70.                 }
    71.               });
    72.  
    73.               if( !errors ) {
    74.                 var data = $('#request').serialize();
    75.                 $.ajax({
    76.                   url:'ajax.php',
    77.                   type: 'POST',
    78.                   data: data,
    79.                   contentType: false,
    80.                   processData:false,
    81.                   success: function(msg){
    82.                     if(msg == 'ok'){
    83.                       $('#request').find('input,textarea').val('');
    84.                       $('#sumbit').next().text('Отправлено!');
    85.                     }else{
    86.                       $('#submit').next().text('Ошибка!');
    87.                     }
    88.                   }
    89.                 })
    90.               }
    91.             })
    92.         })
    93.     </script>
    94.   </body>
    95. </html>

    По поводу vue. Убрал (см. закомментировал) код, который относится к vue, всё равно возвращает пустой массив. Но если код оставить, а закомментировать только ссылку на библиотеку vue, отправляет без проблем. Только сейчас это проделал и нифига не понял как так...
     
  9. mkramer

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

    С нами с:
    20 июн 2012
    Сообщения:
    8.555
    Симпатии:
    1.754
    Ну и жуть ты пишешь... Нахрена там Vue? Хотя vue действительно не должна была повлиять, наживую надо в отладчике смотреть, что происходит, так не сказать
     
  10. Turte_post

    Turte_post Новичок

    С нами с:
    12 фев 2019
    Сообщения:
    14
    Симпатии:
    0
    Изначально предполагалась форма на vue, можно сказать, в рамках самообучения, понимания работы.
    Но потом пришла идея, отправлять эту форму на почту через smtp и вот я оказался на форуме по php...
    Главное, если убрать полностью код vue, php код всё равно не работает. Выдаёт пустой массив.
    @mkramer, в какой части отладчика смотреть, что происходит? Я попробую сам покопаться. Что-то у меня ситуация возникает: Смотрю в книгу - вижу фигу.
     
  11. Turte_post

    Turte_post Новичок

    С нами с:
    12 фев 2019
    Сообщения:
    14
    Симпатии:
    0
    Кстати, сегодня на досуге узнал, что Vue и Laravel неплохо дружат между собой, кто что сможет сказать. Если здесь получаются костыли, может рассмотреть связку Vue + Laravel (Laravel касаемо только отправки письма) или этот php фреймворк сложноват для большого новичка в php?
     
  12. TeslaFeo

    TeslaFeo Старожил

    С нами с:
    9 мар 2016
    Сообщения:
    2.989
    Симпатии:
    759
    в браузере заголовки запроса глянь
    уходит пост?
     
  13. mkramer

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

    С нами с:
    20 июн 2012
    Сообщения:
    8.555
    Симпатии:
    1.754
    Всё смешалось, и люди, и кони :) PHP на сервере, Vue - на клиенте (может на сервере, но пока туда не лезем). Так что Vue наплевать, на чём серверная часть, чистый там PHP, Laravel или Slim или вообще Java :)
    В твоём случае я бы начал с отладки клиентской части, а вообще, отправляется ли это поле. Серилизуется ли оно верно. Вот покажи что внизу в вкладке headers у тебя? Если на клиенте всё работает, то уже смотреть, что не так на сервере.
    Ну с клиента ты по smtp в любом случае ничего не отправишь, значит надо как-то передать инфу на сервер
     
  14. TeslaFeo

    TeslaFeo Старожил

    С нами с:
    9 мар 2016
    Сообщения:
    2.989
    Симпатии:
    759
    скорее всего, не уходит
     
  15. mkramer

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

    С нами с:
    20 июн 2012
    Сообщения:
    8.555
    Симпатии:
    1.754
    Повторюсь, Vue всё равно на чём Backend. Просто Laravel некоторые свои инструменты заточил в рассчёте на использование Vue. Но не надо лезть тебе в любой фреймворк пока.
     
  16. Valick

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

    С нами с:
    12 авг 2018
    Сообщения:
    1.911
    Симпатии:
    328
    Номер магазина, телефон заявителя... Конечно это исключительно в рамках самообучения.
     
  17. Turte_post

    Turte_post Новичок

    С нами с:
    12 фев 2019
    Сообщения:
    14
    Симпатии:
    0
    @mkramer applicant=1&applicant_tel=1 данные с input передаются.
     
  18. Turte_post

    Turte_post Новичок

    С нами с:
    12 фев 2019
    Сообщения:
    14
    Симпатии:
    0
    Пост уходит в заголовке.
    --- Добавлено ---
    При всем моем уважении к людям на этом форуме, оставьте, пожалуйста, свои домыслы при себе.
     
  19. ADSoft

    ADSoft Старожил

    С нами с:
    12 мар 2007
    Сообщения:
    3.824
    Симпатии:
    738
    Адрес:
    Татарстан
    имхо все-же че-то на стороне фронта
    попробуй после строчки
    Код (Javascript):
    1. var data = $('#request').serialize();
    добавить вывод в консоль
    Код (Javascript):
    1. console.log(data);
    и посмотри в консоле .. что там (предугадывая немой вопрос - f12 - консоль)
     
  20. MouseZver

    MouseZver Суперстар

    С нами с:
    1 апр 2013
    Сообщения:
    7.752
    Симпатии:
    1.322
    Адрес:
    Лень
  21. romach

    romach Старожил

    С нами с:
    26 окт 2013
    Сообщения:
    2.904
    Симпатии:
    719
    form action="mailto:..." ) Правда я хз, работает ли оно в современных браузерах, но раньше таки отсылалось.
     
  22. Turte_post

    Turte_post Новичок

    С нами с:
    12 фев 2019
    Сообщения:
    14
    Симпатии:
    0
    Смешной такой :) Ты пишешь это после того, как я скидывал скрины с консоли) (без обид)

    Там вот что:
    upload_2019-2-14_20-30-34.png
    То есть данные передаются. Получается где-то на стороне сервера данные теряются...
     
  23. Turte_post

    Turte_post Новичок

    С нами с:
    12 фев 2019
    Сообщения:
    14
    Симпатии:
    0
    Проблема решилась на 90%.
    Я подключил другой файл jq, а именно с последней версией.
    и с запроса ajax убрал contentType

    В 10% вошла ошибка, а точнее появление текста "Ошибка!" рядом с кнопкой, но это мелочи.

    Всем спасибо, кто пытался мне помочь!
     
  24. mkramer

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

    С нами с:
    20 июн 2012
    Сообщения:
    8.555
    Симпатии:
    1.754
    @Turte_post, блин, а зачем ты contentType передавал false? Реально даже не заметил эту строчку, поскольку не ожидал, что до этого можно додуматься. Чтобы php сам обработал параметры, content type должен быть или application/x-www-form-urlencoded, или, если приложены файлы, multipart/form-data
     
  25. Ganzal

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

    С нами с:
    15 мар 2007
    Сообщения:
    9.902
    Симпатии:
    969
    php://input пробовали прочитать?