Как правильно сделать POST ajax запрос?

417
28 декабря 2016, 05:47

GET-запрос работает:

var xhr = new XMLHttpRequest;
            xhr.onreadystatechange = function () {
                if (this.readyState == 4 && this.status == 200) {
                    document.querySelector('.response').innerHTML = this.responseText;
                }
            }
            xhr.open("GET", "search.php?q="+val, true);
            xhr.send();

PHP (GET):

 header("Content-type: text/plain; charset=windows-1251");
             if(ISSET($_GET)) {
                 $val = $_GET['q'];
                 echo $val;
             } else {
                 echo 'Not GET variables';
             }

POST:

var xhr = new XMLHttpRequest;
            xhr.onreadystatechange = function () {
                if (this.readyState == 4 && this.status == 200) {
                    document.querySelector('.response').innerHTML = this.responseText;
                }
            }
            xhr.open("POST", "search.php", true);
            xhr.send(val);

PHP:

header("Content-type: text/plain; charset=windows-1251");
         if(ISSET($_POST)) {
             $val = $_POST['val'];
             echo $val;
         } else {
             echo 'Not POST variables';
         }

JS полный:

var val;
    var inp = document.querySelector("#query-input");
    inp.onkeyup = function () {
        val = inp.value;
        if (val.length != 0) {
            var xhr = new XMLHttpRequest;
            xhr.onreadystatechange = function () {
                if (this.readyState == 4 && this.status == 200) {
                    document.querySelector('.response').innerHTML = this.responseText;
                }
            }
            xhr.open("POST", "search.php", true);
            xhr.send(val);
        }
    }

Не работает POST-запрос. Нет вовсе никакого ответа. Т.е. запрос-то есть, но сервер не отвечает, хотя переменная val определена. Как правильно сделать запрос?

Answer 1

Первое. Используйте empty() вместо isset(). isset() проверяет существование переменной (переменные $_GET и $_POST существуют всегда), а empty() - существует ли переменная и пуста ли она (там много нюансов, уточните их в документации). У вас в PHP-коде конструкция else никогда не сработает.

Второе. В вашем примере с POST-запросом на JavaScript переменная val содержит в себе строку в неправильном формате. Чтобы PHP смог воспользоваться ею, эта переменная должна быть строкой, имеющей формат foo=bar (foo - имя поля POST-запроса, bar - значение поля). То есть в вашем случае переменная val должна быть строкой val=example, чтобы к ней можно было обратиться в PHP как к $_POST['val']. То есть четвертую строку последнего вашего блока кода надо заменить на это:

val = 'val=' + encodeURIComponent(inp.value);

Советую вам ознакомиться со статьёй про XHR, где подробно объясняется этот момент.

Третье. В PHP используйте функции в нижнем регистре. Не ISSET(), а isset().

Четвертое. Включите отображение ошибок в PHP. Пропишите это в начале самого первого вызываемого файла:

error_reporting(E_ALL);
ini_set('display_errors', 1);

Из-за того, что у вас PHP не мог найти переменную $_POST['val'], он отбрасывал ошибку и прекращал работу, из-за чего ваш скрипт не выводил вам никакой текст.

READ ALSO
jQuery: удалить все внутренние тэги, кроме одного указанного

jQuery: удалить все внутренние тэги, кроме одного указанного

Как можно с помощью jQuery удалить все тэги внутри контейнера, кроме одного указанного? Например, как можно удалить из тэга с классомcontainer всё,...

536
Не доходят данные до Ajax

Не доходят данные до Ajax

Собственно вопрос: отправляю данные, приходит пустой ответСмотрю в панели хрома данные оправлены

424
Не работает slideToggle

Не работает slideToggle

Почему не срабатывает? И можно ли таким способом добиться такого же эффекта http://lukasz-developercom/codecanyon/menu1/index

573
Получение информации из Input на JS?

Получение информации из Input на JS?

Как лучше всего сделать получение информации из перемонной который мы получаем допустим из формы на сайте? Допустим мы спрашиваем у пользоватя:...

367