@Delawere

Как отправить данные из JS в PHP?

Здравствуйте.
Мне нужно передать данные из js в mysql, через php. Со запросом в бд всё понятно, а отправить ajax запрос по какой то причине не выходит. "Статус" запроса = 0 (т.е. запрос не выполнился, и ответа по сути никакого нет). Все три файла (html, js, php) лежат в одной папке на локальном сервере. Вместо php кода стоял полноценный запрос к бд, сейчас просто код для проверки. После загрузки страницы в консоль выводит "XHR finished loading: POST "localhost/ex1/echo.php"."

var model = {'x': 5};

function AJAX (url, method, data) {
  var xhr = new XMLHttpRequest();
  xhr.open(method, url, true);
  xhr.send(data);

  if (xhr.status === 200) {
    alert('work');
  } else {
    alert('not work' + ' ' + xhr.status);
  }
};
AJAX('echo.php', 'POST', model);


<?php
  echo $_POST['model'];
?>
  • Вопрос задан
  • 6148 просмотров
Решения вопроса 1
padonnak
@padonnak
Получение PHP
$json = json_decode(file_get_contents('php://input'));
//ну и посмотри что приходит:
file_put_contents(__DIR__ . '/log',  json_encode($json), FILE_APPEND);


Мой вариант формирования JSON для отправки JS
let serialize = (f) => { var i, j, q; if (!f || f.nodeName !== "FORM") { return } i = j = void 0; q = {}; i = f.elements.length - 1; while (i >= 0) { if (f.elements[i].name === "") { i = i - 1; continue } switch (f.elements[i].nodeName) { case "INPUT": switch (f.elements[i].type) { case "number": case "date": case "text": case "hidden": case "password": case "button": case "reset": case "submit": q[f.elements[i].name] = f.elements[i].value; break; case "checkbox": case "radio": if (f.elements[i].checked) { q[f.elements[i].name] = f.elements[i].value } break; case "file": break }break; case "TEXTAREA": q[f.elements[i].name] = f.elements[i].value; break; case "SELECT": switch (f.elements[i].type) { case "select-one": q[f.elements[i].name] = f.elements[i].value; break; case "select-multiple": j = f.elements[i].options.length - 1; while (j >= 0) { if (f.elements[i].options[j].selected) { q[f.elements[i].name] = f.elements[i].options[j].value } j = j - 1 } }break; case "BUTTON": switch (f.elements[i].type) { case "reset": case "submit": case "button": q[f.elements[i].name] = f.elements[i].value } }i = i - 1 } return q };
 
fetch(url, { 
method: 'POST', 
body: JSON.stringify(serialize(document.forms.form_name)), 
credentials: 'same-origin', 
cache: "no-cache" 
}).then((r)=>{r.json().then((data) => {
//получаем данные
 })}, (e)=>{console.log(e)})}


#Если данные с формы form_name меняем на имя формы <form name="имя формы"
JSON.stringify(serialize(document.forms.form_name)) 

#Если данные просто массив или обьект
JSON.stringify(указываем переменную)
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 2
402d
@402d
начинал с бейсика на УКНЦ в 1988
Попробуй так
$JSON = @json_decode(file_get_contents('php://input'), true);
print_r($JSON);

или собирай корректный post запрос с form дата по стандартам
Ответ написан
ThunderCat
@ThunderCat Куратор тега PHP
{PHP, MySql, HTML, JS, CSS} developer
1) смотрим консоль на ошибки
2) смотрим нетворк на предмет что отправляет и принеимает скрипт аякса
3) не тупим, включаем отладку на сервере,
ini_set('error_reporting', E_ALL);  ini_set('display_errors', 1);
и тогда еще можно заметить что
4) по итогам пп. 3 и 4 видим, что постом отправляется $_POST['x'] а не $_POST['model'], ибо сервер нихрена не знает про model, вы ему передали пару ключ-значение.

UPD: я сейчас скажу кое что, за что меня будут пинать местные гуру фронта: Возьми гребаный JQ и не морочь себе голову. вот буквально все там нормально сделано.
var url = 'some.url';
var dataset =  {"x": 5};
$.ajax({
                url: url,
                dataType: "json",
                type: "POST",
                dataset:dataset,
                success: (function (data) {
                    if (data == 'ok') {
                        doCoolStuff();
                        alert ('Yeeei!');
                    }
                    else {
                         alert('Booo!');
                    }
                })
            })
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы