Willkommen in der Webstatt Zum Webstatt Blog und Stories
phore phore am 05.10.06 14:29

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

Quote
Warning: Benutzername stimmt nicht mit Passwort überein! in C:\Inetpub\wwwroot\php\error.php on line 26


ich möchte aber nur:

Quote
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") {
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");

?>
<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>

netcup.de Warum gibt es hier Werbung?
phore phore am 05.10.06 14: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");


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

danke!

Michael Michael am 05.10.06 15: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.

phore phore am 05.10.06 15:15

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

Quote
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?

Michael Michael am 05.10.06 15: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.

phore phore am 05.10.06 15: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");

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

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

Michael Michael am 05.10.06 16:13

Der Fehler "Undefined index: action" kommt aus deiner Abfrage if ($_POST["action"] == "login") 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.

phore phore am 05.10.06 16:19

ah so einfach ist das ;)
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?

Michael Michael am 05.10.06 16: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.

Creative Commons Lizenzvertrag
Alle Inhalte des Webstatt-Archivs stehen unter einer Creative Commons Namensnennung - Weitergabe unter gleichen Bedingungen 3.0 Unported Lizenz.

Impressum & Kontakt