2010-02-05 1 views
5

Ich benutze meine eigene Methode seit Jahren, aber ich dachte mir, vielleicht ist es nicht der beste Weg, das zu tun.Was ist eine gute Möglichkeit, um Fehler/Nachrichten an Benutzer in PHP zu zeigen?

Im Wesentlichen, wenn ich einen Fehler an einen Benutzer oder Anzeige Bestätigung einer erfolgreichen Aktion werfen will, muss ich folgendes tun:

if($something == "condition") { 

    $_SESSION["message"] = "Your passwords didnt match! Make sure they are the same in both fields!"; 
    $_SESSION["message_type"] = 1; 
    header("Location:register.php"); 
    exit(); 

} 

dann habe ich eine Funktion wie

function show_message() { 
    global $_SESSION; 

    if (isset($_SESSION["message"])) { 
     echo "<div class='site_message type_" . $_SESSION["message_type"] . "'>" . $_SESSION["message"] . "</div>"; 
     unset($_SESSION["message"]); 
     unset($_SESSION["message_type"]); 
    } 
} 

und Ich legte show_message(); oben auf jeder Seite, um mögliche Fehler anzuzeigen, die auf diese Seite geworfen werden könnten.

Was sind die möglichen Probleme damit?

+0

Was ist, wenn die Sitzung nicht funktioniert, da der Client keine Cookies akzeptiert? – Gumbo

+0

Ich war unter dem Eindruck, dass php das durch die Weitergabe von SID durch die URL behandelt. EDIT: Mein Eindruck war falsch, es hat nicht funktioniert. : o –

+0

Das Einzige, was ich hinzufügen würde, wäre, diese Funktionen in Methoden einer dedizierten Klasse umzuwandeln. Auf diese Weise verwendetes Messaging wird in verschiedenen Frameworks häufig als Flash-Messaging bezeichnet. Dies könnte die Basis Ihrer FlashMessage-Klasse sein. –

Antwort

3

Ich sehe nichts falsch mit diesem Ansatz. Sie finden diese Technik unter verschiedenen Namen in einer Reihe von Frameworks, zum Beispiel FlashMessenger in Zend Framework. Normalerweise wird die Sitzung in ein Objekt anstelle des regulären Sitzungs-Arrays und mit einem ViewHelper anstelle einer Funktion eingeschlossen.

Um sicherzustellen, dass Sie bei der Zuweisung der Nachricht keine Tippfehler in den Sitzungsschlüsseln haben, können Sie den Zuweisungscode auch in eine Funktion einfügen, z.

function set_message($text, $type) 
{ 
    $_SESSION['message'] = array(
     'text' => $text, 
     'type' => $type 
    ); 
} 

Sie es, indem die Funktion Rückkehr die Zeichenfolge statt echo ing es und ich persönlich würde sprintf die Ausgabe zu formatieren verbessern könnte. Macht den Code etwas lesbarer imho, z.B.

return sprintf('<div id="message-box" class="type-%s">%s</div>', 
       $_SESSION["message"]["text"], 
       $_SESSION["message"]["type"]); 

Wie @Gumbo wies darauf hin, kann die Funktion nicht, wenn Sessions nicht funktionieren, aber das wird wahrscheinlich eine Reihe weiterer Probleme für die gesamte Anwendung verhängen dann, also würde ich über diese besonderen nicht genau Mühe Stück Code dann.

Geringfügige Sache: $ _SESSION ist ein superglobal, Sie müssen also nicht das Schlüsselwort global verwenden.

+0

Was meinen Sie mit "schlecht formatiert"? –

+0

@Yegor ist es jetzt in Ordnung. Die 'Unset's waren auf der gleichen Linie wie das Echo. – Gordon

1

Ehrlich gesagt, würde ich dies nicht mit Sitzungen tun, aber mit der URL.

Statt eine Nachricht zu setzen, eine Klasse machen, die 'Systemmeldungen'

class SystemMessages{ 
    protected $messages = array(
      0 => "Some Error Message"); 

    public function getMessage($id) 
    { 
     return $this->messages[$id]; 
    } 
} 

Dann enthält, auf Ihrem register.php, überprüfen Sie für einen URL-Parameter:

$messageObject = new SystemMessages; 
if(!empty($_GET['message'])) 
{ 
    $message_id = intval($_GET['message']); // Clean User Input 
    $message = $messageObject->getMessage($message_id); 
    // handle message 
} 

Wenn Sie NUR zeigt eine Nachricht, dann ist es wirklich nicht "sensible" Daten, und daher sollte es völlig in Ordnung sein, es in die URL zu setzen.

Sie dann nur

header('Location: register.php?message=0'); 

Arbeiten mit/ohne Cookies, und Sie es viel mehr zentralisiert. Wenn Sie den Wortlaut einer Nachricht ändern möchten, befinden sich alle Nachrichten an derselben Stelle.

Nur ein Gedanke ....

+0

Es ist üblich, Sitzungen für Nachrichten zu verwenden. – rick

+1

URL wird chaotisch aussehen? –