Добрый день! Столкнулся с проблемой обработки данных формы переданных через AJAX Вот код JS который формирует и посылает данные формы: Код (Text): let request = new XMLHttpRequest(); request.open("POST", "/test.php", true); request.setRequestHeader("Content-Type", "application/x-www-form-urlencoded"); let myFormData = new FormData(document.querySelector('form')); myFormData.append('n','test'); request.send(myFormData); request.onreadystatechange = function(){ if( request.readyState < 4 ){ statusMessage.innerHTML = message.loading; } else if(request.readyState === 4){ if (request.status == 200 && request.status < 300){ statusMessage.innerHTML = message.success + " " + request.responseText; console.log('Ответ сервера: ' + request.responseText) } } else { statusMessage.innerHTML = message.failure; } На стороне сервера исполняется код: Код (Text): $postData = file_get_contents('php://input'); var_dump($postData); В результате переменная $postData имеет следующее значение: Код (Text): "------WebKitFormBoundary5JzLNzUygk7B2AIA Content-Disposition: form-data; name="email" mail@example.ru ------WebKitFormBoundary5JzLNzUygk7B2AIA Content-Disposition: form-data; name="tel" 54552155 ------WebKitFormBoundary5JzLNzUygk7B2AIA Content-Disposition: form-data; name="n" test ------WebKitFormBoundary5JzLNzUygk7B2AIA-- " Вопрос: как привести ЭТО к формату JSON (удалив лишнее) и/или получить значения переменных?
ты смотрел переменную $_POST ? зачем тебе на стороне PHP нужен JSON, если в теле запроса он очевидно приходит в другом формате. --- Добавлено --- Update: заголовок "Content-Type","application/x-www-form-urlencoded" говорит принимающей стороне, что данные будут оформлены вот таким образом: request.send("foo="+ foo +"&bar="+ bar); PHP умеет самостоятельно парсить POST запрос и помещать его в переменную $_POST, если данные соответствуют методу, указанному в заголовке. а ты указал urlencoded, а фактически данные упаковал как multipart --- Добавлено --- Update 2: посмотри здесь как правильно сочетать кодировку данных, которая указывается в заголовке, и метод упаковки: https://learn.javascript.ru/xhr-forms
@MetaleX я вот такими get, post функциями пользуюсь, попробуй: Код (Javascript): function getAjax(url, success) { var xhr = window.XMLHttpRequest ? new XMLHttpRequest() : new ActiveXObject('Microsoft.XMLHTTP'); xhr.open('GET', url); xhr.onreadystatechange = function() { if (xhr.readyState>3 && xhr.status==200) success(xhr.responseText); }; xhr.setRequestHeader('X-Requested-With', 'XMLHttpRequest'); xhr.send(); return xhr; } function postAjax(url, data, success) { var token = document.querySelector('meta[name="csrf-token"]').getAttribute('content'); var params = typeof data == 'string' ? data : Object.keys(data).map( function(k){ return encodeURIComponent(k) + '=' + encodeURIComponent(data[k]) } ).join('&'); var xhr = window.XMLHttpRequest ? new XMLHttpRequest() : new ActiveXObject("Microsoft.XMLHTTP"); xhr.open('POST', url); xhr.onreadystatechange = function() { if (xhr.readyState>3 && xhr.status==200) { success(xhr.responseText); } }; xhr.setRequestHeader('X-Requested-With', 'XMLHttpRequest'); xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded'); xhr.setRequestHeader('X-CSRF-Token', token); xhr.send(params); return xhr; } Использование get: Код (Javascript): getAjax("url", function(data){ var json = JSON.parse(data); console.log(json ); }); Использование post: Код (Javascript): var a = { 'name': 'Артурик', 'nick': ' Hopf' }; postAjax('url', a, function(data){ var json = JSON.parse(data); console.log(json); }); Ну и php PHP: if(isset($_POST)){ $result = $_POST; }else{ $result = 'get запрос'; } return json_encode($result);
Здравствуйте. Для формирования блока данных использую объект FormData https://learn.javascript.ru/xhr-forms#formdata ,. По поводу кодировки попробовал использовать multipart/form-data результат такой же PHP: print_r($_POST); /* Array ( [------WebKitFormBoundaryXJ3n45YxUBmNqBKX Content-Disposition:_form-data;_name] => "email" mail@example.ru ------WebKitFormBoundaryXJ3n45YxUBmNqBKX Content-Disposition: form-data; name="tel" 54552155 ------WebKitFormBoundaryXJ3n45YxUBmNqBKX Content-Disposition: form-data; name="n" test ------WebKitFormBoundaryXJ3n45YxUBmNqBKX-- ) */ Я за 2 дня просмотрел кучу форумов везде говориться, что так и должно отправляться при использовании объекта FormData, проблема в том что я никак не могу найти как можно извлечь из "этого" нужные мне данные
Ребят всем огромнейшее спасибо за помощь! Да действительно нужно было убрать явное задание кодировки request.setRequestHeader, тогда php корректно заполнит массив $_POST. Кроме того нужно использовать версию PHP7+ (в 5.6 - передача данных данным методом была некорректна)
От версии пыха это не зависит. И нужно задавать уточняющие вопросы, если что-то непонятно. Тебе выше целую лекцию прочитали про Content-Type, а ты, видать, сразу не понял и решил проигнорить