我已经搜索过,无法找到答案。我有一个循环并等待变量的ajax,当它不等于0时,我想将数据发送到另一个脚本,以便它可以更新数据库,然后重定向到另一个URL。我已经尝试过.post和.get并且无法获取更新数据库的值,但脚本会重定向。
function updateTrigger(){
$.ajax({
url: "json.trigger.php",
dataType: "json",
cache: false,
success: function(data) {
var scrape_type = data.scrape_type;
var account_id = data.account_id;
if(account_id != 0) {
$.post('update-pending.php', {account_id: account_id, scrape_type: scrape_type});
document.location.href="redirect.com";
}
}
});
}
这是我的update-pending.php,我在重定向之前将变量发送到第一个。
$account_id = $_POST['account_id'];
$scrape_type = $_POST['scrape_type'];
$stmt = $con->prepare("UPDATE triggers SET
pending='1'
WHERE account_id = '$account_id' AND scrape_type = '$scrape_type'") or die(mysql_error());
$stmt->execute();
答案 0 :(得分:1)
在运行触发POST请求的JS后,您将立即离开页面。这会导致POST请求被取消。
在将location
设置为新值之前,您需要等到收到POST请求的响应。
答案 1 :(得分:1)
重要提示:检查答案的最后部分,您需要更改PHP代码以避免SQL注入。
您正在为POST请求生成相应的承诺,但它永远不会被执行,因为您在此之前离开了页面。
简单调用.done方法,回调作为$ .post()承诺的参数,回调它将在帖子成功后执行,你也可以考虑添加一个.fail()它将会是如果帖子失败则执行。
$.post( 'update-pending.php', {
account_id: account_id,
scrape_type: scrape_type
}).done(function() {
document.location.href="redirect.com";
}).fail(function() {
//enter code here
};
在服务器中,您需要在流程结束时返回对帖子请求的响应。如果不是,你。$ .post将返回错误并始终执行.fail()。
如果您不能/不想等待php脚本完成其执行以将用户重定向到redirect.com,请考虑在服务器的后台执行辅助脚本。
我更新了pending.php以使用PDO:
//update-pending.php
/* Consider executing this in the background, (adapted) */
$account_id = $_POST['account_id'];
$scrape_type = $_POST['scrape_type'];
$params = array('account_id' => $account_id, 'scrape_type' => $scrape_type);
$query = "UPDATE triggers SET pending='1'
WHERE account_id = :account_id
AND scrape_type = :scrape_type";
$stmt = $con->prepare($query);
$stmt->execute($params);
/* End of background script */
return true; // Return a response to the POST request.
没有经过测试(现在不能),但你明白了。
答案 2 :(得分:0)
1) 解决这个问题的最简单方法是使用内置的javascript函数settimeout()。但是处理定时器是很可怕的,因为你不知道脚本什么时候完成。
2) 解决此问题的最简单方法是实现在第一个方法完成后触发的回调函数。实际上,它并不难建立。
3) 另一种方式可能是实现某种形式的" jsonp"用于处理和与您的PHP脚本交互的实现。
如果它是一个快速黑客,只需选择1.如果没有,请使用2和3的组合。祝你好运伙伴。