У меня странная проблема с тортом (cake_1.2.0.7296-rc2). Мое действие start () - выполняется дважды при определенных обстоятельствах, даже если сделан только один запрос.
Похоже, что триггеры:
- загрузка объекта типа: $this->Questionnaire->read(null, $questionnaire_id);
- доступ к $ this-data
Если я отключу вызов loadAvertisement() из действия start(), этого не произойдет.
Если я отключу два вызова внутри 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']));
}
}
Я действительно не понимаю этого ... не думаю, что так должно быть. Любая помощь будет принята с благодарностью! :)
С уважением, Стю






Вы можете попытаться выяснить, откуда это взялось, с помощью функции debug_print_backtrace (). (http://nl.php.net/manual/en/function.debug-print-backtrace.php
Проверьте свой макет на наличие несуществующих ссылок, например, неверно настроенная ссылка на favicon.ico приведет к повторному запуску действия контроллера. Убедитесь, что favicon.ico указывает на корневой каталог, а не на локальный каталог, иначе запросы будут сгенерированы для /controller/action/favicon.ico, а не для /favicon.ico - и, таким образом, запустят ваше действие.
Это также может происходить с изображениями, таблицами стилей и JavaScript.
Чтобы противодействовать проверке, что $ id является int, затем проверьте, существует ли $ id в качестве первичного ключа в базе данных, прежде чем переходить к какой-либо функциональности.
+1, это случилось со мной - у меня был тег div с URL-адресом фонового изображения на основе нулевого значения из БД.
Благодаря вам я обнаружил, что неисправный ресурс был ошибкой, в моем случае я вызываю метод в контроллере приложения, где метод имеет один вызов save () для одной таблицы .. но в некоторых ссылках на видео (теги src ) данные были сохранены дважды ... поэтому я обнаружил, что ссылка на ресурс 404 не найдена ... это была проблема ...
Была такая же проблема, с определенным действием, выполнявшимся в случайном порядке 2-3 раза. Я обнаружил две причины:
Надстройка Firefox Yslow была настроена на автоматическую загрузку из настроек, вызывая перезагрузку страниц при использовании F5 (а не при загрузке страницы из адресной строки браузера и нажатии Enter).
У меня было неправильное объявление стиля css в параметрах $ html-> link (); в некоторых случаях это могло закончиться как background-image: url ('');, что также вызывало повторный запуск. Установка стиля ссылки на фоновое изображение: нет; когда не было доступного изображения, я кое-что исправил.
Надеюсь это поможет. Я знаю, что это довольно старый пост, но поскольку он довольно высоко поднимается в Google при поиске этой проблемы, я подумал, что это может помочь другим, если все еще публикует.
Удачи
Йерун ден Хаан
На прошлой неделе у меня была такая проблема.
Две возможные причины
Еще одна вещь, где вы устанавливаете Questioneer.id в своем сеансе? Может, в этом проблема?
Для меня это была проблема с JS.
Позаботьтесь о функции обертывания с помощью jQuery, которая повторно выполняет JS в обернутом содержимом!
Привет, не могли бы вы расширить это, я замечаю то же самое - когда я включаю тег <script> в свое представление, действие контроллера для представления вызывается дважды. Я включаю в представление файл javascript, используя echo ($ this-> Html-> script (....)); если я установил inline => false, этого не произойдет, но мне нужно, чтобы сценарий inline = true. любые советы приветствуются!
Да, это происходит, когда на веб-странице есть неработающая ссылка. Каждый браузер работает с этим по-разному (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 в скрипте 3-й части.
У меня была такая же проблема в Chrome, я отключил надстройку «HTML Validator». Которая загружала страницу дважды
У меня была аналогичная проблема, проблема, казалось, была связана с нечувствительностью к регистру на конечной точке.
, т.е.
http: // server / Questionnaires / loadAvertising -vs-
http: // сервер / вопросники / loadavertising
При вызове конечной точки с правильным регистром метод запускался один раз, тогда как нижний регистр выполнялся дважды. Проблема возникала спорадически - на одном контроллере, но не на другом (по сути та же логика, никаких дополнительных компонентов и т. д.). Я не мог подтвердить, но считаю, что виноват браузер, а не сам CakePHP.
Мое обходное решение заключалось в том, чтобы убедиться, что каждая ссылка на конечную точку имеет надлежащий корпус. Чтобы пойти еще дальше, я добавил распространенные варианты case в конфигурацию Route:
приложение / 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 будет вызван один раз.
Здравствуй! Спасибо за ответ. Однако это не помогло, просто отображались два раза точно такие же шаги из трассировки. Это специфическая проблема CakePHP, а не только PHP.