2014-09-17 9 views
0

Я использую Cakephp (в режиме разработки), а мой источник данных - это база данных/Mysql.Запись добавляется в БД с задержкой

В моей системе я имею следующий процесс:

  1. посетителей выбрать 6 пунктов
  2. посетителей нажимает на кнопку
  3. По щелчку баттона я использую JQuery $ .post для отправки данных в PHP которая берет эти данные и добавляет их в базу данных.
  4. После этого (или, может быть, не так, как кажется), их посетитель перенаправляется на страницу оплаты.

Это сценарий jquery, который отвечает за отправку данных в функцию «дескриптор» php.

$('.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')); 

} 

Так что проблема есть после того, как попасть на страницу оплаты, переменная «sets» не содержит новые данные, которые недавно были добавлены.

Чтобы найти проблему, я сравнил время создания записи (у меня есть «созданное» поле в таблице наборов) до момента загрузки страницы оплаты. (См. Комментарии команд).

Кажется, что записи добавляются примерно через 30 секунд после отображения страницы оплаты. Как это возможно?

Я имею в виду, что перенаправление обрабатывается после добавления записи в БД. Я думал, что это кэш, но я все еще использую кеш-файл по умолчанию, который, похоже, не кэширует записи, а только схему db.

Я искал любую связанную с этим проблему, но ничего не закончил, Я отлаживал и пытался практически любую идею, которую я имел, но все же я не нашел источник проблемы.

Спасибо.

ответ

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/

+0

Я был уверен, что '' .done' и .success' в основном то же самое. Я попробую и обновить вас. Благодарю. –

Смежные вопросы