5

我的蛋糕有一个奇怪的问题(cake_1.2.0.7296-rc2)。在某些情况下,我的 start()-action 会运行两次,即使只发出了一个请求。

触发器似乎是: - 加载一个对象,如:$this->Questionnaire->read(null, $questionnaire_id); - 访问 $this-data

loadAvertisement()如果我禁用来自-action的调用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']));
    }

}

我真的不明白这个......它不认为它应该是这样的。任何帮助将不胜感激!:)

问候,斯图

4

9 回答 9

11

Check your layout for non-existent links, for example a misconfigured link to favicon.ico will cause the controller action to be triggered for a second time. Make sure favicon.ico points towards the webroot rather than the local directory, or else requests will be generated for /controller/action/favicon.ico rather than /favicon.ico - and thus trigger your action.

This can also happen with images, stylesheets and javascript includes.

To counter check the $id is an int, then check to ensure $id exists as a primary key in the database before progressing on to any functionality.

于 2008-12-09T17:01:08.193 回答
2

对我来说,这是一个 JS 问题。

使用 jQuery 处理 wrap 函数,在包装的内容中重新执行 JS!

于 2009-10-14T06:32:19.343 回答
1

您可能想尝试使用 debug_print_backtrace() 函数找出它的来源。( http://nl.php.net/manual/en/function.debug-print-backtrace.php

于 2008-09-15T15:56:35.673 回答
1

有同样的问题,某个动作随机运行2-3次。我追踪了两个原因:

  • Firefox 插件 Yslow 设置为从其首选项自动加载,导致使用 F5 时重新加载页面(而不是从浏览器地址栏加载页面并按 Enter 时)。

  • 我在 $html->link(); 的选项中有一个错误的 css 样式声明;在某些情况下,它会以 background-image: url(''); 的形式结束,这也会导致重新运行。将链接的样式设置为 background-image: none; 当没有可用的图像时,对我来说固定的东西。

希望这可以帮助。我知道这是一篇相当老的帖子,但是当搜索这个问题时,它在谷歌中的排名很高,我认为它仍然可以通过发布来帮助其他人。

祝你好运

杰伦登韩

于 2009-06-03T07:34:44.377 回答
1

上周我遇到了这样的问题。

两个可能的原因

  • 路线错误(请检查您的路线配置)
  • 有故障的 AppController。我在 AppController 中添加了很多东西,尤其是在 beforeFilter() 和 beforeRender() 中,所以你可能也想检查一下。

还有一件事,你在哪里设置 Questioneer.id 在你的会话中?也许这就是问题所在?

于 2009-06-03T13:09:09.037 回答
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。但最后它被遗忘了在第 3 部分脚本中加载 AJAX 的图像。

于 2012-08-28T18:17:38.127 回答
0

我遇到了类似的问题,这个问题似乎与端点上的大小写不敏感有关。

即:
http://server/Questionnaires/loadAvertisement -vs-
http://server/questionnaires/loadavertisement

当调用适当大小写的端点时,该方法运行一次 - 而小写的​​端点运行两次。问题偶尔发生 - 发生在一个控制器上,但不在另一个控制器上(基本上相同的逻辑,没有额外的组件等)。我无法确认,但相信是浏览器的错——而不是 CakePHP 本身。

我的解决方法是确保每个端点链接都是正确大小写的。为了更进一步,我在 Route 的配置中添加了常见的 case-variants:

app/config/routes.php

<?php
// other routes..
$instructions = ['controller'=>'Questionnaires','action'=>'loadAvertisement'];
Router::connect('/questionnaires/loadavertisement', $instructions);
Router::connect('/QUESTIONNARIES/LOADADVERTISEMENT', $instructions);
// ..etc
于 2015-02-09T18:02:16.060 回答
0

如果你错过<something>了,例如一个 View,Cake 会触发一个丢失的<something>错误,它会尝试渲染它的Error View. 因此,AppController会被调用两次。如果您解决了缺少的问题,AppController则调用一次。

于 2015-03-16T11:14:49.250 回答
0

我在 chrome 中遇到了同样的问题,我禁用了我的“HTML Validator”插件。哪个页面加载了两次

于 2013-07-09T08:46:57.197 回答