CakePHP: Действие запускается дважды без уважительной причины

У меня странная проблема с тортом (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']));
    }

}

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

С уважением, Стю

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
5
0
4 960
9

Ответы 9

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

Здравствуй! Спасибо за ответ. Однако это не помогло, просто отображались два раза точно такие же шаги из трассировки. Это специфическая проблема CakePHP, а не только PHP.

tehstu 16.09.2008 20:27

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

Это также может происходить с изображениями, таблицами стилей и JavaScript.

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

+1, это случилось со мной - у меня был тег div с URL-адресом фонового изображения на основе нулевого значения из БД.

Sc0ttyD 21.05.2012 16:23

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

Henry Gabriel González Montejo 02.09.2016 21:29

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

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

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

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

Удачи

Йерун ден Хаан

На прошлой неделе у меня была такая проблема.

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

  • Неправильные маршруты (НЕОБХОДИМО проверить конфигурацию маршрутов)
  • Неисправный AppController. Я добавляю множество вещей в AppController, особенно в beforeFilter () и beforeRender (), так что вы, возможно, захотите также их проверить.

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

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

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

Привет, не могли бы вы расширить это, я замечаю то же самое - когда я включаю тег <script> в свое представление, действие контроллера для представления вызывается дважды. Я включаю в представление файл javascript, используя echo ($ this-> Html-> script (....)); если я установил inline => false, этого не произойдет, но мне нужно, чтобы сценарий inline = true. любые советы приветствуются!

undefined 08.11.2012 05:05

Да, это происходит, когда на веб-странице есть неработающая ссылка. Каждый браузер работает с этим по-разному (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 будет вызван один раз.

Другие вопросы по теме