Sql - foutafhandeling | Geschikt als tutorial?

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Jasper DS

Jasper DS

19/02/2011 22:11:24
Quote Anchor link
Hoe maak je een query met een mooie foutafhandeling?


Algemeene structuur:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
<?php
# We zetten dit volledig bovenaan

    # errors weergeven

    ini_set('display_errors',1); // 1 == aan , 0 == uit
    error_reporting(E_ALL | E_STRICT);

    # sql debug
    define('DEBUG_MODE',false);  // true == aan, false == uit

    # functie voor sql debug

    function showSQLError($sql,$error)
    {

        echo  '<pre>Error: '.$error.'<br />'.$sql.'</pre>';
    }




# zet dit waar je query moet

# de query | bij input: let op sql-injectie -> mysql_real_escape_string()

$sql =     "

        "
;

#  Check of query is gelukt    
if (($result = mysql_query($sql)) === false)
{

    # als de query fout is -> foutafhandeling
    echo 'Fout met database.';
    
    # geef de error via de functie (bovenaan script)
    if (DEBUG_MODE)
    {

       showSQLError($sql,mysql_error());
    }
}

else
{
    # De query is gelukt
}
?>


Voorbeeld iets uit de database halen:

Situatie:
we halen de naam van een gebruiker uit de tavel d.m.v. het id van de gebruiker in de url.

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
<?php
# We zetten dit volledig bovenaan

    # errors weergeven

    ini_set('display_errors',0); // 1 == aan , 0 == uit
    error_reporting(E_ALL | E_STRICT);

    # sql debug
    define('DEBUG_MODE',false);  // true == aan, false == uit

    # functie voor sql debug

    function showSQLError($sql,$error)
    {

        echo  '<pre>Error: '.$error.'<br />'.$sql.'</pre>';
    }




# zet dit waar je query moet

# de query | bij input: let op sql-injectie -> mysql_real_escape_string()

$sql = "SELECT naam
        FROM leden
        WHERE id='"
.mysql_real_escape_string($_GET['id'])."'
        "
;

#  Check of query is gelukt    
if (($result = mysql_query($sql)) === false)
{

    # als de query fout is -> foutafhandeling
    echo 'Fout met database.';
    
    # geef de error via de functie (bovenaan script)
    if (DEBUG_MODE)
    {

       showSQLError($sql,mysql_error());
    }
}

else
{
    # De query is gelukt, we kunnen onze naam uit de database halen d.m.v. mysql_fetch_assoc
    $row = mysql_fetch_assoc($result);
    
    echo $_row['naam'];
}

?>
Gewijzigd op 19/02/2011 22:12:16 door Jasper DS
 
PHP hulp

PHP hulp

09/01/2025 20:44:44
 

19/02/2011 22:17:56
Quote Anchor link
Is id integer?
 
Jasper DS

Jasper DS

19/02/2011 22:23:10
Quote Anchor link
ja.
 
- SanThe -

- SanThe -

19/02/2011 22:37:58
Quote Anchor link
Persoonlijk zou ik het dan zo doen.

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
14
<?php
# functie voor sql debug
function showSQLError($sql,$error,$text='Error')
{

    if (DEBUG_MODE)
    {

        echo  '<pre>Error: ' . $error . '<br />' . $sql . '</pre>';
    }

    else
    {
        echo $text;
    }
}
    
?>


En dan wordt het zo aangeroepen.

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
<?php
if (($result = mysql_query($sql)) === false)
{

    # als de query fout is -> foutafhandeling
    showSQLError($sql,mysql_error(),'Fout met database.');
}

else
{
    # De query is gelukt
}
?>
 
Jasper DS

Jasper DS

19/02/2011 22:44:15
Quote Anchor link
Ja, dat kan inderdaad santhe. Kan je me overtuigen dat dit beter is dan wat ik doe? Behalve dat je minder moet kopiëren?
 
- SanThe -

- SanThe -

19/02/2011 22:57:03
Quote Anchor link
Het is niet beter of slechter.

Ik vind dat als je toch een aparte functie hebt gemaakt, dan kan je die net zo goed altijd gebruiken en niet alleen als de debug-mode aan staat. Het scheelt je ook nog typen want je hebt nu in het script zelf maar één regel nodig in plaats van steeds die if/else constructie.
 
Jasper DS

Jasper DS

19/02/2011 22:59:49
Quote Anchor link
ok dan zal ik dat wijzigen. Heeft dit een toegevoegde waarde voor de tutorials?
 

19/02/2011 23:01:58
Quote Anchor link
- SanThe - op 19/02/2011 22:57:03:
Het is niet beter of slechter.

Ik vind dat als je toch een aparte functie hebt gemaakt, dan kan je die net zo goed altijd gebruiken en niet alleen als de debug-mode aan staat. Het scheelt je ook nog typen want je hebt nu in het script zelf maar één regel nodig in plaats van steeds die if/else constructie.


Ik denk wel dat het beter is. Je hebt nu namelijk die debug afhankelijkheid op één plek staan, wat toch een stuk makkelijker is in onderhoud. Verder hoort een integer natuurlijk niet tussen quotes, dat kan je ook nog gewoon simpel typecasten.
 
- SanThe -

- SanThe -

19/02/2011 23:03:16
Quote Anchor link
Tja, wie ben ik om daar over te oordelen. Ik vind de debug-mode, die je simpel aan en uit kan zetten, een pluspunt ten opzichte van 'normale' foutafhandeling.
 
Jasper DS

Jasper DS

19/02/2011 23:04:17
Quote Anchor link
Dan wijzig ik dat even en dat voeg ik hem toe aan de tuts. (morgen)
 
Wouter J

Wouter J

19/02/2011 23:29:54
Quote Anchor link
Misschien kan je naast mysql_real_escape_string ook even kijken of $_POST['id'] numeric is? (is_numeric())
 
Arjan -

Arjan -

19/02/2011 23:41:37
Quote Anchor link
Wouter J op 19/02/2011 23:29:54:
Misschien kan je naast mysql_real_escape_string ook even kijken of $_POST['id'] numeric is? (is_numeric())


Beter is nog om gebruik te maken van ctype_digit, aangezien is_numeric() ook waarden accepteert als 1e32, etc. Dit is denk ik niet wat je wilt.
 
Jasper DS

Jasper DS

20/02/2011 08:12:36
Quote Anchor link
ja dat kan ik doen maar het gaat hem vooral op de structuur van hoe je een query kan afhandelen. :)
 



Overzicht Reageren

 
 

Om de gebruiksvriendelijkheid van onze website en diensten te optimaliseren maken wij gebruik van cookies. Deze cookies gebruiken wij voor functionaliteiten, analytische gegevens en marketing doeleinden. U vindt meer informatie in onze privacy statement.