2010-02-05 7 views
5

Używam własnej metody od lat, ale pomyślałem, że może nie jest to najlepszy sposób, aby to osiągnąć.Jaki jest dobry sposób na pokazywanie błędów/wiadomości użytkownikom w php?

Zasadniczo gdy chcę rzucać błąd użytkownikowi, lub potwierdzenie wyświetlacza udanej akcji, I wykonaj następujące czynności:

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(); 

} 

to mam funkcję jak

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

i Wstawiłem show_message(); na górze każdej strony, aby wyświetlić możliwe błędy, które mogą być rzucane na tę stronę.

Jakie są możliwe problemy z tym?

+0

Co zrobić, jeśli sesja nie działa, ponieważ klient nie akceptuje plików cookie? – Gumbo

+0

Byłem pod wrażeniem php, że przekażę SID za pośrednictwem adresu URL. EDYCJA: Moje wrażenie było fałszywe, nie działało. : o –

+0

Jedyne, co chciałbym dodać, to przekształcenie tych funkcji w metody dedykowanej klasy. Wiadomości używane w ten sposób są często nazywane wiadomościami flash w różnych frameworkach. To może być podstawą twojej klasy FlashMessage. –

Odpowiedz

3

Nie widzę niczego złego w tym podejściu. Technikę tę można znaleźć pod różnymi nazwami w dość wielu frameworkach, na przykład FlashMessenger in Zend Framework. Zwykle sesja jest zawijana w obiekcie zamiast w zwykłej tablicy sesji i za pomocą funkcji ViewHelper zamiast funkcji.

Aby upewnić się, że nie masz żadnych literówek w kluczach sesji podczas przypisywania wiadomości, możesz również zawinąć kod przypisujący w funkcję, np.

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

Mogłeś ją poprawić przez posiadające funkcję zwrot napisu zamiast echo ing go i osobiście użyję sprintf formatować dane wyjściowe. Sprawia, że ​​kod jest nieco bardziej czytelny, np.

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

Jak @Gumbo wskazał, funkcja może nie działać, gdy sesje nie działają, ale to będzie prawdopodobnie nakładają szereg innych problemów dla całej aplikacji wtedy, więc nie przeszkadza dokładnie o ten konkretny kawałek kodu.

Drobne rzeczy: $ _SESSION to superglobal, więc nie musisz używać słowa kluczowego global.

+0

Co masz na myśli przez "źle sformatowany"? –

+0

@Ja teraz w porządku. 'Unset's był w tej samej linii co echo. – Gordon

1

Szczerze mówiąc, zrobiłbym to nie z Sesjami, ale z adresem URL.

Zamiast ustawiać wiadomości dokonać klasy, która zawiera 'Komunikaty systemowe'

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

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

Następnie na register.php, sprawdzić parametr URL:

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

Jeżeli jesteś TYLKO pokazując komunikat, to naprawdę nie jest "wrażliwy" danych, a więc powinno być idealnie w porządku, aby umieścić go w adresie URL.

Następnie wystarczy

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

Works z/bez ciasteczek, a ty to znacznie bardziej scentralizowany. Jeśli chcesz zmienić treść wiadomości, wszystkie wiadomości są w tym samym miejscu.

Po prostu myśl ....

+0

Powszechną praktyką jest używanie sesji do wiadomości. – rick

+1

URL będzie wyglądać bałaganiarski? –

Powiązane problemy