Ajax 通过 jquery 执行的对 PHP 脚本的调用不起作用

Ajax calls executed via jquery to a PHP script don't work

我在 AWS 的 EC2 实例中有一个应用程序,使用经典负载均衡器、LAMPP 服务器 运行ning Apache2 和我对 php 文件的一些 ajax 调用,托管在同一实例的文件夹中,不起作用。但奇怪的是,有些电话有效,有些则无效。例如,我有一个超市的页面,它从服务器加载超市的数据(名称、地址、phone)(使用 PHP 文件访问 MySQL 数据库和返回 json) 但不加载商店的产品。但是,如果我使用搜索字段,则会调用另一个 PHP 文件(但这与负责返回所有产品的文件非常相似,不同之处在于 where MySQL 指定产品名称)比它完美的工作。

另一个例子是当用户在 select 字段中选择一个州时,调用列出一个州的所有城市。它不起作用。这是我用来调用 ajax 的代码:

$("#state").change(function() {

    var idState = $(this).val();
    $("#cities").text("");

    $.ajax({

        type: "POST",
        url: "https://myurl.com/server/consultations/find-cities.php",
        data: {
            idState: idState,
        },
    }).done(function(response) {

        var obj = $.parseJSON(response);
        var field = $("#modal-change-city").find("#cities");
        var option = $("<option>").attr("selected", "true").attr("disabled", "true").text("City");

        field.append(option);

        obj.forEach(function(index) {

            var cityResponse = index[0];
            var select = $("#modal-change-city").find("#cities");

            var city = $("<option>").attr("value", cityResponse).text(cityResponse);

            select.append(city);
        });
    });
});

这是 PHP 文件 find-cities.php:

<?php require_once("../connection.php");

header("Access-Control-Allow-Origin: *");

$id_state = mysqli_real_escape_string($connection, $_POST['idState']);

$query = "SELECT name_city
            from cities_tb
            where id_state = $id_state";

$con = mysqli_query($connection, $query);
$response = array();

while ($data = $con->fetch_array()) {

    array_push($response, $data);
}

echo json_encode($response);
?>

当我只是 运行 php 脚本时,转到它的 URL,它给我错误 500,这是正常的。我在使用 AWS 之前在 000webhost 上测试了我的应用程序,当我尝试直接访问 URL 时也会发生此错误,但 ajax 调用在 000webhost 上有效。

当我直接将 id 放在 $id_state 而不是 post 数据时,我在 ajax 上一直没有收到任何响应,但是当我转到 [=69] =],我得到一个全白的页面,它没有在 echo 上显示 json,但也没有显示任何错误。如果我将 echo json_encode($response) 更改为 var_dump($response),我会得到一个包含数组 $response 的页面,其中包含该州的所有城市。但是在提出 ajax 请求的 html 页面上仍然没有任何内容。

我从来没有真正得到一个错误,我只是没有得到回应,然后控制台显示 Uncaught SyntaxError: Unexpected end of JSON input,因为 ajax 代码保持 运行ning,没有得到响应,因此它无法解析它预期接收的 json 文件。当我尝试 console.log(response) 时,它只显示我在其中编写 console.log 代码的文件和行,上面什么也没有,因为它没有得到答案。

我猜 URL 调用可能有问题。或者可能是因为使用了负载平衡器,或者我调用的 URL 应该不同。我尝试使用 localhost 或 ip,但由于它是一个 https 页面,它不接受对 http URLs 的调用。当我将 https 放在本地主机或 IP 之前时,它给我错误 500。我还尝试指向 URL 上的 PHP 文件的目录,但它也没有用。

而且,我需要调用完整的 URL,因为我需要让它在 Android 和 iOs 的 cordova 应用程序上运行。

目录结构如下(省略了本期不重要的部分文件夹和文件):

/var/www/html
|-js
|-css
|-img
|-all the .html files
|-server
    |-consultations
        |-find-cities.php
        |-other .php files (including the ones of the supermarket)
    |-other folders
    |-connection.php

并且仅作记录:我之前在 000webhost 上测试了所有这些并且一切正常,即使在 cordova 应用程序上,并且使用相同的目录组织和文件。

问题出在 MySQL 数据库中。字符集和排序规则不是 UTF-8,因此具有特殊字符(例如 ã、é 或 ç)的请求无效,而没有特殊字符的请求有效。