Я использую Cakephp (в режиме разработки) и мой источник данных — база данных / Mysql.
В моей системе у меня есть следующий процесс:
Это скрипт 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 по умолчанию, который, кажется, не для кэширования записей, а только схема БД.
Я искал любую связанную проблему, но закончилась ничем,
Я отлаживал и испробовал практически любую идею, которая у меня была, но все же я не нашел источника проблемы.
Благодарю.
Оберните 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/
Других решений пока нет …