这次,我想使用POST方法将数据发送到php服务器,然后使用GET方法从服务器检索数据(我假设)。
这是JS:
函数send()
function send(leURL, laValeur) {
try {
return new Promise(function(resolve, reject) {
var req = new XMLHttpRequest();
req.open('POST', leURL);
req.setRequestHeader("Content-Type", "application/json");
req.onreadystatechange = function() {
if (this.readyState == XMLHttpRequest.DONE && this.status == 200) {
document.getElementById("result").innerHTML = "Ok!";
}
};
jmail = JSON.stringify(laValeur);
req.send(jmail);
resolve("true");
});
}
catch (err) {
window.alert("erreur 2");
}
}
function recieve()
function recieve(laURL) {
try {
var reqt = new XMLHttpRequest();
reqt.open('GET', laURL);
reqt.onreadystatechange = function(e) {
if (this.readyState == XMLHttpRequest.DONE && this.status = 200) {
var rep = JSON.parse(this.responseText);
try {
window.alert(rep);
}
catch (e) {
window.alert("erreur 4");
}
}
}
reqt.send();
//return rep;
}
catch (e) {
window.alert("erreur 3");
}
}
函数调用:
//there's a form in the HTML (id="form")
document.getElementById("form").addEventListener('submit', function(evt) {
evt.preventDefault();
send(url, mail)
.then(recieve(url));
});
旧的recieve()函数(用于测试):
function recieve(laURL) {
window.alert(laURL);
}
因此,只要我使用的是旧的recieve()函数,就可以使send()打印“好!”和receve()创建一个警报,这使我认为它工作正常。但是,既然我使用了新的recieve()函数,页面就会重新加载。 (甚至没有显示捕获块!)
这是PHP:
<?php
if (!empty($_POST)) {
$var = //do something with the data, involving $_POST
echo $var;
}
else {
echo "Hello, there !";
}
?>
由于$ var是从第一个HTTP请求(POST)中生成的,如何在javascript中检索它?
我怀疑错误是由php引起的,还是由使用两个XMLHttpRequests引起的(仍然不知道如何仅使用一个HTTP请求来做到这一点)
答案 0 :(得分:1)
您的PHP将数据存储在变量中,将其回显,然后退出。
此时,PHP程序已完成,内存已清理,并且变量不再存在。
如果您希望数据可用于其他请求,则必须将其存储在持久的某个位置,例如会话或数据库。
如果要使用单个请求,请在this.responseText
处理程序中阅读readyStateChange
。
答案 1 :(得分:0)
您如何处理数据?
您如何存储它们?
如果需要,您如何在服务器上检索它们,然后将它们发送给客户端?
您应该将$ var存储在某个地方,通常我们使用会话$_SESSION
。最终取决于您想要的一切。
PHP会话的文档:https://www.php.net/manual/fr/reserved.variables.session.php
开始会话后,
我认为您想做这样的事情:
<?php
if ($_SESSION['var']) {
echo "already done";
...
} else {
if(!empty($_POST)) {
$_SESSION['var'] = //do something with the data, involving $_POST
echo $_SESSION['var'];
} else {
echo "var = not done, post = empty";
}
}
?>
答案 2 :(得分:0)
POST请求已经返回值(使用echo)。您所需要做的就是使用JavaScript展示它。
例如在POST请求中:
constraint stafUnique EXCLUDE ( (org,post) with in) where (staff = true)
我认为不需要GET请求,除非您打算稍后在流程中使用它,因为期望服务器上的数据可能已更改。但是,从某种意义上讲,您必须将数据存储在服务器上的某个位置,并且还向请求中发送一些标识符,以告知服务器要检索哪些数据。