我有一个棘手的问题。
我正在处理一个表单,用于验证提交时的几件事情,使用event.preventDefault();
来阻止表单在出现问题时提交。这里的问题是它同时发送多个ajax请求,这似乎阻止了php(处理AJAX调用)修改$ _SESSION变量。
我已经通过更改jquery ajax调用同步处理来确定这一点,允许更改$ _SESSION变量。
我的问题是:有没有办法允许ajax调用同步发生,同时允许在这些调用过程中修改$ _SESSION变量?我意识到AJAX调用的async:false
已被弃用,显然不是最佳解决方案。
由于每个呼叫的作用,不可能将这两个呼叫的功能结合起来,尽管每次呼叫都不需要很长时间来处理。
示例jquery代码,用于解释我如何进行这些AJAX调用(显然有些编辑和简化):
$("#form-id").on('submit', function(event) {
$.ajax({
type: 'POST',
url: '/url/to/processing.php',
async:false, //fails without setting to false
...
});
});
...
$("#form-id").on('submit', function(event) {
$.ajax({
type: 'POST',
url: '/url/to/processing2ThatSetsSession.php',
async:false, //fails without setting to false
...
});
});
答案 0 :(得分:0)
您必须连接呼叫,在另一个呼叫结束后运行一个呼叫。
我会这样做:
function ajaxPost(url, callback) {
$.ajax({
type: 'POST',
url: url
...
}).done(callback);
}
$("#form-id").on('submit', function(event) {
event.preventDefault(); // Always stop the event
// Do one ajax call and wait for the data
ajaxPost('/url/to/processing.php', function(data) {
// Do things with returned data and call the next ajax
ajaxPost('/url/to/processing.php', function(moredata) {
// Do something with moredata
// If everything is fine, re-post it but this time do not catch the event
$("#form-id").off("submit").submit();
});
});
});
您可以添加自己的逻辑以在任何回调中显示错误消息,而不是继续使用下一个回调。
有了这个,我将为多个ajax表单验证做一个特殊的方法:
// This function will get an array of objects and
// do an ajax call and process the data, one after another
function multiAjax(calls, callback) {
var call = calls.shift();
if (call) {
var url = call.url;
post(url, function(data) {
var error = call.process(data);
if (error) {
callback(error);
} else {
multiAjax(calls, callback);
}
});
} else {
callback();
}
}
// This is the array of objects that multiAjax will process.
// You can add or remove elements to your likings, without modifying
// the submit event callback
var ajaxArray = [{
url: '/url/to/processing.php',
process: function(data) {
if (data.isWrong()) {
return "The data is wrong";
}
}
}, {
url: '/url/to/processing.php',
process: function(data) {
if (data != "OK") {
return "The data is not OK";
}
}
}];
// Now listen for the submit event
$("#form-id").on('submit', function(event) {
// Always stop the event
event.preventDefault();
// Do multiple ajax calls in one function call.
// Because the array is mutated inside multiAjax() (yeah, bad design but I've
// done this fast as an example), we slice() the array to get a new one
multiAjax(ajaxArray.slice(), function(error) {
if (error) {
// Show the error received
} else {
// submit the form the same way above
$("#form-id").off("submit").submit();
}
});
});
这是所有未经测试的代码,但你明白了。
答案 1 :(得分:0)
如果一个表单提交正在向同一个PHP服务器发布两个帖子,那么您应该重新考虑该体系结构,而不是构建复杂的解决方法。
我会POST到一个PHP脚本,它将在后端执行您需要的所有操作。
$.ajax({
type: 'POST',
url: '/url/to/all-processing.php',
... // send all the data needed by all processes
});
在PHP方面: all-processing.php
session_start();
require_once './process1.php';
require_once './process2.php';