CakePHP: Aksiyon sebepsiz, iki kez çalışır

8 Cevap php

Herkese selamlar!

I have a strange problem with my cake (cake_1.2.0.7296-rc2). My start()-action runs twice, under certain circumstances, even though only one request is made.

The triggers seem to be : - loading an object like: $this->Questionnaire->read(null, $questionnaire_id); - accessing $this-data

If I disable the call to loadAvertisement() from the start()-action, this does not happen. If I disable the two calls inside loadAdvertisement(): $questionnaire = $this->Questionnaire->read(null, $questionnaire_id); $question = $this->Questionnaire->Question->read(null, $question_id); ... then it doesn't happen either.

Neden?

Aşağıda benim kodunu görmek, Controller "questionnaires_controller" dir.

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']));
    }

}

I really don't understand this... it don't think it's meant to be this way. Any help would be greatly appreciated! :)

Regards, Stu

8 Cevap

Örneğin favicon.ico bir yanlış bağlantı denetleyicisi eylemi ikinci kez tetiklenir neden olur, olmayan bağlantılar için düzenini kontrol edin. Webroot ziyade yerel dizinde doğru emin favicon.ico puan yapmak, ya da başka bir istekleri / denetleyicisi / eylem / favicon.ico yerine / favicon.ico için oluşturulmuş olacak - ve böylece eylemi tetikler.

Bu da görüntülerde, stil ve javascript içeren ile olabilir.

$ Id bir int kontrol karşı, daha sonra $ id herhangi bir işlevselliği ilerliyor önce veritabanında birincil anahtar olarak var olmak için kontrol edin.

Benim için bir JS konuydu.

Sarılmış içeriği JS yeniden yürütmek jQuery ile şal işlevi dikkat!

Bunu deneyin ve debug_print_backtrace () işlevini kullanarak nereden geldiğini öğrenmek isteyebilirsiniz. (http://nl.php.net/manual/en/function.debug-print-backtrace.php

Belirli bir eylem rasgele 2-3 kez çalışan ile aynı sorun vardı. Ben iki nedeni izini:

  • Firefox eklenti yYAVAŞ (tarayıcınızın adres çubuğundan bir sayfa yüklenirken değil zaman Enter tuşuna basarak) F5 kullanarak yeniden sayfaları neden bu kadar Tercihler otomatik olarak yüklemek için kurulmuştur.

  • Ben bir $ html-> bağlantı (seçeneklerinden içinde hatalı bir css stil bildirimini) vardı; bazı durumlarda background-image olarak sona ereceğini: url ('');, ayrıca tekrarlanmasına neden oldu. Background-image için bağlantı için stil ayarlama: none; görüntü yok benim için sabit şeyler mevcut iken.

Umarım bu yardımcı olur. Ben bu oldukça eski bir yazı olduğunu biliyorum, ama bu sorun ararken Google'da oldukça yüksek gelir gibi, ben hala yayınlayarak başkalarına yardım düşündüm.

İyi şanslar

Jeroen den Haan

Ben bu son hafta gibi bir sorun vardı.

İki olası nedenler

  • Arızalı yolları (sizin rotalar yapılandırmasını kontrol DO)
  • Arızalı AppController. Özellikle beforeFilter () ve BeforeRender için, AppController içine şeyler yükler eklemek () bu yüzden de bu kontrol etmek isteyebilirsiniz.

Bir şey daha, nereye Oturumunda Questioneer.id ayarlıyorsunuz vardır? Belki de bu sorun?

Web sayfası, bir kırık link olduğunda Evet, bu gerçekleşir. Her tarayıcı (Firefox 2x diyor) çeşitli şekillerde onunla ilgilenir. Bunu test, CakePHP v1.3 ve v2.2.1 hiçbir fark yoktur. , Suçlu kim olduğunu bulmak koduna bu satırı eklemek, ve sonra www klasörü sana ikinci oluşturulan dosyayı açmak için:

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: Öncelikle bunun için jQuery suçlarlar. Ama sonunda bu 3 parça komut AJAX yükleme için görüntü unutuldu.

Firefox için YSlow devre dışı çözüldü, aynı problem vardı.

Teşekkürler Jeroen den Haan.

Ben krom aynı problem vardı, benim 'HTML Validator' eklenti devre dışı. Iki sayfa yüklenirken Hangi