login  Naam:   Wachtwoord: 
Registreer je!
 Tutorials

Tutorials > PHP


Gegevens:
Geschreven door:
Stijn
Moeilijkheidsgraad:
Moeilijk
Hits:
18878
Punten:
Aantal punten:
 (4)
Aantal stemmen:
4
Stem:
Niet ingelogd
Nota's:
 Lees de nota's (11)
 


Tutorial:

PDO (PHP Data Objects)

PDO (PHP Data Objects)
Menu: 1. Inleiding
2. Verbinding maken
3. Query's uitvoeren: methode 1
4. Query's uitvoeren: methode 2
5. Resultaten ophalen en weergeven
6. Hints en slot

1. Inleiding


De naam verklaart eigenlijk wat PDO is. PDO is een DAAL (Data-Access Abstract Layer). Dat betekent dat PDO niet kijkt welke database type je gebruikt, zodat je altijd dezelfde functies (fetch,query,...) kan gebruiken voor verschillende database types. PDO biedt vele voordelen voor de webontwikkelaar:
  • PDO ondersteunt alle database types. Je moet er wel voor zorgen dat de PDO drivers voor jouw database type zijn geïnstalleerd op je webserver.
  • PDO biedt meer veiligheid.
  • PDO werkt sneller
  • PDO heeft een eigen error handler (PDOException).
PDO gebruikt OOP(PHP5) en dus kan je PDO enkel gebruiken vanaf PHP5.0
PDO ondersteunt volgende database types:
  • FreeTDS
  • Microsoft SQL Server
  • Sybase
  • Firebird
  • Interbase 6
  • IBM DB 2
  • IBM Informix Dynamic Driver
  • MySQL 3.x/4.x/5.x
  • Oracle Call Interface
  • ODBC v3
  • PostgreSQL
  • SQLite 2 / 3
In deze tutorial gebruik ik als database MySQL, maar alle voorbeelden werken ook met de andere types. Je hoeft enkel de PDO constructor te wijzigen en je bent vertrokken.
Ik maak al mijn code voorbeelden in try...catch. Voor meer informatie hierover kan je terecht op php.net: Exceptions.

2. Verbinding maken


Een PDO connectie ziet er altijd hetzelfde uit voor ieder database type.

$pdo = new PDO('type:host=host;dbname=database' , 'username' , 'password');

Dus wij willen verbinding maken met onze mysql server. Op onze mysql server staat een database genaamd 'test'.

<?php
try {
    
$mysql = new PDO('mysql:host=localhost;dbname=test' 'root' '');
}
catch( 
PDOException $e )
{
    die( 
$e->getMessage() );
}
?>


Nu hebben we verbinding met onze mysql database.

Op einde van het script zal deze connectie zich automatisch sluiten. Wanneer je wilt dat deze connectie openblijft voor andere scripts moet je het volgende toevoegen aan je constructor.

<?php
try {
    
$mysql = new PDO('mysql:host=localhost;dbname=test' 'root' '' , array(     PDO::ATTR_PERSISTENT => true ) );
}
catch( 
PDOException $e )
{
    die( 
$e->getMessage() );
}
?>

3. Query's uitvoeren: methode 1


Je kan op een paar manieren query's uitvoeren. Methode 1 is handig als je gewoon mysql_query() en mysql_fetch_assoc() doet of je doet een query zonder parameters.

PDO->query();
Deze functie zal de query uitvoeren en direct fetchen als er records zijn. De records kan je dan uitlezen met een foreach want query(); zal een array returnen. Je kan meer informatie lezen over PDO->fetch() in hoofdstuk ....

<?php
try {
    
$mysql = new PDO('mysql:host=localhost;dbname=test' 'root' '' , array(     PDO::ATTR_PERSISTENT => true ) );

    
$sql $mysql->query('SELECT * FROM pdo_test');

    foreach( 
$sql as $row ) {
        echo 
$row['id'];
        echo 
$row['naam'];
    }
}
catch( 
PDOException $e )
{
    die( 
$e->getMessage() );
}
?>

4. Query's uitvoeren: methode 2


Wanneer je query's gaat uitvoeren met parameters, wil je snel en efficiënt werken. We beginnen direct met een voorbeeldje. We willen alle records uit ons test tabel waarin naam gelijk is aan 'stijn'.

<?php
try {
    
$mysql = new PDO('mysql:host=localhost;dbname=test' 'root' '' , array(     PDO::ATTR_PERSISTENT => true ) );

    
$naam 'stijn';

    
$sql $mysql->prepare('SELECT * FROM pdo_test WHERE naam=?');
    
$sql->bindParam$naam );
    
$sql->execute();

}
catch( 
PDOException $e )
{
    die( 
$e->getMessage() );
}
?>


Je ziet hier direct al 3 nieuwe PDO functies. Ik zal ze eerst even toelichten.

PDO->prepare();
Deze functie bevat de query. De parameters kan je aanduiden met een vraagteken of :[a-z], dat zijn de zogenaamde parameter labels. Deze query wordt opgeslaan en kan dus later altijd hergebruikt worden. Let op: de query wordt nog niet uitgevoerd!

PDOStatement->bindParam();
Deze functie gaat een waarde geven aan de labels. Als je vraagtekens gebruikt begint deze te tellen vanaf 1 enzovoort. Let op: geen directe waarden intikken, enkel variablen mogen meegegeven worden. Dit omdat PDO referencies gebruikt.

PDOStatement->execute();
Deze functie voert de query uit.

Waarom is deze methode sneller en efficiënter?
Stel dat je 2 keer die query nodig hebt in één script. Dan hoef je maar één keer die query te maken en met bindParam() kan je telkens andere waarden geven aan de parameter labels. bindParam() beveiligd de input ook, dus je query is automatisch veilig tegen SQL Injections.

Een voorbeeld met naam labels.

<?php
try {
    
$mysql = new PDO('mysql:host=localhost;dbname=test' 'root' '' , array(     PDO::ATTR_PERSISTENT => true ) );

    
$naam 'stijn';

    
$sql $mysql->prepare('SELECT * FROM pdo_test WHERE naam=:name');
    
$sql->bindParam':name' $naam );
    
$sql->execute();

}
catch( 
PDOException $e )
{
    die( 
$e->getMessage() );
}
?>


Nog een derde voorbeeld waarbij ik 1 keer de query gebruik maar telkens verschillende waarden in de labels stop.

<?php
try {
    
$mysql = new PDO('mysql:host=localhost;dbname=test' 'root' '' , array(     PDO::ATTR_PERSISTENT => true ) );

    
$naam 'stijn';

    
$sql $mysql->prepare('SELECT * FROM pdo_test WHERE naam=:name');
    
$sql->bindParam':name' $naam );
    
$sql->execute();

    
$naam 'pieter';

    
$sql->bindParam(':name' $naam);
    
$sql->execute();

}
catch( 
PDOException $e )
{
    die( 
$e->getMessage() );
}
?>

5. Resultaten ophalen en weergeven


Met de functie PDO->query(); kreeg je al direct je resultaten gefetched. Maar hoe doe je dit nu als je methode 2 gebruikt? Ik zal opnieuw een voorbeeldje geven en daarna uitleg geven.

<?php
try {
    
$mysql = new PDO('mysql:host=localhost;dbname=test' 'root' '' , array(     PDO::ATTR_PERSISTENT => true ) );

    
$naam 'stijn';

    
$sql $mysql->prepare('SELECT * FROM pdo_test WHERE naam=?');
    
$sql->bindParam$naam );
    
$sql->execute();

    foreach( 
$sql->fetch() as $row ) {
        echo 
$row['id'];
        echo 
$row['naam'];
    }

}
catch( 
PDOException $e )
{
    die( 
$e->getMessage() );
}
?>


PDOStatement->fetch() Deze functie gaat de resultaten fetchen van de query. Je kan in plaats van foreach ook while of for gebruiken.

Standaard wordt PDO::FETCH_BOTH gebruikt, dat wil zeggen dat fetch(); een array zal terugsturen met als index de kolomnaam en de kolomindex. Je kan ook één van de volgende fetch manieren gebruiken.

PDO::FETCH_ASSOC - Deze zal een array terugsturen met als index de kolomnamen.
PDO::FETCH_ASSOC - Deze zal een array terugsturen met als index de kolomnamen en de kolomindexen.
PDO::FETCH_OBJ - Deze zal een nieuw object maken met als properties de kolomnamen.

Een nieuw voorbeeld met PDO::FETCH_OBJ.

<?php
try {
    
$mysql = new PDO('mysql:host=localhost;dbname=test' 'root' '' , array(     PDO::ATTR_PERSISTENT => true ) );

    
$naam 'stijn';

    
$sql $mysql->prepare('SELECT * FROM pdo_test WHERE naam=?');
    
$sql->bindParam$naam );
    
$sql->execute();

    while( 
$sql_result $sql->fetchPDO::FETCH_OBJ ) ) {
        echo 
$sql_result->id;
        echo 
$sql_result->naam;
    }

}
catch( 
PDOException $e )
{
    die( 
$e->getMessage() );
}
?>

6. Hints en slot


Als je wil weten hoeveel records je hebt, geldt de functie PDOStatement->rowCount(); niet. Deze functie kan enkel gebruikt om te zien hoeveel records er gewijzigd zijn na een INSERT|UPDATE|DELETE query. Gebruik de COUNT functie van MySQL.

Alle uitgebreide uitleg over PDO en zijn functies kan je vinden op http://www.php.net/PDO.

Zo dit was een korte inleiding over PDO. Met deze informatie kan je nu alle soorten query's uitvoeren en resultaten ophalen. Vragen? Post ze op het forum of neem eens een kijkje in de handleiding van php.net.

Stijn Leenknegt

« Vorige tutorial : TemplatePower: Meerdere Templates Ondersteunen Volgende tutorial : Gd Library Deel 3 »

© 2002-2021 Sitemasters.be - Regels - Laadtijd: 0.02s