2015-03-13 73 views
0

我已经搜索并找不到答案。我有一个循环并等待变量的ajax,当它不等于0时,我想将数据发送到另一个脚本,以便它可以更新数据库,然后重定向到另一个URL。我试过.post和.get,并且无法获取值来更新数据库,但脚本确实重定向。在ajax成功触发php脚本

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(); 
+2

**危险**:您很容易[SQL注入攻击](http://bobby-tables.com/)**,您需要[防守](http://stackoverflow.com/问题/ 60174/best-way-to-prevent-sql -injection-in-php)自己从。 – Quentin 2015-03-13 18:48:17

+0

我会尝试设置'document.location。href ='分配给'$ .post'函数的回调函数。也许重定向正在处理'$ .post'可以做任何事情之前。 – 2015-03-13 18:51:02

+0

即使我注释掉重定向我仍然无法获取数据库更新 – 2015-03-13 18:55:38

回答

1

您在运行触发POST请求的JS后立即离开页面。这会导致POST请求被取消。

在将location设置为新值之前,您需要等到收到POST请求的响应。

+0

我想测试这个,但我很确定POST实际上会在页面位置发生变化之前启动,问题是发布响应的事件处理程序将被清除,因此您将永远不会看看它说什么。我怀疑实际的错误出现在最初的ajax调用中,这可能会为POST生成不良的json数据。 – 2015-03-13 19:08:00

+0

如果我提醒每个变量的数据我得到正确的变量 – 2015-03-13 19:17:08

+0

Ajax中的A代表异步。必须在这里同意昆汀。乍得,'提醒'或'确认'或'提示'会导致页面等待,直到您关闭模式。所以这就是为什么它适用于警报。否则它是异步的。 – skidadon 2015-03-13 19:30:35

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. 

没有测试(现在不能),但你的想法。

0

1) 解决此问题的最简单方法是使用内置的javascript函数settimeout()。但处理定时器是可怕的,因为你不知道脚本什么时候完成。

2) 解决此问题的最简单方法是实现一个回调函数,该函数在第一个方法完成后触发。其实,这并不难。

3) 另一种方式可能是实现某种形式的“jsonp”实现来处理和与您的PHP脚本进行交互。

如果这是一个快速入侵,只需要选择1.如果没有,玩2和3的组合。祝你好运的伙伴。