Webstatt.org - Community seit 2006 - 2012 (2024?)

error handling

Avatar user-279
05.10.2006 12:29

so - ich hab das jetzt endlich mal ausprobiert lächeln
funktioniert eigentlich auch ganz gut - die ausgabe von einem WARNING ist ja aber zb.

Warning: user-129utzername stimmt nicht mit Passwort überein! in C:\Inetpub\wwwroot\php\error.php on line 26


ich möchte aber nur:

Benutzername stimmt nicht mit Passwort überein!


ist das möglich?
hier ist mein code:

<?php
// Fehler Konstanten definieren
define("WARNING", E_USER_WARNING);

// Error Stufe einstellen
error_reporting(WARNING);

// Error Handler & Ausgabe
function errorHandler ($stufe, $error) {
$print = '<p class="error">';
$print.= $error;
$print.= '</p>';

echo $print;
}

// Test Logindaten setzen
$user = "user";
$pass = "pass";

// Eingabe prüfen
if ($_POST["action"] == "login"zwinkern {
if ($_POST["username"] == $user && $_POST["passwort"] == $pass) {
echo "alles gut!";
} else {
trigger_error("Benutzername stimmt nicht mit Passwort überein!", WARNING);
}
}

// Error Handler setzen
set_error_handler("errorHandler"zwinkern;

?>
<form method="post">
Username: <input type="text" name="username" /><br />
Passwort: <input type="password" name="passwort" /><br />
<input type="submit" name="action" value="login" />
</form>

Avatar user-279
05.10.2006 12:52

eine zweite frage - wenn ich das error handling jetzt in eine grössere seite einbauen würde.. dann müsste ich am besten den code:

// Fehler Konstanten definieren
define("WARNING", E_USER_WARNING);

// Error Stufe einstellen
error_reporting(WARNING);

// Error Handler & Ausgabe
function errorHandler ($stufe, $error) {
$print = '<p class="error">';
$print.= $error;
$print.= '</p>';

echo $print;
}


includen..

und was ist mit

// Error Handler setzen
set_error_handler("errorHandler"zwinkern;


? kann ich das auch includen oder muss ich das nach jedem php block (in dem es einen fehler geben könnte) schreiben?

danke!

Avatar user-253
05.10.2006 13:11

Die zweite Frage zuerst: du musst set_error_handler auch nur einmal - am besten am Anfang des Scripts - einfügen. Ganz wichtig und damit kommen wir zu Frage 1: set_error_handler muss natürlich VOR trigger_error aufgerufen werden.

In deinem Codebeispiel wird für trigger_error noch die Standardfunktion verwendet.

Avatar user-279
05.10.2006 13:15

ach so - danke.
wenn ich set_error_handler vor meinem handler schreibe kommt eine augabe:

Undefined index: action


was ist das?
dafür funzt dann beim abschicken der fehler prima.

//hat bestimmt was mit error_reporting(WARNING); zu tun oder? kann ich irgendwie alle fehler unterdrücken ausser meine?

Avatar user-253
05.10.2006 13:26

Natürlich NACH den Handler aber VOR trigger_error

set_error_handler legt intern ja etwa wie eine Funktionsrefernz an, dafür muss die Handlerfunktion ja existieren. trigger_error ruft die mit set_error_handler definierte Funktion (oder die Standardfunktion) auf, also muss du vor trigger_error definieren welche Funktion verwendet werden soll, damit es klappt.

Avatar user-279
05.10.2006 13:51

jo macht sinn, habs jetzt so - der fehler bleibt aber:

<?php
// Fehler Konstanten definieren
define("WARNING", E_USER_WARNING);

// Error Stufe einstellen
error_reporting(WARNING);

// Error Handler & Ausgabe
function errorHandler ($stufe, $error) {
$print = '<p class="error">';
$print = '<strong>Error</strong><br />';
$print.= $error;
$print.= '</p>';

echo $print;
}

// Error Handler setzen
set_error_handler("errorHandler"zwinkern;

// Test Logindaten setzen
$user = "user";
$pass = "pass";

// Eingabe prüfen
if ($_POST["action"] == "login"zwinkern {
if ($_POST["username"] == $user && $_POST["passwort"] == $pass) {
echo "alles gut!";
} else {
trigger_error("Benutzername stimmt nicht mit Passwort überein!", WARNING);
}
}
?>

Avatar user-253
05.10.2006 14:13

Der Fehler "Undefined index: action" kommt aus deiner Abfrage if ($_POST["action"] == "login"zwinkern Eventuell existiert $_POST['action'] ja gar nicht.

Du hast richtig erkannt, die Ausgabe kommt, da nun alle entsprechenden Fehlermeldungen über deine Funktion ausgegeben werden. Also auch Warnungen des Interpreters.

Du kannst dies umgehen, indem du in deiner Funktion nach Errortypen differenziert. Beispielsweise - ganz simpel - nur bei $stufe == WARNING eine Ausgabe erzeugst.

Avatar user-279
05.10.2006 14:19

ah so einfach ist das zwinkern
hatte vorher noch ein switch..case drin aber das hab ich wieder rausgenommen da ich fürs beispiel nur eine bedingung brauche. jetzt ist es wieder drin..

danke dir für deine stets hilfreiche antworten!

/edit.

letzte fragen:
- macht mein code jetzt sinn so, bzw. kann ich/soll ich das jetzt auch für grössere anwendungen einsetzen (natürlich mit mehreren user_warning's...)
oder fehlen da noch sachen?

- macht es sinn für die fehlerausgaben noch mal eine funktion zu schreiben, oder soll ich die ausgabe im errorHandler behalten?

- warum ist jetzt eigentlich, mal von der sauberkeit & der idee abegesehen, diese variante "besser" als zb. eine normale funktion die einfach einen fehler ausgibt?
denn eigentlich hat man ja so mehr code als wenn man einfach eine kleine fehlerfunktion hat. was sind die vorteile?

Avatar user-253
05.10.2006 14:49

Die Reihenfolge deines Codes ist richtig und kann so bleiben.

Wie du deine Fehlerausgabe gestaltest hängt zu sehr von den speziellen Anforderungen ab, eine allgemeine Antwort darauf gibt es einfach nicht. Als Ansatzpunkte: die Ausgabe und Behandlund der Fehlertypen soll vermutlich ja nicht gleich sein. In einem OOP Framework eröffnen sich noch weitere Möglichkeiten, insbesondere sollte man eine Ausgabe per echo/prnt tunlichst vermeiden und auf Templates setzen.

Die Vorteile liegen auf der Hand. Sauberkeit und die Idee sollte man zuerst natürlich nicht ignorieren. Weiterhin eröffnet die Spezifikation von Handler ganz neue Möglichkeiten: Du könntest beispielsweise bestimmte Errortypen in eine Logdatei eintragen oder dir als Administrator eine Mail schreiben. Ferner kann die Ausgabe angepasst oder gesammelt werden.
In einer OOP Umgebdung könnte man die Fehler auch in Klassenvariablen speichern (zumindest manche) um zu einem späteren Zeitpunkt bearbeiten oder beispielsweise in die fertige Setie als Hinweis einsetzen.

Die Aufzählung ist natürlich nicht vollständig.

Viele Grüße,
Michael

// edit

So ist es auch einheitlich möglich, dass der User keine Fehler sieht und du als Seitenbetreiber dennoch informiert bist. Sicherlich ist diskussionswürdig, ob eine reine Logfunktion der Sinn dieser Möglichkeit ist oder es pervertiert. Sinnvoll ist es dennoch.