Ajax只能同步工作


Ajax only works synchronously

我有这个代码设置我的ajax请求:

function sendAjaxRequest() {
            ajax.open("post", "form.php", false);
            ajax.setRequestHeader("Content-Type", "application/json");
            ajax.onreadystatechange = gotResponseFromServer();
            ajax.send(jsonObject);
        }

这个php执行请求:

    <?php
    require_once "database_connection.php";
    con = mysqli_connect($host, $user, $password,$db)  OR die("Failed to connect to MySQL: " . mysqli_connect_error());
    $data = file_get_contents("php://input");
    $decodedData = json_decode($data);

    //$verifyCode = md5(rand()."");
    $name = $decodedData->{'name'};
    $surname = $decodedData->{'surname'};
    $email = $decodedData->{'email'};
    $phone = $decodedData->{'phone'};
    $birthDate = $decodedData->{'birthDate'};
    $studies = $decodedData->{'studies'};
    $work = $decodedData->{'work'};
    $married = $decodedData->{'married'};
    $skills = $decodedData->{'skills'};
    $hobby = $decodedData->{'hobby'};
    $city = $decodedData->{'city'};
    $gender = $decodedData->{'gender'};
    $baptized = $decodedData->{'baptized'};
    $suggestions = $decodedData->{'suggestions'};
    $sql = "INSERT INTO Voluntari (_name, _surname, _email, _phone, _birthDate, ".
            "_studies, _work, _married, _skills, _hobby, _city, _gender, _baptized, _suggestions) ".
            "VALUES ('$name', '$surname', '$email', '$phone', '$birthDate', '$studies', '$work', '$married',".
            "'$skills', '$hobby', '$city', '$gender', '$baptized', '$suggestions'  );";
    if(!mysqli_query($con,$sql)) {
        die('Error: ' . mysqli_error($con));
    } else {
        //sendConfirmationMail();
        echo "added";
    }
    mysqli_close($con);
?>

问题是,我不能使ajax请求异步,我不知道为什么。如果我同步执行,表单数据被添加到数据库中,但如果我以异步方式执行,ajax.status始终为0,ajax.readyState为1。

要将请求从异步更改为同步,我将false放在这里:

ajax.open("post", "form.php", false);
                              ^^^^^

我做错了什么?如何保持请求异步并使脚本正常工作?

除非调用函数gotResponseFromServer返回另一个函数,否则它可能应该是

ajax.onreadystatechange = gotResponseFromServer;

。您需要将一个函数赋值给onreadystatechange,而不是它的返回值。

如果您查看这里,例如:http://www.w3schools.com/ajax/ajax_xmlhttprequestrongend.asp,您将看到参数的描述如下:

open(method,url,async)
方法:请求的类型:GET或POST
Url:文件在服务器上的位置
async: true(异步)或false(同步)

要使您的请求异步,您必须调用ajax.open("post", "form.php", true);