2017-12-08 1 views
0

Ich versuche, das Verhalten von Flash-Nachrichten in nativem PHP zu imitieren, für die einmalige Anzeige von Fehlermeldungen.Store-Wert des Sitzungsschlüssels, dann unset?

Anzeige der Login-Seite:

public function showLoginAndRegistrationPage() 
{ 
    $session = new Session(); 

    $data['errors']['login']['account'] = $session->getFormErrorFlashData('login', 'account'); 

    $this->viewPresenter->display('basic', 'customer/login-registration', $data, 'Login/Register'); 
} 

die Login-Daten überprüfen:

public function processLogin() 
{ 
    // Some code 
    $session  = new Session(); 

    if($this->formInputFilter->isValid()) { 

    // Some code 

     if(true) { 
    // Some code 
     } else { 
      $errors = array(
       'account' => 'Account does not exist.' 
      ); 
      $session->setFormErrorFlashData('login', $errors); 

      header('Location: /login'); 
     } 
    } else { 
      header('Location: /login'); 
    } 
} 

Für die Fehlermeldungen einstellen:

public function setFormErrorFlashData($form, $errors = array()) 
{ 
    foreach($errors As $field => $message) { 
     $_SESSION['errors']["{$form}"]["{$field}"] = $message; 
    } 
} 

Für die Fehlermeldungen immer gespeichert in die Sitzung:

public function getFormErrorFlashData($form, $field) 
{ 
    if(isset($_SESSION['errors']["{$form}"]["{$field}"])) { 
     $message = $_SESSION['errors']["{$form}"]["{$field}"]; 

     unset($_SESSION['errors']["{$form}"]["{$field}"]); 

     return $message; 
    } 
} 

Grundsätzlich für einen ungültigen Versuch, nach Umleitung sollte nun die Anzeige ‚Konto existiert nicht‘ Nachricht, und dann, wenn der Benutzer die Seite aktualisiert wird, soll es nicht mehr da sein.

Was passiert, wenn ich die unset() Linie in getFormErrorFlashData() Kommentar aus , die $_SESSION die Fehler enthält, aber natürlich wie erwartet sie auch nach unzähligen Seitenaktualisierungen bestehen bleiben.

Aber wenn es nicht auskommentiert ist, bekomme ich eine NULL. Es scheint, dass $message auch nicht festgelegt ist, auch nachdem versucht wurde, den Wert dieses Sitzungsschlüssels darin zu speichern.

Ich habe eine Bootstrap-Datei, die die session_start() Zeile hat, ist es für jede Seite geladen, so bezweifle ich, dass das die Ursache ist?

UPDATE:

index.php (Bootstrap-Datei)

<?php 

session_start(); 
date_default_timezone_set('Asia/Taipei'); 

require_once 'core/Autoloader.php'; 

use core\Autoloader As Autoloader; 
use core\Router As Router; 
use core\Dispatcher As Dispatcher; 

spl_autoload_register('core\Autoloader::loadClass'); 
$request_uri = trim($_SERVER['REQUEST_URI']); 
$router   = new Router(); 
$route   = $router->handleRequest($request_uri); 

if (!$route) {  
    require_once ('./views/errors/404.php'); 
} else { 
    $dispatcher  = new Dispatcher($route); 

    $isDispatched = $dispatcher->dispatch(); 
    if (!$isDispatched) { 
     echo '<div>' .$route['class'] .'/' . $route['action'] . ' not found </div>'; 
     require_once ('./views/errors/404.php'); 
    } 
} 
+0

Ich habe Ihren Code getestet und es funktioniert gut !. Vielleicht ist das Problem woanders, nicht sicher, ob es die Bootstrap-Datei ist – FatalError

+0

@FatalError Hallo, ich habe meine Frage aktualisiert. Ich hoffe, du kannst mir helfen, ich habe schon seit zwei Tagen darum gekämpft. Wenn Sie noch mehr Code benötigen, lassen Sie es mich bitte wissen. Ich vermute mehrere Seitenanfragen, aber ich kann mir noch nicht vorstellen, wie das in dieser Situation aussehen würde. Ich rufe 'getFormErrorFlashData() 'nirgendwo sonst auf. – herondale

+0

@FatalError Ich habe meinen Code aktualisiert. Ich habe auch einen Header im äußeren 'else' Block in' processLogin() '. Könnte das ein Faktor sein? – herondale

Antwort

0

Ich habe den Täter gefunden.

Als ich die Anfrage Protokolle verfolgt, wurde showLoginAndRegistrationPage() zweimal genannt, weil ich ich hatte auch mit einem submit Event-Handler, die zu gefeuert wird, so dass die Doppelseitenanfragen in der HTML-Datei angehängt eine .js Datei nicht ahnten.

Ich habe die Datei entfernt und jetzt funktioniert es.

Danke für die Hilfe!