2011-09-16 8 views
5

Występuje problem, w którym moje kontrolery CodeIgniter są wywoływane dwukrotnie. Wydaje się, że tylko wtedy, gdy używam parametrów w uri (/ newsletter/confirm/a1938cas893vf9384f0384f0943). Jeśli usunę parametr z mojej funkcji, załaduje on tylko kontroler raz. Zauważyłem również, że przy parametrze w adresie URL, jeśli odświeżam stronę, ładuje się tylko raz. Wygląda więc na to, że ładuje się dwa razy tylko po wywołaniu nowej strony.Kontrolery CodeIgniter Ładowanie dwa razy przy użyciu parametrów w adresie URL

Na przykład przejście do/newsletter/confirm/a123 po raz pierwszy spowoduje dwukrotne załadowanie. Ale jeśli chcesz odświeżyć/newsletter/confirm/a123, załaduje się tylko raz. Skojarzyłem komentarze do mojego zgłoszenia, aby wyeliminować problem z widokiem powodującym to.

Czy brzmi to jak problem z pamięcią podręczną lub coś w moim pliku .htaccess? Dzięki za wszelkie sugestie.

Odpowiedni sterownik:

<?php 
error_reporting(-1); 
    ini_set('display_errors',1); 
class Test extends CI_Controller { 

    function __construct() { 
    parent::__construct(); 
     log_message('debug', 'MyController initialised'); 
    } 

    function confirm($code) 
    { 
     $this->load->helper(array('form')); 

     //$code = "6e930fe882c3b15712158812769dbcb636f96b8c"; 
     $result = $this->db->get_where('newsletter_members', array('nm_confirmation_code' => $code, 'nm_subscribed' => 0)); 

     if ($result->num_rows == 0) 
     { 
      $newsletter_message['newsletter_message'] = "Confirmation code is invalid or has already been confirmed."; 
      //$this->load->view('index_test', $newsletter_message); 
     } else { 
      $newsletter_message['newsletter_message'] = "Thank you for confirming your intent to subscribe to our newsletter!"; 
      $data = array(
        'nm_subscribed' => 1, 
        ); 
      $this->db->where('nm_confirmation_code', $code); 
      $this->db->update('newsletter_members', $data); 
      //$this->load->view('index_test', $newsletter_message); 
     } 

    } 

} 

?> 

plik .htaccess:

RewriteEngine On 
RewriteCond $1 !^([^\..]+\.php|robot\.txt|public|images|css|js|paul|event_docs|blog|citeforme|robots\.txt) 
RewriteRule ^(.*)$ /index.php/$1 [L] 

# BEGIN WordPress 
#<IfModule mod_rewrite.c> 
#RewriteEngine On 
#RewriteBase/
#RewriteCond %{REQUEST_FILENAME} !-f 
#RewriteCond %{REQUEST_FILENAME} !-d 
#RewriteRule . /index.php [L] 
#</IfModule> 
#RewriteEngine Off 
# END WordPress 

Oto co plik dziennika wygląda, można zobaczyć wszystko, co jest przeładowane dwukrotnie:

DEBUG - 2011-09-16 09:59:34 --> Config Class Initialized 
DEBUG - 2011-09-16 09:59:34 --> Hooks Class Initialized 
DEBUG - 2011-09-16 09:59:34 --> Utf8 Class Initialized 
DEBUG - 2011-09-16 09:59:34 --> UTF-8 Support Enabled 
DEBUG - 2011-09-16 09:59:34 --> URI Class Initialized 
DEBUG - 2011-09-16 09:59:34 --> Router Class Initialized 
DEBUG - 2011-09-16 09:59:34 --> Output Class Initialized 
DEBUG - 2011-09-16 09:59:34 --> Input Class Initialized 
DEBUG - 2011-09-16 09:59:34 --> Global POST and COOKIE data sanitized 
DEBUG - 2011-09-16 09:59:34 --> Language Class Initialized 
DEBUG - 2011-09-16 09:59:34 --> Loader Class Initialized 
DEBUG - 2011-09-16 09:59:34 --> Database Driver Class Initialized 
DEBUG - 2011-09-16 09:59:34 --> Controller Class Initialized 
DEBUG - 2011-09-16 09:59:34 --> MyController initialised 
DEBUG - 2011-09-16 09:59:34 --> Helper loaded: form_helper 
DEBUG - 2011-09-16 09:59:34 --> Final output sent to browser 
DEBUG - 2011-09-16 09:59:34 --> Total execution time: 0.0223 
DEBUG - 2011-09-16 09:59:34 --> Config Class Initialized 
DEBUG - 2011-09-16 09:59:34 --> Hooks Class Initialized 
DEBUG - 2011-09-16 09:59:34 --> Utf8 Class Initialized 
DEBUG - 2011-09-16 09:59:34 --> UTF-8 Support Enabled 
DEBUG - 2011-09-16 09:59:34 --> URI Class Initialized 
DEBUG - 2011-09-16 09:59:34 --> Router Class Initialized 
DEBUG - 2011-09-16 09:59:34 --> Output Class Initialized 
DEBUG - 2011-09-16 09:59:34 --> Input Class Initialized 
DEBUG - 2011-09-16 09:59:34 --> Global POST and COOKIE data sanitized 
DEBUG - 2011-09-16 09:59:34 --> Language Class Initialized 
DEBUG - 2011-09-16 09:59:34 --> Loader Class Initialized 
DEBUG - 2011-09-16 09:59:34 --> Database Driver Class Initialized 
DEBUG - 2011-09-16 09:59:34 --> Controller Class Initialized 
DEBUG - 2011-09-16 09:59:34 --> MyController initialised 
DEBUG - 2011-09-16 09:59:34 --> Helper loaded: form_helper 
DEBUG - 2011-09-16 09:59:34 --> Final output sent to browser 
DEBUG - 2011-09-16 09:59:34 --> Total execution time: 0.0213 
+0

Użytkownik rejestruje wiadomości gdzieś. Klasa nadrzędna kontrolera działa tak samo w funkcji __construct, więc w dzienniku błędów pojawią się dwa komunikaty o błędzie "Inicjalizacja mojego kontrolera" i dwa komunikaty o błędzie "Inicjowane klasy kontrolera" - tak? –

+0

Tak, Calle, ale to nie są jedyne rzeczy, które są ładowane dwa razy, wszystko jest ładowane dwa razy i wysyłane do przeglądarki. Wczytałem mój pierwotny wpis z tym, jak wygląda mój dziennik po dwukrotnym załadowaniu. – aberrant

Odpowiedz

1

I nie wiem, czy to Twój .htaccess, plik, ale użyłem tego przez jakiś czas i nigdy nie miałem problemu:

RewriteEngine On 
RewriteBase/

# Allow any files or directories that exist to be displayed directly 
RewriteCond %{REQUEST_FILENAME} !-f 
RewriteCond %{REQUEST_FILENAME} !-d 
RewriteRule ^(.*)$ index.php?/$1 [L,QSA] 

powiedziałbym po prostu zmienić plik pierwszy i sprawdzić, czy to rozwiązuje problem, również upewnić się, że w pliku config.php zmienna index_page jest puste tak:

$config['index_page'] = ''; 

jeszcze jedno, czy definiujesz jakieś trasy w pliku routes.php? Może powodują dziwną pętlę, która ładuje stronę dwukrotnie.

8

Generalnie jest to spowodowane "brudnymi" szablonami tworzącymi fałszywe wywołania CSS, JavaScript i obrazów.

Najlepiej jest postarać się temu zapobiec, uważnie przeglądając wszystkie wywołania zasobów w szablonach, ale jeśli ktoś robi szablony, które czasami nie jest możliwe.

Oto co zrobiłem w tym przypadku:

Sprawdzenie czy HTTP_REFERRER jest taka sama jak REQUEST_IRI. Jeśli tak, to wiesz, że coś jest wywoływane z tej samej strony, która jest aktualnie ładowana, a więc masz fałszywe połączenie z brakującym zasobem.

Umieszczam następujący kod u góry, jeśli kontroler (ten kod działa również w pliku punktu wejścia index.php).

$self_referrer = $_SERVER['REQUEST_SCHEME']."://".$_SERVER['SERVER_NAME'].$_SERVER['REQUEST_URI']; 

    if(isset($_SERVER['HTTP_REFERER']) && $_SERVER['HTTP_REFERER'] == $self_referrer){ 
     return; // no point in going further since this is a bogus call... 
    } 
0

odpowiedź Piotra dostaje się zamknąć, ale jeśli kiedykolwiek przekierowanie z adresu URL do tej samej zawartości będzie zatrzymać i doprowadzić do pustej strony. Występuje również problem z korzystaniem z przycisku Wstecz w przeglądarce. Czy możemy sobie z tym poradzić lepiej?

Powiązane problemy