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,因此具有特殊字符(例如 ã、é 或 ç)的请求无效,而没有特殊字符的请求有效。
我在 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,因此具有特殊字符(例如 ã、é 或 ç)的请求无效,而没有特殊字符的请求有效。