Javascript 通过php使用jQuery$.ajax从MysQL检索数据-异步问题
我在异步处理jQueryAjax调用PHP请求的数据时遇到了麻烦。我正在从MySQL读取数据 数据被正确读取,但是javascript在PHP提供数据之前就开始处理了。控制台日志显示了这一点,这是因为尽管$ajax success:之后存在数据,但在我想要的地方没有数据,而且日志条目的顺序颠倒了 我在SO和其他地方看到过几个类似的问题,比如: 但是这些对我没有帮助。对不起,我不明白 我尝试了一个完整的方法,但没有解决它。我尝试将值列表项和状态加载到一个div中,在那里我可以在HTML页面中看到它,但是尝试从那里检索它返回的值,所以当我尝试获取它的文本时,它显然还不在那里 我相信答案涉及到回调的使用,但我还没有找到一个可以在我的代码中使用的例子,因为我不明白在下面的情况下如何使用回调,尽管有阅读和其他来源Javascript 通过php使用jQuery$.ajax从MysQL检索数据-异步问题,javascript,php,jquery,mysql,ajax,Javascript,Php,Jquery,Mysql,Ajax,我在异步处理jQueryAjax调用PHP请求的数据时遇到了麻烦。我正在从MySQL读取数据 数据被正确读取,但是javascript在PHP提供数据之前就开始处理了。控制台日志显示了这一点,这是因为尽管$ajax success:之后存在数据,但在我想要的地方没有数据,而且日志条目的顺序颠倒了 我在SO和其他地方看到过几个类似的问题,比如: 但是这些对我没有帮助。对不起,我不明白 我尝试了一个完整的方法,但没有解决它。我尝试将值列表项和状态加载到一个div中,在那里我可以在HTML页面中看到它
console.log shows this:
list_items: status: 5.html:29
list_items: 3List Items status: OK 5.html:12
这是我的5.html
<html>
<head>
<script src="http://ajax.googleapis.com/ajax/libs/jquery/2.1.0/jquery.min.js"></script>
<script>
/* function to READ from MySQL */
function readMySQL( user_id, todo_name ){
var params = {user_idPOST: user_id, todo_namePOST: todo_name, action: "read"};
$.ajax({ type: "post", url: "5.php", data: params, datatype: "text",
success: function(data){
list_items = data;
status = 'OK';
console.log('list_items:', list_items, ' status:', status); // this is 5.html:12
},
error: function(jqXHR, exception) { errorMySQL(jqXHR, exception); }
});
}
/* function to signal ERRORS */
// error handling
}
/* Start */
$(document).ready(function(){
window.list_items = "";
window.status = "";
$("#read").click(function(){
var user_id=3;
var todo_name='3name';
readMySQL( user_id, todo_name );
console.log('list_items:', list_items, ' status:', status); // this is 5.html:29
});
});
</script>
</head>
<body>
<form>
<input type="button" value="Read" id="read"><p>
</form>
</body>
</html>
这里是5.php
<?php
$host = "localhost"; $user = "root"; $pass = ""; $databaseName = "informat_todo";
$tableName = "todo_list";
$con = mysqli_connect ( $host, $user, $pass, $databaseName );
// Check connection
if (mysqli_connect_errno()) { echo "Failed to connect to MySQL: " . mysqli_connect_error(); }
$action = $_POST["action"];
$user_id = $_POST["user_idPOST"];
$todo_name = $_POST["todo_namePOST"];
// READ ------------------------------------------------------------------------------------------
if($action=="read"){
$show = mysqli_query ( $con, "SELECT * FROM $tableName WHERE user_id='$user_id' AND todo_name='$todo_name' " );
$found = 0;
while($row=mysqli_fetch_array($show)){
$found = 1;
echo $row[2] ;
}
if ($found==0) { echo "failed : "; echo $user_id; echo " / "; echo $todo_name; echo " not found:"; }
}
else {
echo "failed : unknown action";
}
?>
回调正是您所需要的。他们也不难
$.ajax({ ....
success: function(data) {
do_something(data);
}
});
function do_something(data) {
... do something useful here ...
}
除了将返回的数据分配给变量然后进行一些日志记录之外,您实际上并没有对返回的数据进行任何处理。Javascript通常使用异步处理。这意味着,你开始一件事情,而不是等待它完成,没有办法等待-这是故意的,你传递一些代码,让它在处理完成后运行 一开始这有点难适应!您必须像这样更改正常数据流: v=计算中间数据; doSomethingWithDatad 对这样的事情: onFinish=函数d{doSomethingWithDatad;} 计算模型完成
不管你想等什么数据,你都不能在这里给我们看。。。这件事应该在ajax的成功回调中启动 我有两个可供选择的数据源,一旦检索到,我必须以同样的方式处理。一个源是数据库,另一个是JSON文件。用户可以选择其中之一。我想从用户选择的任何源检索数据,然后放入公共代码。但是,由于数据不在变量中,甚至在我退出success:function后尝试了一个全局变量,因此直接使用公共代码是不起作用的。也许我应该把通用代码放在一个函数中,并从成功中调用它:我将尝试并报告。没关系。ajax请求是http请求。客户端代码根本不关心产生响应的是什么:服务器发出的一个平面文件,查询数据库的一些代码,或者一大群工资过低的奴隶尽可能快地输入数据:这仍然是一个异步请求。谢谢,是的,我现在已经得到了它。呼叫过程成功:将做我想做的事。你和@BadZen的解释理顺了我的思路。我理解问题的异步本质,但对解决方案的思考是错误的。谢谢