【问题标题】:Javascript not pulling correct data from MySQL after using XMLHttp to update the DB使用 XMLHttp 更新数据库后,Javascript 没有从 MySQL 中提取正确的数据
【发布时间】:2015-08-11 05:03:34
【问题描述】:

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

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

所以一步一步来:

  1. newNet.php 运行,它将记录添加到 MySQL 数据库
  2. 获取刚刚在#1 中创建的netID
  3. 将它传递给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;
     ?>);
 }

【问题讨论】:

  • 异步问题。您点了一份披萨,并想在它烤好之前吃掉它。
  • db 速度与它无关。打电话给比萨店订餐后,您甚至还没等挂断电话,就想吃比萨。
  • 你正在混合 PHP 和 Javascript。 php 在服务器上执行 ONCE ,您将在页面的 JS 中“硬编码”该 max(newid) 值,直到页面重新加载。
  • 这个比喻我明白了,现在我饿了.. 非常感谢。但我不知道如何解决它。我该怎么办?

标签: javascript php mysql ajax xmlhttprequest


【解决方案1】:

这里有两个问题:

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

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

如何解决这个问题:

你有一个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 需要时间来完成,必须使用 回调 来处理其结果。

【讨论】:

  • 好的,我明白你在说什么。然而,newNet.php 程序实际上是首先将新行插入数据库的代码。在它运行并且新行就位之后,我想获取为在独立程序中使用而创建的 netID....等等,等等...当我输入内容时,我会遇到。您是说两个 PHP 代码应该同时传递给服务器进行处理吗?嗯!
  • 没有代码通过XMLHttpRequest 传递给服务器进行处理,只是通过querystring 传递了一些参数。实际处理在newNet.php 的服务器上完成。 PHP 也适用于单线程。首先,它运行对数据库的调用,然后它可以检索新 id 并将其打印到页面上,然后将其发送回XMLHttpRequest 对象,您可以在其中检索新 id。
  • 我开始明白了。我会做一些工作,让你知道我是怎么做的。非常感谢你的帮助。真的很感激。
  • 我在这里仍然有点挣扎 Mouser 不是因为你解释得不够好,而是因为我没有像我应该的那样理解。最重要的是,我现在意识到我对你撒了一点谎。 netID 不是自动递增的,我实际上必须去找出它是什么。所以在我的 newNet.php 中,第一个 SQL 从表中选择 max(netID) 以及其他信息。这反过来又习惯于进行插入以创建新行。哎呀!我猜在插入之后我应该再做一个 SQL 来提取新创建的行及其非常重要的 netID 号??
  • 我按照您上面的建议移动了 showActivites(xmlhttp.responseText) 并将其从 newNet() 函数的底部删除。然后在 newNet.php 中,我使用您的代码创建了 jason 编码。但我想我不知道如何处理它。我不明白您在上面创建的功能的用途。你做得很好,但我不是......我想我在这方面太新了。谢谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-07-14
  • 2018-04-01
  • 2020-07-11
  • 2015-11-29
  • 1970-01-01
  • 2018-11-19
相关资源
最近更新 更多