Ajax电话面临尴尬局面

时间:2016-09-11 23:26:31

标签: php mysql ajax

请长时间问我......

我必须将一个数据库记录添加到一个主表中,比如说test表。在向此表添加记录后,我想要其last inserted id,然后想要在事务表中添加大约1000个条目(同时向这些1000条记录发送EMAILS),请说test_transaction表。

但是第二个操作,将记录添加到事务表中,需要更多的时间来向数据库添加记录。我正在使用客户MVC,我的代码看起来像......

public function addtotest()
{
    $strSql = "INSERT INTO test ...";
    $intId = $this->db->execute($strSql);

    foreach($arrTransaction $transact)
    {
        $strSql = "INSERT INTO test_transaction ...";
        $this->db->execute($strSql);
    }

    echo $intId;
}

所以我想把test_transaction表的条目放到另一个action中,如下所示

public function testtrancation()
{
    $id = $_REQUEST['id']; //It's understood that I am doing proper validation here
    foreach($arrTransaction $transact)
    {
        $strSql = "INSERT INTO test_transaction ...";
        $this->db->execute($strSql);
    }
}

所以主要问题是,我正在调用来自addtotest的{​​{1}}行动,当它会回复AJAX时,我想调用另一个id来增加近似值AJAX {1}}记录到数据库。

但是我不想让用户等待几分钟的1000条记录来打扰用户的体验。

  1. 所以我在1000'AJAX'电话加入记录后重新加载页面。
  2. addtotest的{​​{1}}内拨打另一个AJAX来电。
  3. 拨打success addtotest电话后,我正在重新加载我的网页。

    testtransaction
  4. 但是当页面重新加载时,我的AJAX调用也会在没有完成$.ajax( { url: SERVER_PATH + 'addtotest', type: 'post', async: true, data: { required_data: required_date }, success:function(data) { alert('Record added successfully.'); //I DO NOT WANT USERS TO WAIT FOR THIS AJAX CALL $.ajax( { url: SERVER_PATH + 'testtransaction', type: 'post', async: true, data: { intId: data.id }, success:function(data) { //DO NOTHING }, }); //I DO NOT WANT USERS TO WAIT FOR THIS AJAX CALL location.reload(); }, }); 请求的情况下消失。

    在这种情况下可以做到吗?我想了解更多细节,请告诉我。

    我不希望用户等待另外的AJAX条目(以及发送EMAILS到这1000条记录)进入数据库。

4 个答案:

答案 0 :(得分:3)

然后创建一个数据库触发器。 所以当Record在第一个表中插入时 它插入到事务表或SO中。

例子 -

    CREATE TRIGGER trg_Table1_INSERT
 ON dbo.Table1 AFTER INSERT 
AS BEGIN
   INSERT INTO dbo.Table2(SerialNo, Name)
  SELECT SerialNo, Name
  FROM Inserted

   INSERT INTO dbo.Table3(SomeOtherCol)
  SELECT SomeOtherCol
  FROM Inserted
END

答案 1 :(得分:1)

这很简单!

单次插入后,您可以调用单独的后台进程:

public function addtotest()
{
    $strSql = "INSERT INTO test ...";
    $intId = $this->db->execute($strSql);
    exec('php /your/php/cli/script.php param1 param2 paramN 1>> /dev/null 2>> /dev/null &');
    echo $intId;
}

使用"&"进程在后台启动,因此您可以继续,而不必等到脚本完成。

或者您可以将此作业添加到"延期任务"并使用cron运行此任务。

答案 2 :(得分:1)

不要使用AJAX。你需要具有基本分页的CRONJOB。

在一个php文件中提取ID,并在每个序列的每500个请求之后的列表序列之后。并且使用header()重定向下一个500,直到你到达终点。这不会影响用户体验,ypu会有很好的表现。

答案 3 :(得分:1)

您可以使用一个SQL查询插入所有行。

INSERT INTO test_transaction (col1, col2)
VALUES (value11, value12),
(value21, value22),
(value31, value32),
...
(value10001, value10002);