Leonard wrote:
> Jonas Koch Bentzen <ingen.email@eksempel.dk> wrote:
>
>>die(mysql_error()) er ikke bare verdens mest brugte fejlhåndtering, det
>>er også den dårligste. Så er det sagt :) Spørg, hvis du vil have argumenter.
>
> Det vil jeg gerne
1. Fejlmeddelelsen vil i bedste fald være uforståelig for brugeren. I
værste fald vil den give oplysninger om databasen, som kan hjælpe en
hacker med at lave sjove ting. En kombination af manglende citering af
GET-variabler og det, at en person kender tabel- og feltnavnene, kan
være meget farlig.
2. Fejlmeddelelsen kan være skjult. Det vil f.eks. ske i følgende eksempel:
<select name='noget'>
<?php
$resultat = mysql_query('SELCT id, navn FRM tabel') or die(mysql_error());
while ($raekke = mysql_fetch_object($resultat)) {
echo "<option value='$raekke->id'>$raekke->navn</option>";
}
?>
</select>
Her vil fejlmeddelelsen komme ind mellem <select> og </select>, hvilket
betyder, at den i mange browsere ikke vil blive vist.
3. Generelt er det et problem, at scriptet uden videre dør midt i en
HTML-side. Udover, at det giver ugyldig kode, kan det også have en eller
flere af følgende virkninger:
I. Fejlmeddelelsen bliver vist langt nede på en side, så brugeren ikke
ser den.
II. Fejlmeddelelsen bliver skjult helt som en følge af, at den opstår
et uheldigt sted i HTML-koden.
4. Administratoren/programmøren får ikke besked om fejlen.
Ikke kun i HTML-sammenhæng, men også i GUI-programmering er det helt
ubrugeligt bare at lade scriptet stoppe og spytte en fejlmeddelelse ud.
I HTML-sammenhæng bør man danne en ny side, som kommer med en
fejlmeddelelse. I GUI-programmering (okay, HTML er også en GUI, men jeg
hentyder her til Gtk+ og lignende) bør man f.eks. lave en pop-up-boks
(alert-lignende ting), der fortæller om fejlen.
Og hvordan kommer man så med en helt ny side til fejlen, hvis man
allerede er nået langt ned i scriptet og HTML'en? Man bruger output
buffering-funktionerne. På toppen af siden kalder man ob_start(). Hvis
der opstår en fejl, fjerner man alt det, der hidtil er opsamlet i
output-bufferen, og begynder forfra: Udskriver sidehovedet (det har man
selvfølgelig en funktion til), udskriver en fejlmeddelelse og udskriver
sidefoden.
Her er en forenklet udgave af noget, jeg har brugt på et af mine sites:
<?php
// Fortæller PHP, at alle fejl skal håndteres
// af vores egen funktion, der hedder "error()":
set_error_handler("error");
ob_start();
function error($type, $message, $file, $lineNumber) {
ob_end_clean();
ob_start();
// Sidehovedet:
echo head();
echo "Der er opstået en fejl:<br/>\n";
// Skriver fejlmeddelelsen ned i en fejllog:
$message = date("Y-m-d H:i")." | ".basename($file).":$lineNumber |
$message";
error_log("$message\n", 3, ERRORLOG);
echo "Fejlen er nedskrevet i fejlloggen og bliver rettet hurtigst
muligt.\n";
// Sidefoden - og farvel...
exit(foot());
}
> og så formoder jeg du samtidig giver et forslag til
> en bedre.
Det har jeg gjort en del gange i denne gruppe, så derfor ville jeg ikke
gentage mig selv.
http://groups.google.com/groups?q=error+group:dk.edb.internet.webdesign.serverside.php+author:jonas+koch+bentzen&hl=da&lr=&ie=UTF-8&oe=UTF-8&selm=adi7eq%241fp%241%40sunsite.dk&rnum=8
http://www.evolt.org/article/Abstract_PHP_s_database_code_with_PEAR_DB/17/21927/index.html#comment32658
--
Jonas Koch Bentzen
http://findhim.com/