Javascript在使用XMLHttp更新数据库后未从MySQL中提取正确的数据

Javascript在使用XMLHttp更新数据库后未从MySQL中提取正确的数据,javascript,php,mysql,ajax,xmlhttprequest,Javascript,Php,Mysql,Ajax,Xmlhttprequest,newNet.php运行并正确创建新条目。netID变量是一个自动递增的变量,因此它是自动创建的。我的目标是检索它并在showActivities()函数中使用它来显示刚刚创建的记录。比如应该这样解决,展示活动(55) 问题是SQL总是返回以前的值netID,54,而不是55;如果我说echo$result+1;然后,根据页面来源,它显示正在showActivities函数中解析正确的数字,但函数无法找到并返回数据。但从数据库来看,它已成功插入 因此,一步一步: newNet.php运行时,它会

newNet.php
运行并正确创建新条目。
netID
变量是一个自动递增的变量,因此它是自动创建的。我的目标是检索它并在
showActivities()
函数中使用它来显示刚刚创建的记录。比如应该这样解决,<代码>展示活动(55)

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

因此,一步一步:

  • newNet.php
    运行时,它会向MySQL数据库添加一条记录
  • 获取刚刚在#1中创建的
    netID
  • 将其传递到显示在页面上的
    showActivities()
  • 我怎样才能在这里得到我想要的?数据库的更新速度似乎不足以满足来自
    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;
         ?>);
     }
    
    函数newNet(str){
    str=str;
    var xmlhttp=new XMLHttpRequest();
    xmlhttp.onreadystatechange=函数(){
    if(xmlhttp.readyState==4&&xmlhttp.status==200){
    document.getElementById(“status”).innerHTML=xmlhttp.responseText;
    }}
    open(“POST”,“newNet.php”,true);
    setRequestHeader(“内容类型”,“应用程序/x-www-form-urlencoded”);
    xmlhttp.send(“q=”+str);
    表演活动();
    }
    
    这里有两个问题:

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

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

  • 如何解决此问题:

    您有一个
    xmlhttp.onreadystatechange
    函数,该函数侦听请求并在每次执行步骤时激发。这称为回调函数。在第四步,比萨饼做好了,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\u编码。这样,它将作为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
      需要时间才能完成,必须使用回调来处理其结果

    异步问题。你点了一个比萨饼,想在它烤之前吃掉它。db speed与此无关。在打电话给比萨饼店订购比萨饼后,你甚至还没挂断电话就想把比萨饼吃掉。你把PHP和Javascript混合在一起。php在服务器上执行一次,在重新加载页面之前,页面的JS中会有“硬编码”的max(newid)值。。非常感谢你。但我不知道如何修复它。我该怎么办?好吧,我明白你的意思了。然而,newNet.php程序实际上是首先将新行插入数据库的代码。在它运行并且新行就位后,我想获取为在独立程序中使用而创建的netID。。。。等等,等等。。。当我打字的时候,一些东西向我走来。你是说两个PHP代码应该同时传递给服务器进行处理吗?嗯!!
    XMLHttpRequest
    不会将任何代码传递给服务器进行处理,只会通过
    querystring
    传递一些参数。实际处理在服务器上的
    newNet.php
    中完成。PHP也可以使用单个线程。首先,它运行对DB的调用,然后它可以检索新id并将其打印到页面上,该页面将被发送回
    XMLHttpRequest
    对象,您可以在其中检索新id。我开始了解这个想法。我会努力一点,让你知道我是怎么做的。非常感谢你的帮助。真的很感激。我在这里仍然有点挣扎,不是因为你解释得不够好,而是因为我没有完全理解。除此之外,我现在意识到我对你撒了一点谎。netID不是一个自动递增的,我必须去弄清楚它是什么。因此,在我的newNet.php中,第一个SQL从表中选择max(netID)以及其他信息。这反过来又用于执行插入以创建新行。哎呀!我猜在插入之后,这次我应该再执行一次SQL来提取新创建的行及其非常重要的netID号??我按照上面的建议移动了showActivites(xmlhttp.responseText),并将其从newNet()函数的底部删除。然后在newNet.php中,我使用您的代码创建jason编码。但我想我不知道该怎么办。我不明白上面创建的函数的用法。你的工作很出色,但我不是。。。我想这方面我太新了。谢谢