Avatar billede learner Praktikant
30. marts 2005 - 17:29 Der 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!

Kan det lade sig gøre?
Hvordan skal det gøres?

På forhånd tak!
Learner
Avatar billede bromer Nybegynder
30. marts 2005 - 17:32 #1
Du kunne lave "or my_debug(mysql_error())"

function my_debug($str) {
mysql_query("insert into log values ('" . $str . "')");
printf("Der er sket en fejl");
exit();
}
Avatar billede coderdk Praktikant
30. marts 2005 - 17:35 #2
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! :)
Avatar billede bromer Nybegynder
30. marts 2005 - 17:38 #3
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).
Avatar billede coderdk Praktikant
30. marts 2005 - 17:42 #4
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 :)
Avatar billede bromer Nybegynder
30. marts 2005 - 17:45 #5
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();
}
Avatar billede bromer Nybegynder
30. marts 2005 - 17:47 #6
der mangler lige et ) i mail linien :(
Avatar billede learner Praktikant
30. marts 2005 - 17:53 #7
Jamen hovsa, er det virklig så enkelt :o)

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

Indtil videre tak
Avatar billede bromer Nybegynder
30. marts 2005 - 17:56 #8
jeg testede den første version (den uden mail) og den virkede fint efter hensigten.
Avatar billede coderdk Praktikant
30. marts 2005 - 17:56 #9
Mnæh så er bromer's første forslag fint, du skal bare oprette en tabel... Noget i stil med:

CREATE TABLE log (
  logmsg TEXT
  ,id UNSIGNED INT auto_number
  ,PRIMARY KEY(id)
);
Avatar billede learner Praktikant
30. marts 2005 - 18:01 #10
det der 'or die' er det ik det samme som exit; doo
Avatar billede bromer Nybegynder
30. marts 2005 - 18:02 #11
det er det samme

http://dk2.php.net/die
Avatar billede learner Praktikant
30. marts 2005 - 18:13 #12
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())
Avatar billede coderdk Praktikant
30. marts 2005 - 18:17 #13
Det er korrekt, hvis databasen ikke er nede får brugeren "Der er sket en fejl" og scriptet stopper.
Avatar billede learner Praktikant
30. marts 2005 - 18:22 #14
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.

Har jeg ik ret?
Avatar billede bromer Nybegynder
30. marts 2005 - 18:23 #15
jo det er korrekt. Men det kan ordnes :

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());
 
  exit();
}
Avatar billede coderdk Praktikant
30. marts 2005 - 18:24 #16
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 ;)
Avatar billede bromer Nybegynder
30. marts 2005 - 18:24 #17
coderdk: yepper
Avatar billede learner Praktikant
30. marts 2005 - 18:27 #18
Kan vi ik lave det sådan at brugeren altid får sin fejlmeddelse, ligegodt om databasen er nede eller ej?

smid os lige svar :o)
Avatar billede coderdk Praktikant
30. marts 2005 - 18:28 #19
Den har bromer vist lige klaret! Jeg skal ikke have noget :)
Avatar billede learner Praktikant
30. marts 2005 - 18:28 #20
åhhh, jeg er vist ved at være træt :o)
Du har jo smidt løsningen :o)
Avatar billede bromer Nybegynder
30. marts 2005 - 18:28 #21
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.
Avatar billede learner Praktikant
30. marts 2005 - 18:29 #22
Tak for hjælpen :o)

smid svar og klap dig selv på skulderen :o)
Avatar billede bromer Nybegynder
30. marts 2005 - 18:32 #23
mig? jeg har smidt et svar tidligere :)
Avatar billede learner Praktikant
30. marts 2005 - 19:12 #24
ps kender i en måde at hente linienummer?
så vil jeg nemlig sende filnavn og linienummer med os.
Avatar billede bromer Nybegynder
30. marts 2005 - 19:14 #25
nej ikke umiddelbart.
Avatar billede coderdk Praktikant
30. marts 2005 - 19:18 #26
Så skal du lave din egen error handler: http://dk2.php.net/set_error_handler
Avatar billede learner Praktikant
30. marts 2005 - 19:18 #27
ok Taaak :o)
Avatar billede bromer Nybegynder
30. marts 2005 - 19:20 #28
næ.. det behøver man faktisk ikke.. jeg spurgte lige en anden nørd. Det ligger i konstanten __LINE__.
Avatar billede learner Praktikant
30. marts 2005 - 19:44 #29
Ok, hvordan gør man det? __LINE__ ? :o)

sådan her ?
mysql_bla(blabla) or my_debug(mysql_error(),__LINE__,$filename);
Avatar billede coderdk Praktikant
30. marts 2005 - 19:45 #30
bromer, så skal du vist kalde my_debug med __LINE__ da __LINE__ jo er det aktuelle linjenummer i den fil du er i...
Avatar billede coderdk Praktikant
30. marts 2005 - 19:46 #31
learner, nemlig :)
Avatar billede learner Praktikant
30. marts 2005 - 19:52 #32
coderdk, siger du at jeg gættede rigtigt? Skal jeg gøre sådan:
mysql_bla(blabla) or my_debug(mysql_error(),__LINE__,$filename);

TAAAAAAKK :o)
Avatar billede coderdk Praktikant
30. marts 2005 - 19:55 #33
learner, Ja du gættede rigtigt, my_debug skal tilpasses så den tager et linjenummer, og så kalder du den som du selv skrev :)
Avatar billede learner Praktikant
30. marts 2005 - 20:10 #34
my_debug, hvad er det??????? :o)
Avatar billede coderdk Praktikant
30. marts 2005 - 20:12 #35
den funktion som bromer lavede, bl.a. 30/03-2005 18:23:38
Avatar billede learner Praktikant
30. marts 2005 - 20:13 #36
nej, nu går jeg sku os snart i søvne :o)
Jeg har kodet hele dagen ud i et...

Jeg laver det lige færdig nu og skriver det herinde om lidt. Er du så sød at kigge om det ser rigtigt ud.
Avatar billede learner Praktikant
30. marts 2005 - 20:20 #37
<?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');

// Ser det rigtigt ud :o)
?>
Avatar billede coderdk Praktikant
30. marts 2005 - 21:13 #38
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
Avatar billede learner Praktikant
30. marts 2005 - 21:24 #39
Nåh ja, det er rigtigt!

Jeg får en fejl hele tiden
Den bliver ved at sige: parse error, unexpected ';' in blabla on line 4(linien med mysql_query'en)

kan du se nogen fejl her:
mysql_query("blabla") OR die( printf($sorry_message); mail(blabla); );

for jeg kan ik se problemet :o)
Men den vil ikke...
Avatar billede coderdk Praktikant
30. marts 2005 - 21:26 #40
Linjen slutter:

"); );

Skal slutte:

") );
Avatar billede learner Praktikant
31. marts 2005 - 19:41 #41
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)
Avatar billede Ny bruger Nybegynder

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.

Loading billede Opret Preview
Kategori
Vi tilbyder markedets bedste kurser inden for webudvikling

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester