У меня странная проблема с моим пирогом (cake_1.2.0.7296-rc2). My start () – действие выполняется при определенных обстоятельствах дважды, хотя выполняется только один запрос.
Триггеры выглядят так: – загрузка объекта типа: $this->Questionnaire->read(null, $questionnaire_id);
– доступ к данным $ this-data
Если я loadAvertisement()
вызов loadAvertisement()
из start()
–action, этого не произойдет. Если я loadAdvertisement():
два вызова внутри 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("ymd"); //echo " - to ".$questionnaire['Questionnaire']['validTo']." ".date("ymd"); if ($this->data['Questionnaire']['isPublished'] != 1 //|| $this->data['Questionnaire']['validTo'] < date("ymd") //|| $this->data['Questionnaire']['validTo'] < date("ymd") ) { $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'])); } }
Я действительно не понимаю этого … он не думает, что это должно быть так. Любая помощь будет принята с благодарностью! 🙂
С уважением, Стю
Проверьте макет для несуществующих ссылок, например неверно настроенная ссылка на favicon.ico заставит действие контроллера запускаться во второй раз. Убедитесь, что favicon.ico указывает на webroot, а не на локальный каталог, иначе запросы будут генерироваться для /controller/action/favicon.ico, а не /favicon.ico, – и, таким образом, инициировать ваши действия.
Это также может происходить с изображениями, таблицами стилей и javascript.
Чтобы встретить проверку $ id, это int, затем проверьте, чтобы $ id существовал как первичный ключ в базе данных, прежде чем перейти к любой функции.
Для меня это вопрос JS.
Позаботьтесь о функции обертывания с помощью jQuery, чтобы повторно выполнить JS в завернутом контенте!
Возможно, вам захочется попытаться выяснить, откуда это происходит, используя функцию debug_print_backtrace (). ( http://nl.php.net/manual/en/function.debug-print-backtrace.php
Имела та же проблема, с определенным действием, случайным образом выполняющимся в 2-3 раза. Я обнаружил две причины:
Дополнения Firefox Yslow был настроен на автоматическую загрузку из своих настроек, заставляя страницы перезагружаться при использовании F5 (не при загрузке страницы из адресной строки браузера и нажатии Enter).
У меня было ошибочное объявление стиля CSS в параметрах $ html-> link (); в некоторых случаях это будет выглядеть как background-image: url ('') ;, что также вызвало повторный запуск. Установка стиля ссылки на фоновое изображение: нет; когда изображение не было доступно для меня.
Надеюсь это поможет. Я знаю, что это довольно старая должность, но, когда дело доходит до Google в поисках этой проблемы, я думал, что это может помочь другим, продолжая публиковать сообщения.
Удачи
Йерун ден Хаан
У меня была такая проблема, как на прошлой неделе.
Две возможные причины
Еще одна вещь: где вы устанавливаете Questioneer.id на своем сеансе? Возможно, это проблема?
Да, это происходит, когда на веб-странице есть неработающая ссылка. Каждый браузер имеет дело с ним по-разному (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 в скрипте третьей части.
У меня была такая же проблема в chrome, я отключил свой HTML Validator. Которая дважды загружала страницу
У меня была аналогичная проблема, проблема, казалось, была изолирована от нечувствительности к регистру на конечной точке.
то есть:
http: // server / Анкеты / loadAvertisement -vs-
HTTP: // сервер / опросники / loadavertisement
При вызове конечной точки с надлежащим обходом метод выполнялся один раз – в том случае, когда нижняя обложка выполнялась дважды. Проблема возникала спорадически – происходит на одном контроллере, но не на другом (по существу, такая же логика, никаких дополнительных компонентов и т. Д.). Я не мог подтвердить, но считаю, что ошибка браузера – не сама CakePHP.
Мое обходное решение заключалось в том, что каждая ссылка на конечную точку была надлежащей. Чтобы идти еще дальше, я добавил общие варианты case к конфигурации маршрута:
приложение / Config / routes.php
<?php // other routes.. $instructions = ['controller'=>'Questionnaires','action'=>'loadAvertisement']; Router::connect('/questionnaires/loadavertisement', $instructions); Router::connect('/QUESTIONNARIES/LOADADVERTISEMENT', $instructions); // ..etc
Если вы пропустите <something>
, например View, Cake выведет недостающую <something>
ошибку и попытается отобразить ее Error View
. Поэтому AppController
будет вызываться дважды. Если вы устраните недостающую проблему, AppController
вызывается один раз.