Tutorials

Foutafhandeling - Query - SQL

Beste lezers, omdat de meerderheid van de beginnende php-scripters niet goed weet hoe ze op een nette manier een query moeten afhandelen i.v.m. errors en foutmelding en dan maar kiezen voor de "or die()" methode die natuurlijk helemaal fout is heb ik een if/else structuur geschreven met de nodige commentaar. Deze structuur kan je toepassen op (bijna) al je query's. (bedankt Noppes en Santhe voor de sql-debbug functie!)

Pagina 1

Algemene structuur

Stap 1: de voorbereiding, de error reporting

Onze error reporting bestaat uit 2 delen, de algemene error reporting en onze functie voor onze sql te debuggen. Deze twee stukjes zet je helemaal bovenaan in je bestand.

1.1 Algemene php-error reporting:

dit stukje code zou in elk php-bestand moeten staan. Als je bezig bent met ontwikkelingen zet je het aan (1), als het bestand klaar is staat het uit (0) je wilt natuurlijk niet dat je gebruiker vreemde error's te zien krijgt!


<?php
# errors weergeven
ini_set('display_errors',1); // 1 == aan , 0 == uit
error_reporting(E_ALL | E_STRICT);
?>


1.2 Onze sql-debug functie:

Deze functie kan je op elke pagina zetten waar je de functie gebruikt. Wat je ook kan doen is de functie in een apart bestand zetten en deze includen op elke pagina waar je de functie gebruikt.

1.2.1 uitleg bij sql-debug functie:

$sql = je sql var, mag ook een andere naam hebben
$error = mysql_error()
$text = een tekst op te tonen dat het om een error gaat (deze tekst wordt ook weergeven indien de debug mode uit staat)

define('DEBUG_MODE',true) dient om de debug mode aan of uit te zetten.


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

# functie voor sql debug
    function showSQLError($sql,$error,$text='Error')
    {
        if (DEBUG_MODE)
        {
            return  '<pre>Error: ' . $error . '<br />' . $sql . '</pre>';
        }
        else
        {
            return $text;
        }
    }  
?>




Stap 2: Het echte werk, de query maken en afhandelen


2.1 De sql schrijven:

Dit stukje gebruiken we om de sql te schrijven. Tussen de aanhallingstekens (") zal onze sql komen.

2.1.1 Uitleg van de variabelen:

$sql = in $sql schrijven we onze sql, indien je bijvoorbeeld leden ophaalt maak je daar best $sql_get_leden of zoiets van dan weet je snel wat daar staat.

$sql =  "

		";


Let ook op de notatie (Netjes scripten!)
- Gebruik hoofdletters (niet voor tabellen, kollommen, ..)
- spring netjes in


2.1.2 voorbeeld:

$sql =  "INSERT INTO leden
		 VALUES 	('',
					 '".mysql_real_escape_string($_POST['gebruikersnaam'])."',
					 '".mysql_real_escape_string($_POST['wachtwoord'])."'
					) 
		";


2.1.3 Uitleg bij voorbeeld:

Zoals je ziet staan alles "sql-commando's" in hoofdletters. Dit is niet verplicht maar sterk aangeraden.
Ook heb ik netjes ingesprongen. Bij de values is het eerste '', dit is voor het id dat automatisch wordt ingevult. Dan hebben we de gebruikersnaam en het wachtwoord die uit een formulier komen + de mysql_real_escape_string() tegen sql-injectie! (-> zeer belangrijk!)

2.2 Nu komen we bij onze "Foutafhandeling":

We gaan checken of de query is gelukt en dit doen we met behulp van een if / else constructie. (En NIET met or die()!)

mysql_query geeft false als er een fout is. Als er een fout is zal showSQLError (onze sql-debug functie) weergeven worden anders zullen we verder gaan naar het volgende stukje van onze constructie

if (($result = mysql_query($sql)) === false) 
{
    echo showSQLError($sql,mysql_error(),'Fout met database.');
}


2.3 Onze query is gelukt:

We zitten nu in het laatste stukje van onze constructie. Wat moet je hier nu doen? Wel, indien je meerdere rijen geselecteerd hebt uit de database gebruik je een while loop om alles netjes uit te lezen. Indien je 1 rij uit de database hebt gehaald kan je die zo weergeven. MAAR in beide gevallen moet er eerst natuurlijk nog iets anders gebeuren we moeten onze query fetchen, dit doen we met behulp van mysql_fetch_assoc(). Tussen de haakjes van deze functie komt dan onze $result te staan.
Het zou ook kunnen dat we een rij verwijderd hebben of een rij toegevoegt. In dat geval kan je hier een bedankje echoën.


Is dit duidelijk? Bekijk dan zeker even de voorbeeldjes dan kan je zien hoe dit in de praktijk werkt.
Pagina 2

Voorbeeld 1 - Het ophalen van gegevens

Voorbeeld 1: Het ophalen van gegevens

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

<?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,$text='Error')
{
if (DEBUG_MODE)
{
return '<pre>Error: ' . $error . '<br />' . $sql . '</pre>';
}
else
{
return $text;
}
}



# zet dit waar je query moet

# de query | bij input: let op sql-injectie -> mysql_real_escape_string()
$sql_get_user = "SELECT naam
FROM leden
WHERE id='".mysql_real_escape_string($_GET['id'])."'
";

# Check of query is gelukt
if (($result_get_user = mysql_query($sql_get_user)) === false)
{
# als de query fout is -> foutafhandeling
echo showSQLError($sql_get_user,mysql_error(),'Fout met het ophalen van de gebruiker.');
}
elseif (mysql_num_rows($result_get_user) == 0)
{
# De query is gelukt en we hebben net gekeken met _num_rows of er een rij is:

# -> Als er geen rij is echoën we hier:
echo 'Er is geen lid met dit id!';
}
else
{
# Hier is er wel een rij dus ->

#we kunnen onze naam uit de database halen d.m.v. mysql_fetch_assoc
$row_user = mysql_fetch_assoc($result_get_user);
echo $row_user['naam'];
}
?>

Ziezo, nu kunnen we op een goede manier gegevens ophalen maar kunnen we ze ook toevoegen? Bekijk het volgende voorbeeld!
Pagina 3

Voorbeeld 2 - Invoeren van gegevens

Voorbeeld 2 - Invoeren van gegevens

Situatie:
We willen een gebruiker toevoegen aan het systeem door middel van een formulier (niet weergeven in code). Dit zou een goede structuur zijn.

<?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,$text='Error')
{
if (DEBUG_MODE)
{
return '<pre>Error: ' . $error . '<br />' . $sql . '</pre>';
}
else
{
return $text;
}
}



# zet dit waar je query moet

# de query | bij input: let op sql-injectie -> mysql_real_escape_string()
$sql_insert_user = "INSERT INTO leden (id, naam, email)
VALUES (
'';
'".mysql_real_escape_string($_POST['naam'])."',
'".mysql_real_escape_string($_POST['email'])."',
)
";

# Check of query is gelukt
if (($result_insert_user = mysql_query($sql_insert_user)) === false)
{
# als de query fout is -> foutafhandeling
echo showSQLError($sql_insert_user,mysql_error(),'Fout bij het invoegen van de gebruiker.');
}
else
{
# De query is geluk! :)

echo 'Gebruiker is toegevoegt!';
}
?>

Ja nu weet je wel hoe het moet maar weet je ook echt wat je doet? Lees de samenvatting eens door en probeer de code echt te begrijpen! Snap je iets niet? Stel een vraag op het forum.
Pagina 4

Samenvatting

Zoals we hebben gezien bij onze algemen structuur beginnen we met de error reporting. De error reporting is een zeer handig iets, het helpt ons bij het debuggen van onze PHP-code. De algemene error-reporting moet op ELKE PHP pagina staan en mag NOOIT aan staan als je site gepubliceert is. Je wilt toch niet dat een bezoeker zo'n rare PHP error te zien krijgt?! Voor onze SQL-debug functie geldt hetzelfde. Site is publiek -> SQL debug moet uit. Hier is dat nog belangrijker omdat potentiele hakkers belangrijke zaken uit zo'n error kunnen halen.

Voor SELECT, SHOW, DESCRIBE, EXPLAIN en enkele anderen SQL statement geeft mysql_query() een resultaat als het is gelukt, of FALSE als er een error is. Voor andere typen van SQL-statements, INSERT, UPDATE, DELETE, DROP,... geeft mysql_query() TRUE als het is gelukt of FALSE als er een error is. Als het false is laten we d.m.v. de if/else constructie een foutmelding zien en indien de sql-debug mode aanstaat laten we ook de sql error's Zien. Indien mysql_query true geeft, is de query gelukt en kan je een bedank berichtje zetten als je iets toevoegt aan de database, of je kan je gegevens weergeven als je iets uit de database haalt. (Zie het voorbeeld)

We hebben ook iets gezien over Sql-injectie. Sql-injectie houdt in dat men je sql query kan manipuleren. Dit gebeurt bijvoorbeeld wanneer je een identifier, die wordt meegegeven in de url, zonder enige vorm van beveiliging in je query propt. Die identifier kan men dus gemakkelijk manipuleren en men kan zo zelfs je totale database verwijderen. Opgelet dus!

Zo nu iedereen weet hoe je SQL op een nette manier kan afhandelen zullen we nooit meer mysql_query zien gevolgd door or die. :)

Reacties

0
Nog geen reacties.