5

私のケーキ (cake_1.2.0.7296-rc2) に奇妙な問題があります。私の start() アクションは、特定の状況下で、リクエストが 1 つしか行われていないにもかかわらず、2 回実行されます。

トリガーは次のようです: - 次のようなオブジェクトのロード: $this->Questionnaire->read(null, $questionnaire_id); - $this-data へのアクセス

loadAvertisement()アクションからの呼び出しを無効にするとstart()、これは起こりません。内部の2つの呼び出しを無効にするとloadAdvertisement():

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

……それも起こらない。

なんで?

以下のコードを参照してください。コントローラーは「questionaires_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

レイアウトに存在しないリンクがないか確認してください。たとえば、favicon.ico へのリンクが誤って構成されていると、コントローラー アクションが 2 回トリガーされます。favicon.ico がローカル ディレクトリではなく webroot を指していることを確認してください。そうしないと、/favicon.ico ではなく /controller/action/favicon.ico に対してリクエストが生成され、アクションがトリガーされます。

これは、画像、スタイルシート、JavaScript インクルードでも発生する可能性があります。

$id が int であることを確認してから、機能に進む前に $id がデータベースに主キーとして存在することを確認します。

于 2008-12-09T17:01:08.193 に答える
2

私にとってはJSの問題でした。

ラップされたコンテンツで JS を再実行する jQuery のラップ機能に注意してください。

于 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つの理由

  • 誤ったルート (ルート構成を確認してください)
  • AppController に障害があります。AppController、特に beforeFilter() と beforeRender() にたくさんのものを追加しているので、それらもチェックしてみてください。

もう1つ、SessionでQuestioneer.idをどこに設定していますか? おそらくそれが問題ですか?

于 2009-06-03T13:09:09.037 に答える
1

はい、ウェブページに壊れたリンクがある場合に発生します。各ブラウザはさまざまに処理します (Firefox では 2x と呼ばれます)。テストしましたが、CakePHP v1.3 と v2.2.1 で違いはありません。犯人を突き止めるには、次の行をコードに追加し、wwwフォルダー内の 2 番目に生成されたファイルを開きます。

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

クロムでも同じ問題が発生しました。「HTML Validator」アドオンを無効にしました。ページを 2 回読み込んでいた

于 2013-07-09T08:46:57.197 に答える
0

<something>たとえば、ビューが見つからない場合、Cake は見つからない<something>エラーをトリガーし、その をレンダリングしようとしますError View。したがって、AppController2 回呼び出されます。欠落している問題を解決すると、AppControllerが 1 回呼び出されます。

于 2015-03-16T11:14:49.250 に答える