30. marts 2005 - 17:29Der er
40 kommentarer og 1 løsning
PHP script, der gemmer mysql query fejl i en tabel.
Hej, jeg bruger mysql og php og kunne egentligt godt bruge et smart script, der gemmer mysql_error() i databasen. Så kan jeg evt finde fejl jeg ikke har opdaget osv. Kan der laves noget smart i 'or die (mysql_error())' ??? Jeg plejer at bruge 'or die ($fejlmelding)' og vil stadig gerne have at der ryger en brugervenlig fejlmelding ud. Men mysql fejlen vil jeg gerne gemme!
Med version 7 af TeamShare tager Lector næste skridt og bygger en platform for AI-agenter, der i højere grad kan følge medarbejderen gennem hele arbejdsprocessen.
Dumt at gemme databasefejl i databasen. Hvad nu hvis det er databasen der er nede? :) Mail dem til dig selv, eller en mailkonto beregnet til formålet - F.eks. en gmail-konto! :)
coderdk: det er meget reelt argument, men med det eksmpel jeg har givet gør det vel ikke noget. Fejlbeskeden er jo ligegyldig hvis databasen er nede (bortset fra at han skal vide at den er nede så han kan starte den igen - men dette kan løses ved en mail løsning når der connectes).
bromer, yeps, den var nu heller ikke speceielt møntet på dig, mere at han ønsker at gemme databasefejl i databassen :) Men en krydsning kunne man jo, gem fejlen i databasen, hvis det fejler så smid en mail :)
coderdk: Jeg tog det heller ikke som et angreb, argumentede blot for at det stadig gav mening :)
Men en hybrid er bestemt en god løsning:
function my_debug($str) { mysql_query("insert into log values ('" . $str . "')") OR DIE(mail("someemail","could not insert database error into the database",mysql_error()); printf("Der er sket en fejl"); exit(); }
Jeg tror nu bare jeg vil skrive fejlene i en db. ingen emails. Det er mest for at sikre at db'en ikke laver alt for mange fejl :o) (Jeg har jo sommetider fundet en dum fejl i et script. Efter flere måneder kan sådan en djævel lave kuk i det hele.)
Virker det bromer skriver som det skal? Nogen der er uenige eler har et bedre forslag, så skriv endelig...
hvi nu db er nede og jeg bruger dette: function my_debug($str) { mysql_query("insert into log values ('" . $str . "')") OR DIE(mail("someemail","could not insert database error into the database",mysql_error()); printf("Der er sket en fejl"); exit(); }
så får brugeren da ikke en fejl vel? Den når vel ikke længere end til: or die(mail())
nej, jeg mener. brugeren får ikke beskeden, for den dør jo (die) i linien lige ovenover.
Jeg forstår det sådan: indsæt fejlen idatabasen - og hvis det ikke lykkes så skriv en mail og exit; Nichts weiter! Altså får brugeren ikke sin fejlmeddelelse.
function my_debug($str) { mysql_query("insert into log values ('" . $str . "')") OR DIE(printf("Der er sket en fejl");mail("someemail","could not insert database error into the database",mysql_error());
Jo, som jeg sagde det er korrekt ;) Hvis databasen ER nede får du en mail og brugeren ser intet. Er den ikke nede får brugeren "Der er sket en fejl" og der bliver skrevet i loggen ;)
se den løsning jeg lige skrev hvor printf er det første der udføres i die. Så vil brugeren altid se fejlbeskeden. Du kan også ændret printf til en custom funktion der printer en flot fejlbesked eller hvad ved jeg.
<?php function reg_fejl_og_vis_fejlbesked($mysql_error,$this_file,$line_number,$email_to,$email_from,$sorry_message) { mysql_query("INSERT INTO all_errors (mysql_error,this_file,line_number) VALUES ('".$mysql_error."','".$this_file."','".$line_number."') ") OR die( printf($sorry_message); mail($email_to,"Database error!","It wasnt possible to save this error in all_errors : /n".$mysql_error." /n/nFile: ".$this_file." /nLine: ".$line_number." (might not be accurate)/n/nMYSQL_ERROR(): (reason) /n".mysql_error(),"From:".$email_from."<".$email_from.">"); ); exit(); }
mysql_query("bla") or reg_fejl_og_vis_fejlbesked(mysql_error(),'filnavn.php',__LINE__,'email@to.com','email@from.com','fejlbesked');
Jo, men så ser brugeren ingen fejl hvis databasen ikke fejler:
<?php
function reg_fejl_og_vis_fejlbesked($mysql_error,$this_file,$line_number,$email_to,$email_from,$sorry_message) { mysql_query("INSERT INTO all_errors (mysql_error,this_file,line_number) VALUES ('".$mysql_error."','".$this_file."','".$line_number."') ") OR die( printf($sorry_message); mail($email_to,"Database error!","It wasnt possible to save this error in all_errors : /n".$mysql_error." /n/nFile: ".$this_file." /nLine: ".$line_number." (might not be accurate)/n/nMYSQL_ERROR(): (reason) /n".mysql_error(),"From:".$email_from."<".$email_from.">"); ); printf($sorry_message); exit(); }
mysql_query("bla") or reg_fejl_og_vis_fejlbesked(mysql_error(),'filnavn.php',__LINE__,'email@to.com','email@from.com','fejlbesked');
// Ser det rigtigt ud :o) ?>
Jeg har blot indsat en printf efter databasekaldet
Det kunne ikke lade sig gøre med 'or die' Men jeg lavede det istedet ca. således:
function gem_fejl_i_db_mm($fejl) mysql_query("INSERT INTO DB_FEJL ('fejl') VALUES ('$fejl') "); if (mysql_error()){ mail("webmasters@email","fejl. Kan ikke få adgang til DB \n\nFOrsøgte at gemmedenne fejl: \n".$fejl,"From:navn<email>"); } echo "Der opstod en fejl!..."; exit; }
Håber at andre kan bruge det os :o)
Synes godt om
Ny brugerNybegynder
Din løsning...
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.