2009-09-14 81 views
0

理想情况下,我的网站的用户将在大约一个小时(基本上是一个在线实验)的过程中向数据库服务器发送几百个帖子。该实验在js中实现,所以我试图使用XMLHttpRequest对象来发布脚本收集的数据。使用XMLHttpRequest的开放方法的javascript:使用帖子及其参数

我不确定的事情是如何使用POST参数。我想为$ _POST变量设置大约8个不同的键/值对,以便在发送到数据库服务器之前可以通过.php页面访问以进行处理。我不想从服务器本身检索任何信息,只发送它(这是为什么,我不确定是否是正确的方法,我将readyState设置为'1'/打开)。

这里是我与目前工作的脚本:

function postData(dataList) { 

var xmlhttp = new XMLHttpRequest(); 
var processingUrl = "process_exercise_data.php"; 
var POSTBody = ""; 
POSTBody+="block_type="+encodeURIComponent(dataList[0]); 
POSTBody+="&block_number="+encodeURIComponent(dataList[1]); 
POSTBody+="&trial_type="+encodeURIComponent(dataList[2]); 
POSTBody+="&trial_number="+encodeURIComponent(dataList[3]); 
POSTBody+="&input_value="+encodeURIComponent(dataList[4]); 
POSTBody+="&output_value="+encodeURIComponent(dataList[5]); 
POSTBody+="&prediction_value="+encodeURIComponent(dataList[6]); 
POSTBody+="&error="+encodeURIComponent(dataList[7]); 


xmlhttp.open("POST",processingUrl,true); 
if (xmlhttp.readyState==4) { 
    xmlhttp.send(POSTBody); 
} 

} 

的主要目标是键/值对发送到使用POST的PHP页面,同时保持当前页面上(简单的AJAX请求,如果我没有弄错)。任何意见或建议非常感谢!请记住,我试图完成的所有工作都是让用户在特定情况下(在此函数范围之外)以某种方式行事时调用此函数并将此数据POST到服务器。服务器响应文本不需要。

编辑:

现在我的问题是:我是否还能够在处理PHP页面访问$ _POST数组中?下面是一个示例:

$block_type = $_POST['block.type']; 
+0

你从哪里学习为发布数据设置标题?任何基本教程都应该告诉你如何发布数据。 – epascarello 2009-09-14 18:18:27

回答

2

您不想设置请求标头。你想要的是发送请求身体一起。身体应该像

'block_type='+encodeURIComponent(dataList[0])+'&block_number='+encodeURIComponent(dataList[1]) 

等猜你有这个主意。正文是您传递给XMLHTTPRequest对象的方法send()

+0

+1。只需添加这个来解决“A服务器响应是不必要的”位:响应是必要的,否则浏览器会认为请求失败。如果响应* body *不需要包含任何内容,则服务器响应代码可能应该设置为“204无内容”,或者可能是“201创建”。在PHP中,这可以通过header()函数来实现,例如, * header(“HTTP/1.1 204 No Content”); * – NickFitz 2009-09-14 17:31:08

+0

嗯。那么,是的,但我认为问题是关于客户端。 – 2009-09-14 17:36:33

0

您必须致电发送readyState将发生变化。

如果你想处理一个响应,更换

xmlhttp.open("POST",processingUrl,true); 
if (xmlhttp.readyState=4) { 
    xmlhttp.send(POSTBody); 
} 

xmlhttp.open("POST", processingUrl, false); 
xmlhttp.send(POSTBody); 

,加定义xmlhttp.onreadystatechange

xmlhttp.open("POST", processingUrl, false); 
xmlhttp.onreadystatechange = function() { 
    if (this.readyState === 4) { 
    // handle response 
    } 
}; 
xmlhttp.send(POSTBody); 

编辑:我也想提一提,=是不是JavaScript相等运算符,它是赋值操作符TOR。使用===进行等式检查,使用==进行类型转换相等检查。

+0

另外值得一提的是,你必须在调用send()之前设置'onreadystatechange',否则你的AJAX回调会随机失败。 – Christian 2011-08-31 07:03:05

2

考虑使用jQuery,它会让你的任务变得更容易。使用jQuery.post方法,您只需提供data散列,您不必担心序列化,正确转义或readyState