2008-09-15 11 views
4

У меня странная проблема с моим пирогом (cake_1.2.0.7296-rc2). My start() - действие выполняется при определенных обстоятельствах дважды, хотя выполняется только один запрос.CakePHP: Действие работает дважды, без уважительной причины

Триггеры кажутся: - загрузка объекта, как: $this->Questionnaire->read(null, $questionnaire_id); - доступ к $ this--данные

Если отключить вызов loadAvertisement() из start() -action, этого не происходит. Если отключить двух вызовов внутри loadAdvertisement():

$questionnaire = $this->Questionnaire->read(null, $questionnaire_id); 
$question = $this->Questionnaire->Question->read(null, $question_id); 

... тогда это не произойдет либо.

Почему?

См. Мой код ниже, Контроллер является «questionnaires_controller».

function checkValidQuestionnaire($id) 
{ 
    $this->layout = 'questionnaire_frontend_layout'; 

    if (!$id) 
    { 
     $id = $this->Session->read('Questionnaire.id');   
    } 

    if ($id) 
    { 
     $this->data = $this->Questionnaire->read(null, $id); 

     //echo "from ".$questionnaire['Questionnaire']['validFrom']." ".date("y.m.d"); 
     //echo " - to ".$questionnaire['Questionnaire']['validTo']." ".date("y.m.d"); 


     if ($this->data['Questionnaire']['isPublished'] != 1 
      //|| $this->data['Questionnaire']['validTo'] < date("y.m.d") 
      //|| $this->data['Questionnaire']['validTo'] < date("y.m.d") 
      ) 
     { 
      $id = 0; 
      $this->flash(__('Ungültiges Quiz. Weiter zum Archiv...', true), array('action'=>'archive')); 
     } 
    } 
    else 
    { 
     $this->flash(__('Invalid Questionnaire', true), array('action'=>'intro')); 
    } 

    return $id; 
} 



function start($id = null) { 
    $this->log("start"); 

    $id = $this->checkValidQuestionnaire($id); 

    //$questionnaire = $this->Questionnaire->read(null, $id); 
    $this->set('questionnaire', $this->data); 

    // reset flow-controlling session vars 
    $this->Session->write('Questionnaire',array('id' => $id)); 
    $this->Session->write('Questionnaire'.$id.'currQuestion', null); 
    $this->Session->write('Questionnaire'.$id.'lastAnsweredQuestion', null); 
    $this->Session->write('Questionnaire'.$id.'correctAnswersNum', null); 

    $this->loadAdvertisement($id, 0); 

    $this->Session->write('Questionnaire'.$id.'previewMode', $this->params['named']['preview_mode']); 

    if (!$this->Session->read('Questionnaire'.$id.'previewMode')) 
    { 
     $questionnaire['Questionnaire']['participiantStartCount']++; 
     $this->Questionnaire->save($questionnaire); 
    }   

} 




function loadAdvertisement($questionnaire_id, $question_id) 
{ 

    //$questionnaire = array(); 
    $questionnaire = $this->Questionnaire->read(null, $questionnaire_id); 

    //$question = array(); 
    $question = $this->Questionnaire->Question->read(null, $question_id); 

    if (isset($question['Question']['advertisement_id']) && $question['Question']['advertisement_id'] > 0) 
    { 
     $this->set('advertisement', $this->Questionnaire->Question->Advertisement->read(null, $question['Question']['advertisement_id'])); 
    } 
    else if (isset($questionnaire['Questionnaire']['advertisement_id']) && $questionnaire['Questionnaire']['advertisement_id'] > 0) 
    { 
     $this->set('advertisement', $this->Questionnaire->Question->Advertisement->read(null, $questionnaire['Questionnaire']['advertisement_id'])); 
    } 

} 

Я действительно не понимаю этого ... он не считает, что это должно быть так. Любая помощь будет принята с благодарностью! :)

С уважением, Stu

+0

Вы когда-нибудь разрешали это? – 2009-05-15 00:45:13

ответ

1

Вы могли бы хотеть, чтобы попытаться выяснить, где оно происходит от использования функции debug_print_backtrace(). (http://nl.php.net/manual/en/function.debug-print-backtrace.php

+0

Привет! Спасибо за ответ. Однако это не помогло, оно просто показало два раза точно такие же шаги от задней линии. Это особая проблема CakePHP, а не только PHP. – 2008-09-16 16:27:10

10

Проверьте свой макет для несуществующих ссылок, например неправильно настроенная ссылка на favicon.ico заставит действие контроллера запускаться во второй раз. Убедитесь, что favicon.ico указывает на веб-корень, а не на локальный каталог, или же запросы будут сгенерированы для /controller/action/favicon.ico, а не /favicon.ico - и, таким образом, вызвать ваше действие

Это может случиться и с изображениями, таблицами стилей и Javascript включает

.. Чтобы встретить проверку, id $ является int, а затем проверьте, чтобы $ id существовал как первичный ключ в базе данных, прежде чем перейти к любой функциональности.

+0

+1, это случилось со мной - у меня был тег div с URL-адресом исходного изображения на основе нулевого значения из БД. – Sc0ttyD 2012-05-21 12:23:36

+0

Благодаря вам я обнаружил, что поврежденный ресурс был ошибкой, в моем случае я делаю вызов метода в контроллере приложения, где метод имеет один вызов save() для одной таблицы .. но в некоторых видео-ссылках (src теги) данные, которые сохраняются дважды .. так что я нашел ссылку на ресурс 404 не найден .. это была проблема ... – 2016-09-02 18:29:55

1

Имел ту же проблему, при определенном действии случайным образом работает 2-3 раза. Я разыскал две причины:

  • Firefox дополнения YSlow был установлен для автоматической загрузки от его предпочтений, в результате чего страницы перезагружать при помощи F5 (не при загрузке страницы из адресной строки браузера и нажать Enter).

  • У меня было ошибочное объявление стиля CSS в вариантах $ html-> link(); в некоторых случаях это будет выглядеть как background-image: url ('') ;, что также вызвало повторный запуск. Установка стиля ссылки на фоновое изображение: нет; когда изображение не было доступно для меня.

Надеюсь, это поможет. Я знаю, что это довольно старая должность, но, когда дело доходит до Google в поисках этой проблемы, я думал, что это может помочь другим, продолжая публиковать сообщения.

Успехов

Йерун ден Haan

1

У меня была проблема, как эту последнюю неделю.

Две возможные причины

  • Дефектные маршруты (DO проверить конфигурацию маршрутов)
  • неисправной AppController. Я добавляю множество вещей в AppController, особенно до beforeFilter() и beforeRender(), поэтому вы можете также проверить их.

Еще одна вещь, где вы устанавливаете Questioneer.id на своем сеансе? Возможно, это проблема?

2

Для меня это была проблема с JS.

Позаботьтесь о функции обертывания с помощью jQuery, чтобы повторно выполнить JS в завернутом контенте!

1

Да, это происходит, если на веб-странице есть неработающая ссылка. Каждый браузер имеет дело с ним по-разному (Firefox называет его 2x). Я тестировал его, нет разницы в CakePHP v1.3 и v2.2.1. Для того, чтобы выяснить, кто является виновником, добавьте эту строку в код, а затем открыть второй созданный файл в вас www папку:

file_put_contents("log-" . date("Hms") . ".txt", $this->params['pass']); // CakePHP v1.3 
file_put_contents("log-" . date("Hms") . ".txt", $this->request['pass']); //CakePHP v2.2.1 

PS: Прежде всего я виню JQuery для него. Но в конце было забыто изображение для загрузки AJAX в скрипте третьей части.

0

У меня была такая же проблема в хроме, я отключил свой «HTML Validator». Которая загружала страницу дважды

0

У меня была аналогичная проблема, проблема, казалось, была изолирована от нечувствительности к регистру на конечной точке.

т.е.
http://server/Questionnaires/loadAvertisement -vs http://server/questionnaires/loadavertisement

При вызове надлежащего-обсаженных конечной точки, метод побежал один раз -whereas нижний обсаженных дважды баллотировался. Проблема возникала спорадически - происходит на одном контроллере, но не на другом (по существу, такая же логика, никаких дополнительных компонентов и т. Д.). Я не мог подтвердить, но считаю, что ошибка браузера - не сама CakePHP.

Мое обходное решение гарантировало, что каждая связь с конечной точкой была надлежащей. Для того, чтобы пойти еще дальше, я добавил общие тематические варианты для конфигурации маршрута:

приложения/Config/routes.php

<?php 
// other routes.. 
$instructions = ['controller'=>'Questionnaires','action'=>'loadAvertisement']; 
Router::connect('/questionnaires/loadavertisement', $instructions); 
Router::connect('/QUESTIONNARIES/LOADADVERTISEMENT', $instructions); 
// ..etc 
0

Если вы пропустите <something>, например, вид, торт вызовет недостающее <something> Ошибка и попытается представить его Error View. Поэтому AppController будет называться дважды. Если вы разрешите отсутствующую проблему, AppController вызывается один раз.