Как получить данные, отправленные ajax в php?

Я все еще студент и новичок в веб-разработке. В настоящее время я изучаю ajax. Я хотел передать (с помощью кнопки) идентификатор моему сценарию PHP для обработки SQL и отображать данные, полученные на моей странице, без ее перезагрузки. Но похоже, что это не работает. После того, как я нажимаю кнопку, она визуально загружает страницу PHP (чего, по моему собственному пониманию, не должно было произойти при использовании ajax).

Код HTML и JavaScript:

<!DOCTYPE HTML>
<html>

<head>

</head>
<body>

<?php
  session_start();
?>
<form action = "retrieve_data.php" method = "POST" name = "searchForm">
    EMPLOYEE ID: <input type = "text" name='emp_id' id='emp_id'/>
    <input type = "submit" value = "Search" onsubmit = "searchEmp()"/>
</form>
    <br>
    NAME:<p id = "empName"></p><br>
    POSITION:<p id = "empPos"></p>

 <script>

 function searchEmp() {

            var empID = document.getElementById('emp_id').value;
            var query = "?emp_id = " + empID;
            var xhr = new XMLHttpRequest();

            xhr.onreadystatechange = function() {

           if (xhr.readyState == 4) {
              document.getElementById('empName').innerHTML = '<?php echo  $_SESSION["empName"]; ?>';
              document.getElementById('empPos').innerHTML = '<?php echo  $_SESSION["empPosition"];?>';

           }
        }

            xhr.open("GET", "retrieve_data.php" +query, true);

            xhr.send(null);

        };
    </script>

retrieve_data.php:

    <?php

session_start();
if (!empty($_GET["emp_id"])){

$_SESSION["emp_id"] = $_GET["emp_id"];
$emp_id = $_SESSION["emp_id"];

$servername = "localhost";
$username = "root";
$password = "";
$dbname = "overtimedtr";

// Create connection
$conn = mysqli_connect($servername, $username, $password, $dbname);
// Check connection
if (!$conn) {
    die("Connection failed: " . mysqli_connect_error());
}

$sql = "SELECT * FROM employees where id ='".$emp_id."'";
$result = mysqli_query($conn, $sql);

if (mysqli_num_rows($result) > 0) {
    // output data of each row
    while($row = mysqli_fetch_assoc($result)) {

        $_SESSION["empName"] = $row['name'];
        $_SESSION["empPosition"] = $row['position'];

    }
} else {
    echo "0 results";
}

mysqli_close($conn);
}

?>

Вот изображение моей html-страницы:

Как получить данные, отправленные ajax в php?

Что я пытаюсь сделать, это когда я нажимаю кнопку поиска, страница должна отображать имя и позицию без перезагрузки страницы в элементе <p>, идентификаторы которого - «empName» и «empPos», результат не тот, что я хотел , вместо этого он отображает мою страницу PHP (которая отображается пустой).

Обновлено:

Я обнаружил, что мне не нужно добавлять method = "GET" в форму, тогда страницу не нужно было обновлять, как я и хотел.

<form name = "searchForm">
        EMPLOYEE ID: <input type = "text" name='emp_id' id='emp_id'/>
        <input type = "submit" value = "Search" onsubmit = "searchEmp()"/>
</form>

Единственная оставшаяся проблема заключается в том, что я не мог получить значение $_SESSION["empName"] и $_SESSION["empPosition"] со своей страницы PHP. Что я мог сделать не так?

if (xhr.readyState == 4) {
              document.getElementById('empName').innerHTML = '<?php echo  $_SESSION["empName"]; ?>';
              document.getElementById('empPos').innerHTML = '<?php echo  $_SESSION["empPosition"];?>';

           }

Возможный дубликат Как передать переменные JavaScript в PHP?

Loek 06.06.2018 10:57

Не запускайте session_start дважды. это должно быть только один раз и в начале файла.

hanish singla 06.06.2018 10:58

Измените onClick на onSubmit и добавьте event.preventDefault(), чтобы остановить действие формы по умолчанию.

Aniketh Saha 06.06.2018 11:08

@Loek Нет, я очень надеялся, что найду свой ответ, но был разочарован.

GenesisTepait 07.06.2018 03:09

@GenesisTepait обратите внимание, что SO - это сообщество, которое делает все возможное, чтобы ответить на каждый вопрос, который мы можем. Тем не менее, мы не можем ответить на все вопросы. Если объяснение Дкнахта вас не устраивает, проведите дополнительное исследование и отредактируйте свой вопрос. Хорошие вопросы обычно требуют хороших ответов.

Loek 07.06.2018 07:52
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
0
5
93
1

Ответы 1

В вашем коде много ошибок.

Ошибки в вашем retrieve_data.php

Когда вы используете AJAX, вы не используете $_SESSION для обмена данными; вместо этого вы распечатываете результаты, как на обычной странице, но обычно встраивают в структурированный формат, например JSON или XML. Я рекомендую вам организовать все, что вы собираетесь получить, в массив, а затем использовать функцию кодирования, такую ​​как json_encode, например:

if (mysqli_num_rows($result) > 0) {
    // output data of each row
    while($row = mysqli_fetch_assoc($result)) {
        $result["empName"] = $row['name'];
        $result["empPosition"] = $row['position'];
    }
} else {
    $result["empName"] = '0 results.';
    $result["empPosition"] = '0 results.';
}
//json encode prints the result formatted
exit(json_encode($result));

Ошибки в вашем HTML

Прежде всего, когда вы используете AJAX, вы обычноне используете формы, потому что поведение формы по умолчанию - это загрузка страницы; также информация о методе и действии уже дана в методе open(), поэтому вы становитесь избыточным (также обратите внимание, что вы указываете форме использовать POST, а AJAX использовать GET). Лучше используйте кнопку. Если вам нужно использовать формы использования, всегда возвращайте false, чтобы страница не загружалась. Кроме того, внутри onreadystatechange вы НЕ должны использовать php echo. Помните, что PHP - это препроцессор, и на стороне клиента все напечатанное становится неизменным. Вы должны использовать свойства XMLHttpRequest responseText или responseXML. Это свойства содержать полученного ответа. Если вы последуете моей рекомендации по использованию json_encode в вашем php файле, тогда вам нужно будет использовать JSON.parse для обработки полученных данных. Также в строке запроса не используйте пробелы Так например:

EMPLOYEE ID: <input type = "text" name='emp_id' id='emp_id'/>
<button onclick = "searchEmp()">Search</button>
<br>
NAME:<p id = "empName"></p><br>
POSITION:<p id = "empPos"></p>

<script>

    function searchEmp() {
        var empID = document.getElementById('emp_id').value;
        var query = "?emp_id = " + empID;
        var xhr = new XMLHttpRequest();

        xhr.onreadystatechange = function () {
            if (xhr.readyState == 4) {
                jsonResponse = JSON.parse(xhr.responseText);
                document.getElementById('empName').innerHTML = jsonResponse.empName;
                document.getElementById('empPos').innerHTML = jsonResponse.empPosition;
            }
        }

        xhr.open("GET", "retrieve_data.php" + query, true);
        xhr.send(null);
    }
</script>

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

https://www.w3schools.com/xml/ajax_intro.asp

Позвольте мне знать, если у вас есть какие-либо другие вопросы.

Я только что обнаружил, что мой if (xhr.readyState == 4) даже не запускается. Почему? Есть ли какие-то особые требования для его выполнения? Я знаю, что «4» - это числовой код, который означает «после того, как запрос был завершен, и данные ответа были полностью получены с сервера», но я думаю, что этого не происходит, я что-то упускаю?

GenesisTepait 07.06.2018 05:18

Все тот же. Я добавил alert(""+xhr.readystate) под xhr.send(), там написано 1. Как это имеет смысл?

GenesisTepait 07.06.2018 05:36

Нет, у вас путаница. После вызова send () скрипт завершится. Затем, когда в запросе произойдет изменение, JavaScript вызовет метод onreadystatechange асинхронно. Если вы поместите alert () в onreadystatechange (скажем, до if (xhr.readyState == 4) {), вы заметите, что это будет выполнено 4 раза. Я предлагаю вам поставить предупреждение (this.readyState), чтобы увидеть, что вы получите.

user9886608 07.06.2018 05:44

Я поставил alert(this.readyState) перед (xhr.readyState == 4), и он 4 раза предупреждал: 1 в качестве первого, затем 2, 3, и к последнему времени в моем предупреждении указано 4. Это смутило меня еще больше lol

GenesisTepait 07.06.2018 06:02

Это означает, что все из запроса ajax в порядке. Теперь после if (xhr.readyState == 4) { поставьте alert(this.responseText) и скажите, что там показывает. Вероятно, у вас есть синтаксическая ошибка в вашем PHP, поэтому JSON не возвращается (возвращается с некоторым предупреждением, которое не позволяет правильно его проанализировать)

user9886608 07.06.2018 06:06

Я ошибаюсь, думая, что мой PHP не тот? потому что я сменил свой document.getElementById('empName').innerHTML = jsonResponse.empName; document.getElementById('empPos').innerHTML = jsonResponse.empPosition; на document.getElementById("empName").innerHTML = "NICE!" document.getElementById("empPos").innerHTML = "NICE!", но он все еще не работает, вот что меня действительно смутило.

GenesisTepait 07.06.2018 07:11

закройте первые две строки выше и посмотрите, работает ли это. Я имею в виду, просто оставьте document.getElementById ("empName"). InnerHTML = "ПРИЯТНО!" document.getElementById ("empPos"). innerHTML = "ПРИЯТНО!" и давайте посмотрим, не сработает ли это по-прежнему

user9886608 08.06.2018 00:19

Другие вопросы по теме