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数据库添加一条记录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);
表演活动();
}
这里有两个问题:
showActivities
,因此请求不会返回任何结果,因为这仍然是“烘焙”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编码。但我想我不知道该怎么办。我不明白上面创建的函数的用法。你的工作很出色,但我不是。。。我想这方面我太新了。谢谢