Данные не передаются через Ajax в PHP-скрипт

#javascript #php #html #ajax

#javascript #php #HTML #ajax

Вопрос:

Я пытаюсь отправить значение переменной number через ajax в PHP-скрипт. Но PHP-скрипт не выводит желаемый результат при открытии в браузере. Пробовал, но не смог найти, что здесь не так. Какие-либо указатели?

index.html

 <button type="submit" class="btn btn-success" id = 'first' onclick='process();'>Submit</button>

<script>

var number = 0;

function process()
{
    number  ;

    var xhr;

    if (window.XMLHttpRequest) {
        xhr = new XMLHttpRequest();
    } else if (window.ActiveXObject) {
        xhr = new ActiveXObject("Microsoft.XMLHTTP");
    }

    var data = "num="   number;
    xhr.open("POST", "index.php", true);
    xhr.send(data);
}     
</script>
 

index.php

 <?php
session_start();
$number = $_POST['num'];
$_SESSION['numb'] = $number;
echo $_SESSION['numb'] ;
?>
 

Комментарии:

1. Как вы проверяете результат? Если вы снова откроете тот же PHP с помощью простого запроса GET, вы перезапишете старый номер.

2. Проверьте консоль Javascript на наличие ошибок. Вам не хватает закрывающей фигурной скобки для функции, поэтому она не запущена.

3. Ну да, вы не используете isset() на $_POST so $_SESSION , поэтому устанавливается false значение, а echo пусто при повторном запросе прямой страницы.

4. У вашего JS есть синтаксические ошибки, вы используете кнопку отправки, поэтому вы перезагрузите страницу, если она находится в форме, и вы ничего не делаете с HTTP-ответом, который отправляется на ваш JS!

5. Вывод index.php (echo) отправляется обратно объекту XHR в index.html . Я не вижу, где вы получаете этот ответ.

Ответ №1:

Редактирование моего длинного неубедительного ответа, поскольку вы исправили закрывающую фигурную скобку… но bloodyKnuckles прав, вам также нужно что-то в вашей функции «process», чтобы получить ответ с вашей страницы PHP и вывести его … или что вы хотите сделать. В принципе, вы можете использовать метод ‘onreadystatechange’ в объекте XMLHttpRequest, а затем искать значение свойства ‘readyState’, равное 4, что означает, что все сделано. Вот простой пример того, как просто выводить результаты на консоль (которые вы можете просмотреть с помощью инструментов разработчика в выбранном вами браузере).

 <script>

var number = 0;

function process()
{
number  ;

var xhr;

 if (window.XMLHttpRequest) {
    xhr = new XMLHttpRequest();
} else if (window.ActiveXObject) {
    xhr = new ActiveXObject("Microsoft.XMLHTTP");
}

var data = "num="   number;
xhr.onreadystatechange = function(){            

  if (xhr.readyState==4 amp;amp; xhr.status==200){
          console.log('xhr.readyState=',xhr.readyState);
          console.log('xhr.status=',xhr.status);
          console.log('response=',xhr.responseText);               
  }

  else if (xhr.readyState == 1 ){
    xhr.send(data)

  }

};

xhr.open("POST", "ajax-test.php", true);

}
</script>
 

По мере продвижения вы можете захотеть обновить свою страницу PHP, чтобы обновлять сеанс только при наличии значения POST.

 <?php
//ini_set('display_errors',1);
//ini_set('display_startup_errors',1);
//error_reporting(-1);
if(isset($_POST['num'])){
            session_start();
    $_SESSION['numb'] = $_POST['num'];
    echo $_SESSION['numb'];
}
?>
 

Вы можете раскомментировать эти строки ini_set и error_reporting, чтобы попытаться выяснить, что происходит с вашим PHP-скриптом.

Комментарии:

1. он добавил закрывающую фигурную скобку, когда редактировал вопрос несколько минут назад.

2. Большое спасибо. Вывел его на cconsole. Добавлен тип содержимого запроса в index.html и использовал isset() в $_POST на index.php . Теперь это работает.

Ответ №2:

Это потому, что вы не отправляете информацию заголовка с запросом…

Добавьте этот код

 xhr.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
xhr.setRequestHeader("Content-length", data.length);
xhr.setRequestHeader("Connection", "close");
 

после

 xhr.open("POST", "index.php", true);
 

Комментарии:

1. Большое спасибо. Добавлен тип содержимого запроса в index.html и использовал isset() в $_POST на index.php . Теперь это работает.