记录正在延迟添加到数据库中

时间:2014-09-17 12:12:51

标签: php jquery sql cakephp

我使用Cakephp(在开发模式下),我的数据源是database / Mysql。

在我的系统中,我有以下过程:

  1. 访客选择6项
  2. 访客点击按钮
  3. 点击按钮,我使用jquery $ .post将数据发送到获取该数据并将其添加到数据库的php函数。
  4. 之后(或者可能看起来不像),他们将访问者重定向到"付款页面"。
  5. 这是jquery脚本,负责将数据发送到php函数" handle"。

    $('.next-step').on('click', function(){
    
        var paymentPage = $(this).attr('data-href');
    
        var slotsData = [];
        var i = 0;
        $('.slot').each(function(){
            slotsData[i] = {
                'img-id': $(this).attr('data-id'),
                'img-src': $(this).attr('data-src'),
                'img-high-src': $(this).attr('data-high-src'),
                'img-page': $(this).attr('data-page')
                };
            i++;    
        }); 
    
        var setid = 0;
    
        $.post('/sets/handle', {k:'',setid:setid,setData:slotsData}, function(data){
                    window.location = paymentPage;
        });
    
        return true;
    });
    

    这是php函数句柄

    public function handle()
    {
        $this->autoRender = false;
        $this->request->onlyAllow('ajax');
    
        $set_id = (int)$this->request->data('setid');
        $images = serialize($this->request->data('setData'));
    
    
        //Key
        $cookie_key = $this->Cookie->read('visitor_key');
        if(isset($cookie_key) && $cookie_key != null)
        {
            $key = $cookie_key;
        }
        else
        {
            $key = $this->newKey();
            $this->Cookie->write('visitor_key', $key);
        }
    
    
        //Edit Mode
        if(isset($set_id) && $set_id > 0)
        {
            /*Some other irrelevant code */         
        }
        else //Creating a new set
        {
            $this->Set->create();
            $this->Set->save(array(
                'images' => $images,
                'visitor_key' => $key,
                'quantity' => 1
            ));
    
            AppController::logActivity( array('visitor_key' => $key, 'instagram_id' => 0, 'instagram_username' => ''), 'Created New Set', $this->Set->id );
    
            return json_encode(array('status' => 'created','setid' => $this->Set->id,'visitor_key'=>$key));
        }
    
    
    }
    

    这是php功能付款

    public function payment() {
    
        $this->set('title_for_layout', 'Review Your Order');
        /*
        debug( date("d-m-y H:i:s") );
        */                  
        $sets = $this->Set->findAllByVisitorKeyAndOrderId($this->Cookie->read('visitor_key'),'0');
        /*
        debug($sets);
        */      
        $onesetcost = Configure::read('Ecom.setcost');
        $visitor_key = $this->Cookie->read('visitor_key');
    
        $total_sets = 0;
        foreach($sets as $set){
            $total_sets += $set['Set']['quantity'];
        }
        $shippmentCost = $this->shippmentCostByQuantity($total_sets);           
    
        $this->set(compact('sets','onesetcost','visitor_key','shippmentCost'));
    
    }
    

    所以问题是在进入付款页面后,"设置"变量不包含最近添加的新数据。

    为了找到问题,我将记录的创建时间(我在集合表中创建了"创建的"字段)与付款页面加载的时间进行了比较。 (参见注释命令)。

    似乎在显示付款页面后30秒内添加了记录。 怎么可能?

    我的意思是,在将记录添加到数据库之后正在处理重定向。 我认为它是缓存,但我仍然使用默认的文件引擎缓存,它似乎不缓存记录而只缓存数据库方案。

    我一直在寻找任何相关问题,但一无所获, 我调试并尝试了几乎所有的想法,但我仍然没有找到问题的根源。

    感谢。

1 个答案:

答案 0 :(得分:0)

将您的window.location = paymentPage;代码包含在成功处理程序中。

例如:

$.post('/sets/handle', {k:'',setid:setid,setData:slotsData}, function(data){
    // Do nothing in here
}).done(function( msg ) {
    window.location = paymentPage;
});

正在发生的事情是,在请求发生的同时,用户被重定向到新页面。如果你等到请求完成,那么你应该没问题。

有关jquery ajax请求的更多信息,请点击此处: http://api.jquery.com/jquery.ajax/