Запись добавляется в БД с задержкой

Я использую Cakephp (в режиме разработки) и мой источник данных — база данных / Mysql.

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

  1. Посетитель выбирает 6 предметов
  2. Посетитель нажимает на кнопку
  3. При нажатии кнопки я использую jquery $ .post для отправки данных в функцию php, которая берет эти данные и добавляет их в базу данных.
  4. После этого (а может и не так, как кажется) их посетитель перенаправляется на «страницу оплаты».

Это скрипт 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'));

}

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

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

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

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

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

Благодарю.

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

Другие решения

Других решений пока нет …