Oprettet man. d. 07. januar 2013 kl. 13:34:16

kfisker
kfisker (28.786 point. Point ude: 0)


Fejlhåndtering ved standard mysql contra PDO

Jeg har arbejdet med PDO i en periode, men fejlhåndteringen piner mig en smule.

Jeg har denne standard mysql-forespørgsel:

$sql_query = ("
  SELECT time_stamp, count_day
  FROM statistik
  ORDER BY time_stamp ASC;
");

$query_stat = mysql_query($sql_query) or die (error_handler(mysql_error()));

Forsøger jeg at hente data fra en tabel eller en kolonne der ikke eksisterer vil min error_handler-funktion blive aktiveret og jeg kan her logge fejlen.

Jeg har denne PDO forespørgsel:

try { 
    $stsm = $conn->prepare("SELECT time_stamp, count_day FROM statistik ORDER BY time_stamp ASC");


catch(PDOException $pdo_error) {
    die (error_handler($pdo_error));
}

try { 
    $stsm->execute();


catch(PDOException $pdo_error) {
    die (error_handler($pdo_error));
}


Med denne fanger jeg fejl i min forespørgsel eller i min execute. Jeg synes bare det er voldsom meget ekstra kode.

Er det måden at gøre det på, eller kan det gøres smartere?

Skrevet man. d. 07. januar 2013 kl. 14:06:04| #1

olebole
olebole (220.153 point)
<ole>

Det ser ganske småt og smart ud  =)

/mvh
</bole>

Skrevet man. d. 07. januar 2013 kl. 14:22:50| #2

kfisker
kfisker (28.786 point)
olebole...> Det kan jeg kun tolke som at det ikke umiddelbart gøres smartere?

Skrevet man. d. 07. januar 2013 kl. 14:31:55| #3

olebole
olebole (220.153 point)
Det er i hvertfald måden, jeg selv håndterer fejl i forbindelse med PDO  =)

Skrevet man. d. 07. januar 2013 kl. 14:45:21| #4

kfisker
kfisker (28.786 point)
Okay, jamen så burde det jo ikke være helt af vejen ;)

Du samler som sædvanlig ikke på point?

Skrevet man. d. 07. januar 2013 kl. 15:13:29| #5

Du kan

try { 
    $stsm = $conn->prepare("SELECT time_stamp, count_day FROM statistik ORDER BY time_stamp ASC");
    $stsm->execute();

catch(PDOException $pdo_error) {
    die (error_handler($pdo_error));
}

Skrevet man. d. 07. januar 2013 kl. 15:31:56| #6

olebole
olebole (220.153 point)
@Erik: Det kan man sagtens. Hvis der er fejl i begge udtryk, får man dog kun udskrevet den første

Skrevet man. d. 07. januar 2013 kl. 15:38:25| #7

I dette tilfælde giver det ikke mening at prøve nummer 2, hvis den første fejler. Li'som en fraskilt mand, der ikke prøver det projekt een gang til ;)

Skrevet man. d. 07. januar 2013 kl. 15:41:03| #8

arne_v
arne_v (1.083.619 point)
Derudover er det jo heller ikke anderledes end i #0.

Skrevet man. d. 07. januar 2013 kl. 15:43:27| #9

olebole
olebole (220.153 point)
Du ved godt, at videnskabelig metode bygger på, at gentagelser af samme forsøg, skal give samme resultat ... skrev manden med 'eks i anden'  *D

Skrevet man. d. 07. januar 2013 kl. 15:45:12| #10

olebole
olebole (220.153 point)
#9 var en kommentar til Eriks #7  *o)

Skrevet man. d. 07. januar 2013 kl. 15:45:55| #11

#8
Udover at man "sparer" en try/catch.

Skrevet man. d. 07. januar 2013 kl. 15:53:22| #12

olebole
olebole (220.153 point)
#11: Jeg tror, Arne hentydede til, at spørgers konstruktion jo også kun udskriver første fejl. Derfor var min kommentar #6 noget vrøvl  *o)

Skrevet man. d. 07. januar 2013 kl. 15:57:51| #13

OK, så vågnede jeg også ;o)

Skrevet man. d. 07. januar 2013 kl. 16:03:10| #14

olebole
olebole (220.153 point)
- og skulle der være opstået tvivl i forbindelse med lidt inforståede kommentarer, så er der koncensus om, at Eriks forslag i #5 gør det samme som spørgers eget script - nøjagtig ligeså godt  =)

Skrevet man. d. 07. januar 2013 kl. 16:11:37| #15

#XIV: Men det er så anvendelsen af die(...) i catch-delen, der gør det. Ellers må man sige at anvendelsen af 2 try/catch giver god mening, hvis nummer 2 kan udføres, selv om nummer 1 fejler. Ellers bør man for læselighedens skyld anvende een try/catch.

Skrevet man. d. 07. januar 2013 kl. 19:22:08| #16

arne_v
arne_v (1.083.619 point)
Enhver afbrydelse af flow vil have den effekt - die, return, throw.

Og jeg vil tro at det er ret tit for database operationer at man vil afbryde ved foerste fejl.

Skrevet man. d. 07. januar 2013 kl. 19:23:32| #17

arne_v
arne_v (1.083.619 point)
Saa ioevrigt lige at PHP 5.5 skulle faa finally.

Det vil nok goere en enkelt try catch finally endnu mere attraktiv da man kan sample hele cleanup for baade fejl og success et enkelt sted.

Skrevet ons. d. 09. januar 2013 kl. 13:23:44| #18

kfisker
kfisker (28.786 point)
Nedenfor ses mit test-script.

Jeg kan godt bruge noget sparring på nedenstående spørgsmål:
Skal jeg ændre errormode til silent i produktion, eller vil nedenstående script fange fejlene, og dermed ikke udgøre en risiko?

Er "if ($stsm->errorCode() == 0)" overflødig og burde udelades?

Er der noget der springer i øjnenen i nedenstående, eller noget jeg måske burde medtage?

De steder jeg bruger echo i forbindelse med fejl vil blive håndteret af en error-funktion.

[div][pre]
<?php
$db_host = "xxx";
$db_name = "xxx";
$db_user = "xxx";
$db_pass = "xxx";

try { 
    // database connection 
    $conn = new PDO("mysql:host=".$db_host.";dbname=".$db_name.";charset=utf8", $db_user, $db_pass, array(PDO::ATTR_PERSISTENT => true));



catch(PDOException $pdo_error) {
    echo "Fejl i databaseforbindelsen";
    exit;
}

$conn->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_ASSOC);
$conn->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);
$conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

$sql = ("
    SELECT *
    FROM `admins`
    WHERE `user` = :user
");

$sql_param = array(
    'user' => "fornavn\efternavn"
);

try { 
    $stsm = $conn->prepare($sql);


catch(PDOException $pdo_error) {
    echo "Fejl i prepare.";
    exit;
}

try { 
    $stsm->execute($sql_param);


catch(PDOException $pdo_error) {
    echo "Fejl i execute";
    exit;
}

if ($stsm->errorCode() == 0) {
    if ($stsm->rowCount() > 0) {
        while ($row_user = $stsm->fetch()) {
            echo $row_user['USER']."<br>";
        }
    } else {
        echo "Ingen rækker";
    }
} else {
    $errors = $stsm->errorInfo();
    echo($errors[2]);
}
?>
[/pre][/div]

Skrevet ons. d. 09. januar 2013 kl. 14:07:19| #19

Du flytter bare din if-while ind i try.

Det vil altid være godt, at være sikker på at slutbrugeren ikke ser tekniske fejlbeskeder, men at support/udvikler gør.

Skrevet ons. d. 09. januar 2013 kl. 14:15:03| #20

kfisker
kfisker (28.786 point)
erik...> Ikke forstået?

Mit test-script kan jeg ikke få til at genere andre fejl end dem jeg selv echo'er.

Jeg kan ikke generere en fejl der får $stsm->errorcode til at vise en fejl.

Ændrer jeg f.eks. i tabelnavnet dør den i prepare. Laver jeg en fejl i $sql_param dør den i execute.

Den sidste fejlmulighed kan jeg ikke trigger, derfor jeg spørger om den er overflødig?

Mine try+catch vil blive lagt en funktion, således de ikke skal optræde overalt i mine scripts. Den del har jeg allerede fået til at virke. Tester bare i mit test-script, da det er mere overskueligt.

Skrevet ons. d. 09. januar 2013 kl. 17:42:23| #21

arne_v
arne_v (1.083.619 point)
Jeg tror at jeg ville bruge en enkelt try catch fremfor mange. Hvad fejlen er boer fremgaa af selve exception.

Skrevet ons. d. 09. januar 2013 kl. 17:44:11| #22

arne_v
arne_v (1.083.619 point)
Men du boer hive al information ud fra exception.

Der er mange gode felter i den klasse!

http://php.net/manual/en/class.pdoexception.php

Skrevet ons. d. 09. januar 2013 kl. 17:47:00| #23

arne_v
arne_v (1.083.619 point)
Med hensyn til hvad der skal goeres saa vil jeg sige:

demo kode:

echo og exit (eller die) er helt fin

rigtig kode:

du logger al information og saa smider du en ny exception som catches i dit presentation layer og giver brugeren en passende besked uden tekniske detaljer

Skrevet ons. d. 09. januar 2013 kl. 19:50:07| #24

kfisker
kfisker (28.786 point)
Så har jeg vist efterhånden fået svar på mine usikkerheder.

Det eneste jeg ikke synes at have fået svar på er hvorvidt dette er dobbeltkonfekt:
if ($stsm->errorCode() == 0) {
}

Skrevet ons. d. 09. januar 2013 kl. 22:19:39| #25

arne_v
arne_v (1.083.619 point)
Laes:

http://php.net/manual/en/pdo.error-handling.php

som viser hvordan du kan skifte mellem exceptions og error code.

PS: Jeg tror at success er '00000' ikke 0

Skrevet tor. d. 10. januar 2013 kl. 08:02:20| #26

kfisker
kfisker (28.786 point)
Tak for linket.

Det afklarede i hvertfald mit sidste spørgsmål.

Tak til alle for bidrag.

Hvis der er nogen der vil have point, er det nu der skal lægges et svar :)

Skrevet tor. d. 10. januar 2013 kl. 13:41:32| #27

"Mit test-script kan jeg ikke få til at genere andre fejl end dem jeg selv echo'er"

Der er flere fejl, der kan opstå, selv om du ikke lige kan frembringe dem selv. Fx at forbindelsen til databasen forsvinder mellem din connect og din query.

Skrevet tor. d. 10. januar 2013 kl. 13:47:39| #28

arne_v
arne_v (1.083.619 point)
svar for mine bidrag i den sidste trediedel af traaden

Skriv et indlæg




Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] [img]link til billede[/img]
Web- og emailadresser omdannes automatisk til links

Log ind

   


Seneste spørgsmål

Volunteer web programmør søges

Oprettet den 1. april 2015 kl. 23.07
egzonrh giver 200 point for svar | Giv et svar »

PHP FORM (spredte / overlappende input typer)

Oprettet den 31. marts 2015 kl. 23.52
hanibald giver 60 point for svar | Giv et svar »

edit funktion i php

Oprettet den 30. marts 2015 kl. 15.10
madseksperten giver 200 point for svar | Giv et svar »






Computerworld

Teaser billede

Her er verdens mest populære antivirus-program

Se her hvilket antivirusprogram, som verdens forbrugere helst vil benytte. Få samtidig det totale overblik over, hvordan it-sikkerheden ser ud lige nu.

CIO

Teaser billede

Derfor er Internet of Things en så gylden og fantastisk mulighed for it-chefen

Klumme: Håndtering af data fra forbundne enheder i Internet of Things bliver stadig vigtigere for it-afdelingerne og it-cheferne. Men IoT gemmer også på en gylden karrieremulighed.

Comon

Teaser billede

Prøvekørt: Her er Microsofts splinternye Surface-computer - til noget lavere pris end Surface Pro 3

Prøvekørt: Microsoft er klar med en helt ny Surface-computer, der bliver billigere end den nuværende Surface 3 Pro, selv om de er ret ens. Vi har prøvekørt den nye maskine. Se vores dom her.

Channelworld

Teaser billede

Stor konkursramt it-forhandler forsøger at sælge fortrolige kundedata

Den konkursramte it-kæde Radioshack forsøger at sælge millionvis af fortrolige kundedata. Flere advokater mener, at salg af fortrolige kundeinformationer er pivulovligt.

White paper

Teaser billede

Sådan kommer du i gang med big data

Lad dig inspirere af 11 cases om virksomheder IBM har hjulpet i gang med big data.



Udgiver · © 2015 Computerworld A/S · Hørkær 18 · 2730 Herlev · Tlf.: 77 300 300 · Fax: 77 300 301 · Brug af personoplysninger