AJAX,响应头不是由PHP脚本发送的!

AJAX,响应头不是由PHP脚本发送的!,php,ajax,response,Php,Ajax,Response,我现在头痛好几个小时了。我有一个选择,它使用AJAX更新数据库(至少它正在尝试!)。当使用所需的参数直接运行PHP脚本时,数据库会得到更新,但在通过AJAX间接运行时则不会,相反,我会收到3次警报(“返回的数据中有问题:\n”)然后进行更新。JavaScript在上,不在外部文件中。下面是: JavaScript: function updateHub(){ if (window.XMLHttpRequest){ // code for IE7+, Firefox,

我现在头痛好几个小时了。我有一个选择,它使用AJAX更新数据库(至少它正在尝试!)。当使用所需的参数直接运行PHP脚本时,数据库会得到更新,但在通过AJAX间接运行时则不会,相反,我会收到3次
警报(“返回的数据中有问题:\n”)然后进行更新。JavaScript在
上,不在外部文件中。下面是:

JavaScript:

function updateHub(){  
    if (window.XMLHttpRequest){
        // code for IE7+, Firefox, Chrome, Opera, Safari  
        xmlhttp=new XMLHttpRequest();  
    }else{
        // code for IE6, IE5  
        xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");  
    }  
    xmlhttp.onreadystatechange = function(){  
       if (xmlhttp.readyState==4 && xmlhttp.status==200){  
           document.getElementById("hubinfo").innerHTML=xmlhttp.responseText;  
       }else{  
           alert("There was a problem in the returned data:\n");  
       }  
    }  
    var prefHub = document.getElementById("prefHub");  
    var hubID = prefHub.options[prefHub.selectedIndex].value;  
    xmlhttp.open("GET","updateHub.php?hubID="+hubID,true);  
    xmlhttp.send();  
}
updateHub.php:

session_start();
include '../../../common/config.php';
$hubID = '';
if(isset($_POST['hubID'])){
    $hubID = strip_tags(mysql_real_escape_string(trim($_POST['hubID'])));
}elseif(isset($_GET['hubID'])){
    $hubID = strip_tags(mysql_real_escape_string(trim($_GET['hubID'])));
}
mysql_query("UPDATE prefs set hubID='$hubID' where userID = '".$_SESSION['userID']."'") or die(mysql_error());
if(mysql_affected_rows()){
    echo "Updated";
}else{
    echo 'Error';
}
return $hubID;
以及HTML:

<form action="" method="post" onsubmit="updateHub();">
    <select name="prefHub" id="prefHub">
        <option value="43">opt1</option>
        <option value="64">opt2</option>
        <option value="30">opt2</option>
     </select>
     <input type="submit" name="update" value="Update Hub"/>
</form>
<div id="hubinfo"></div>

opt1
opt2
opt2
我搬家了

var prefHub = document.getElementById("prefHub");
var hubID = prefHub.options[prefHub.selectedIndex].value;
紧接着

function updateHub()
{
并删除

else{
         alert("There was a problem in the returned data:\n");
    }
现在它工作正常,但我不明白为什么。有人能解释吗

安德烈亚斯解释了原因

相反,我得到了3倍的警告(“那里 返回时是否存在问题 数据:\n“

这意味着您将始终看到警报。因为对于任何其他xmlhttp.readyState值,将执行else{}块


XMLHttpRequest对象可以处于多种状态。readyState属性必须返回当前状态,该状态必须是以下值之一:

未发送(数值0)

已打开(数值1)

接收到的标题(数值2)

加载(数值3)


完成(数值4)

尝试使用Firebug之类的工具查看实际发送的XHR请求(以及返回的响应)。@Amber我是,没有发送响应头。@Amber,没错。如果你不使用firebug或fiddler,你肯定会头疼。@Byron Whitlock我使用的是firebug,这就是我看到没有响应头的原因。当使用ajax时,到底发送了什么url(通过查看firebug)?也许js代码出错了,请求了类似“updateHub.php?hubID=opt1”的东西。在我发布答案之前,没有看到你的帖子。现在我明白了。谢谢,没问题。我想这就是为什么你会多次看到警报。如果(xmlhttp.readyState==4){if(xmlhttp.status==200){//handle response}否则{//handle error},则针对XMLHttpRequest对象的每个状态(打开、接收头、加载)发出一个警报
if (xmlhttp.readyState==4 && xmlhttp.status==200)
{
document.getElementById("hubinfo").innerHTML=xmlhttp.responseText;
}
else{
alert("There was a problem in the returned data:\n");
}
The object has been constructed. 
The open() method has been successfully invoked. During this state request headers can be set using setRequestHeader() and the request can be made using the send() method. 
All redirects (if any) have been followed and all HTTP headers of the final response have been received. Several response members of the object are now available. 
The response entity body is being received.