使用jQuery $ .ajax通过php - 异步问题从MysQL中检索数据

时间:2014-09-08 15:12:44

标签: javascript php jquery mysql ajax

我遇到了对jquery ajax调用PHP请求的数据的异步处理问题。我正在从MySQL读取数据。

正在正确读取数据,但是在PHP提供数据之前,javascript正在进行处理。控制台日志显示了这一点,因为我想要它的数据不存在,尽管它在$ ajax成功后存在,并且因为日志条目的顺序是相反的。

我在SO和其他地方看过几个类似的问题,例如: jquery to php (wait for php script until result/finish) Wait for external method to complete before finishing? 但这些对我没有帮助。抱歉不理解。

我尝试了ajaxComplete方法,但没有解决它。我尝试将值(list_items和status)加载到div中,我可以在HTML页面中看到它,但是尝试从那里检索它返回'',所以当我尝试获取其文本时显然还没有。

我认为答案涉及回调的使用,但我没有找到一个我可以适应我的代码工作的例子,因为我无法理解如何在下面的情况下使用回调,尽管阅读{{ 3}}和其他来源。

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";
    }
?>

2 个答案:

答案 0 :(得分:0)

回调完全符合您的需求。他们也不难。

$.ajax({ ....
    success: function(data) {
         do_something(data);
    }
});

function do_something(data) {
   ... do something useful here ...
}

除了将其分配给变量然后进行一些记录之外,您实际上并没有对返回的数据进行任何操作。

答案 1 :(得分:0)

Javascript经常使用异步处理。这意味着,你开始做事,而不是等待它完成(没有办法“等待” - 这是有意的),你传递一些代码,以便在处理完成后运行。

这一开始很难习惯!您必须更改“正常”数据流,如下所示:

v = calculateSomeData(); doSomethingWithData(d)

这样的事情:

onFinish = function(d){doSomethingWithData(d); } calculateSomeData(onFinish)

你想要“等待数据”的事情是什么(你真的没有在这里告诉我们)......那个东西应该在你的success()回调中从ajax开始运行。