使用XMLHttp更新数据库后,Javascript没有从MySQL中提取正确的数据

时间:2015-08-10 20:29:50

标签: javascript php mysql ajax xmlhttprequest

newNet.php运行并正确创建新条目。 netID变量是自动增量,因此它是自动创建的。我的目标是然后检索它并在showActivities()函数中使用它来显示刚刚创建的记录。例如,它应该像这样解决; showActivities(55);

问题是SQL总是返回netID的前一个值,54而不是55;如果我说echo $result + 1;然后,根据页面源,它​​显示正在showActivities函数中正在解析的正确数字,但该函数无法找到并返回数据。但是看着DB已成功插入。

一步一步:

  1. newNet.php运行,它向MySQL数据库添加记录
  2. 获取刚刚在#1
  3. 中创建的netID
  4. 将其传递给showActivities(),并在页面上显示。{/ li>

    我怎样才能得到我想要的东西?似乎数据库的更新速度不足以满足showActivities()的请求,这可能吗?

     function newNet(str) {
       str = str;
         var xmlhttp = new XMLHttpRequest();
         xmlhttp.onreadystatechange = function() {
           if (xmlhttp.readyState === 4 && xmlhttp.status === 200) {
             document.getElementById("status").innerHTML = xmlhttp.responseText;
         }}
    
         xmlhttp.open("POST", "newNet.php", true);
         xmlhttp.setRequestHeader("Content-type","application/x-www-form-urlencoded");
         xmlhttp.send("q="+str);
    
         showActivities(<?php $stmt=$db_found->prepare("select max(netID) as netID from netLog limit 1");
           $stmt->execute();
           $result=$stmt->fetchColumn();
           echo $result;
         ?>);
     }
    

1 个答案:

答案 0 :(得分:2)

这里有两个问题:

  1. 正如我在评论中所说,你的问题与AJAX的异步性质有关。该请求实际上需要时间来处理。但是您的代码会立即开始执行showActivities,因此请求中不会返回任何结果,因为这仍然是&#34;烘焙&#34;。

  2. 您的PHP代码在页面加载时呈现。因此旧值将从数据库加载。在页面加载时,它将是54。您可以触发该Ajax请求十次,netID仍然是54,因为PHP是在服务器端而不是客户端运行。

  3. 如何解决这个问题:

    你有一个xmlhttp.onreadystatechange函数可以监听请求并在每次完成一个步骤时触发。这称为回调功能。在步骤4,披萨完成,200意味着它没有燃烧,实际上看起来很好。当状态像这样返回并且可以访问时。

     var xmlhttp = new XMLHttpRequest();
     xmlhttp.onreadystatechange = function() {
       if (xmlhttp.readyState === 4 && xmlhttp.status === 200) {
         document.getElementById("status").innerHTML = xmlhttp.responseText;
         //execute all relevant code that needs data from server from here.
         showActivities(xmlhttp.responseText);
     }}
    

    newNet.php中,您应该执行现在位于showActivities()的参数位的PHP代码。在脚本完成对数据库的插入后执行此操作。

       $stmt=$db_found->prepare("select max(netID) as netID from netLog limit 1");
       $stmt->execute();
       $result=$stmt->fetchColumn();
       echo json_encode($result);
    

    您可以json_encode结果。这样它就会以JSON格式打印到页面上。我们可以将此变量加载到JavaScript变量中。

    function showActivities(data)
    {
       //remember data is a JSON string, time to convert it into JavaScript
       var netID = JSON.parse(data);
       alert(netID); //should show the highest netID
    }
    

    了解详情:

      

    总结

         
        
    • PHP总是在加载页面之前运行,如果不重新加载页面就无法再次运行。因为发明了XMLHttpRequest
    •   
    • XMLHttpRequest需要一段时间才能完成,必须使用回调来处理其结果。
    •