php cakephp action cakephp-1.2

CakePHP: la acción se ejecuta dos veces, sin una buena razón



action cakephp-1.2 (9)

Es posible que desee probar y averiguar de dónde viene utilizando la función debug_print_backtrace (). ( http://nl.php.net/manual/en/function.debug-print-backtrace.php

Tengo un problema extraño con mi pastel (cake_1.2.0.7296-rc2). My start () - action se ejecuta dos veces, en determinadas circunstancias, aunque solo se realice una solicitud.

Los desencadenantes parecen ser: - cargando un objeto como: $this->Questionnaire->read(null, $questionnaire_id); - accediendo a $ this-data

Si deshabilito la llamada a loadAvertisement() desde la acción de start() , esto no ocurre. Si deshabilito las dos llamadas dentro de loadAdvertisement():

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

... entonces tampoco sucede.

¿Por qué?

Ver mi código a continuación, el controlador es "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''])); } }

Realmente no entiendo esto ... no creo que sea así. ¡Cualquier ayuda sería muy apreciada! :)

Saludos, Stu


Compruebe su diseño en busca de enlaces inexistentes, por ejemplo, un enlace mal configurado a favicon.ico causará que la acción del controlador se active por segunda vez. Asegúrese de que favicon.ico apunte hacia la raíz web en lugar del directorio local, de lo contrario se generarán solicitudes para /controller/action/favicon.ico en lugar de /favicon.ico, y así se activará su acción.

Esto también puede suceder con imágenes, hojas de estilo y Javascript incluye.

Para comprobarlo, el $ id es una int, luego verifique para asegurarse de que $ id exista como clave principal en la base de datos antes de pasar a cualquier funcionalidad.


Tuve el mismo problema, con una determinada acción que se ejecuta aleatoriamente 2-3 veces. Seguí dos causas:

  • El complemento de Firefox Yslow se configuró para cargarse automáticamente desde sus Preferencias, lo que hace que las páginas se vuelvan a cargar cuando se usa F5 (no cuando se carga la página desde la barra de direcciones del navegador y se presiona Intro).

  • Tenía una declaración de estilo css defectuosa dentro de las opciones de un enlace $ html-> (); en algunos casos, terminaría como imagen de fondo: url ('''') ;, lo que provocó una repetición también. Configuración del estilo del enlace a background-image: none; cuando no había imagen disponible, cosas arregladas para mí.

Espero que esto ayude. Sé que esta es una publicación bastante antigua, pero como aparece muy alto en Google al buscar este problema, pensé que podría ayudar a otros publicando.

Buena suerte

Jeroen den Haan


Tuve un problema como este la semana pasada.

Dos posibles razones

  • Rutas defectuosas (verifique la configuración de sus rutas)
  • AppController defectuoso. Agrego un montón de cosas a AppController, especialmente a beforeFilter () y beforeRender (), por lo que es posible que también quiera verificarlas.

Una cosa más, ¿dónde está configurando el Questioner.id en su Sesión? Tal vez ese es el problema?


Para mí fue un problema de JS.

¡Cuide la función de ajuste con jQuery que vuelve a ejecutar JS en el contenido empaquetado!


Sí, ocurre cuando hay un enlace roto en la página web. Cada navegador lo trata de manera diversa (Firefox lo llama 2 veces). Lo probé, no hay diferencia en CakePHP v1.3 y v2.2.1. Para saber quién es el culpable, agregue esta línea al código y luego abra el segundo archivo generado en su carpeta 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

PD: Primero culpo a jQuery por eso. Pero al final se olvidó la imagen para la carga de AJAX en el guión de la tercera parte.


Tuve el mismo problema en Chrome. Inhabilité mi complemento de ''Validador HTML''. Que estaba cargando la página dos veces


Estaba teniendo un problema similar, el problema parecía estar aislado de la insensibilidad a mayúsculas y minúsculas en el punto final.

es decir:
http: // server / Questionnaires / loadAvertisement -vs-
http: // servidor / cuestionarios / loadavertisement

Cuando se llama al punto final con la carcasa adecuada, el método se ejecutó una vez, mientras que el canal inferior se ejecutó dos veces. El problema estaba ocurriendo esporádicamente, sucediendo en un controlador, pero no en otro (esencialmente la misma lógica, sin componentes adicionales, etc.). No pude confirmarlo, pero creo que la culpa es del navegador, no del CakePHP en sí mismo.

Mi solución fue asegurarme de que cada enlace de punto final estuviera en línea. Para ir más allá, agregué variantes de casos comunes a la configuración de la ruta:

app / config / routes.php

<?php // other routes.. $instructions = [''controller''=>''Questionnaires'',''action''=>''loadAvertisement'']; Router::connect(''/questionnaires/loadavertisement'', $instructions); Router::connect(''/QUESTIONNARIES/LOADADVERTISEMENT'', $instructions); // ..etc


Si pierde <something> , por ejemplo, una Vista, Cake activará un error <something> falta e intentará mostrar su Error View . Por lo tanto, AppController se llamará dos veces. Si resuelve el problema que falta, se llama a AppController una vez.