我在AWS的EC2实例中有一个应用程序,使用经典的负载均衡器,运行Apache2的LAMPP服务器和我的php文件的一些ajax调用,托管在同一个实例的文件夹中,不能正常工作。但奇怪的是,有些电话有效,而有些则无效。例如,我有一个超市的页面,它从服务器加载超市的数据(名称,地址,电话)(使用PHP文件访问MySQL数据库并返回一个json)但是没有加载商店的产品。但是如果我使用搜索字段,则会调用另一个PHP文件(但这与负责返回所有具有差异的产品非常类似,该产品在MySQL上具有where
clausule,指定了产品名称)比它完美无缺。
另一个例子是当用户在选择字段中选择状态时,调用列出州的所有城市。它不起作用。这是我用来进行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
而不是发布数据时,我一直没有得到关于ajax的响应,但是当我转到URL时,我得到的页面都是白色的,并没有#39 ; t显示echo
上的json,但也没有显示错误。如果我将echo json_encode($response)
更改为var_dump($response)
,我会得到一个包含数组$response
的页面,其中包含该州的所有城市。但仍然没有在html页面上发出ajax请求。
我从来没有真正得到错误,我没有得到任何响应,然后控制台显示Uncaught SyntaxError: Unexpected end of JSON input
,因为ajax代码一直在运行,没有响应,所以它不能解析它希望收到的json文件。当我尝试console.log(response)
时,它只显示我编写console.log
代码的文件和行,而没有任何内容,因为它没有答案。
我的猜测是URL调用可能有问题。或者可能是因为使用了负载均衡器,或者我调用的URL可能不同。我尝试使用localhost或ip,但由于它是https页面,因此它不接受对http URL的调用。当我把https放在localhost或IP之前时,它给出了错误500.我还试着指向URL上的PHP文件目录,但它也没有用。
而且,我需要调用完整的URL,因为我需要让它适用于Android和iO的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应用程序上,并使用相同的目录组织和文件。
答案 0 :(得分:0)
问题出在MySQL数据库中。字符集和校对不是UTF-8,因此具有特殊字符的请求(如ã,é或ç)不起作用,而没有特殊字符的请求正在工作。