Juin 16 2010

[PHP] Utiliser PDO avec PHP

Comme le savez, PHP intègre la programmation orientée objet depuis la version 4 et a été largement améliorée dans la version 5.

Il y a notamment eu l’apparition des PHP Data Objects dit également PDO qui ne sont rien d’autres que des classes et qui vous permettent d’accéder à une base de données.

J’utilise les fonctions mysql_, mssql_ ou ora_ pour accéder à ma base de données. Pourquoi passer à PDO ?

Et bien la réponse se trouve un peu dans la question.
En effet, pour chaque SGBD on utilise des fonctions différentes. Par exemple, mysql_query() permet d’exécuter une requête SQL si vous utilisez MySQL et mssql_query() fait la même chose pour SQL Server. Imaginons que du jour au lendemain, vous décidez de passer de MySQL à Oracle, toutes vos fonctions sont à présent fausses et vous devez retoucher le code.

Avec PDO, vous n’aurez qu’une seule ligne à changer: celle où vous instanciez votre base de données. Pour vous montrer comment passer des fonctions à PDO, je vais considérer que je suis sur une base de données MySQL.

Avant de commencer…

Si vous êtes en local (avec EasyPHP ou WampServer par exemple), assurez vous que PDO est activé. Pour cela, allez dans Extensions PHP et activer-le pour le SGBD concernée. (pour MySQL cochez php_pdo_mysql)

Choix des extensions PHP

Si vous avez un hébergement en ligne, selon certains forums, PDO n’est accessible qu’avec SQLite, un autre SGBD. En revanche il fonctionne très bien sur les hébergements payants tels que OVH.
Toutefois si vous voyez que PDO ne fonctionne pas, il faut indiquer au serveur qu’on utilise PHP5. Pour cela, créez un fichier .htaccess à la racine de votre serveur et ajoutez cette ligne:

SetEnv PHP_VER 5

Comment se connecter à la base de données ?

La connexion se faisait auparavant avec les fonctions mysql_connect() et mysql_select_db().
Voici à présent son équivalent PDO:
$bdd = new PDO("type:host=serveur;dbname=base", "login", "password");

– type: le type de SGBD (ici mysql)
– serveur: l’adresse du serveur (‘localhost’ ou ‘127.0.0.1’ si vous êtes en local la plupart du temps)
– base : le nom de la base de données
– login : votre nom utilisateur (‘root’ si vous êtes en local la plupart du temps)
– password : votre mot de passe (vide si vous êtes en local la plupart du temps)

Si vous êtes amené un jour à utiliser un autre SGBD que MySQL, il n’y aura que type à modifier ET C’EST TOUT !!!

Comment exécuter une requête de type INSERT / UPDATE / DELETE ?

Voici l’équivalent PDO de la fonction mysql_query() :
$bdd->query("UPDATE news SET titre = ‘Bienvenue sur notre site’ WHERE id_news = 4");

Rappelez vous que $bdd est un objet de type PDO. On appelle sa méthode query() pour exécuter une requête SQL. Vous pouvez également utiliser la méthode exec() si vous souhaitez connaître le nombre d’enregistrements affectés par la requête.

$compteur = $bdd->exec("UPDATE news SET titre = ‘Bienvenue sur notre site’ WHERE id_news = 4");

Théoriquement, $compteur contient la valeur 1 car un seul enregistrement a été modifié.

Comment afficher des informations contenues dans une base de données avec une requête SELECT ?

Pour afficher les informations d’une base de données, le principe est le même qu’avant, c’est à dire qu’on récupère les données soit dans un tableau (array). Mais on peut également récupérer les informations sous forme d’objet. Pis on affiche le résultat avec des echo.

  • Pour récupérer sous forme de tableau:
$sql = $bdd->query("SELECT * FROM news WHERE news = 4");
$sql->setFetchMode(PDO::FETCH_BOTH);// Mode par défaut (tableau)
$news = $sql->fetch();
echo 'Titre: '$news['titre'];
// Si titre est la 2ème colonne, vous pouvez mettre aussi $news[1] (indice - 1)
echo '\nDate: '.$news['date'];
…
  • Pour récupérer sous forme d’objets:
$sql = $bdd->query("SELECT * FROM news WHERE news = 4");
$sql->setFetchMode(PDO::FETCH_OBJ);// Récupérer sous forme d’objet
$news = $sql->fetch();
echo 'Titre: '.$news->titre;
echo '\nDate: '.$news->date;
…

– $sql est un objet de type PDOStatement qui est un jeu de résultat PDO.
– La méthode setFetchMode() permet d’indiquer la forme du résultat qu’on veut obtenir. (tableau, objet voire les 2). Il ne vous est pas nécessaire de l’indiquer, le type retourné par défaut est un tableau. Vous trouverez plus d’informations sur http://php.net/manual/fr/pdostatement.fetch.php
– $news
est un tableau ou un objet (selon la méthode) contenant les informations récupérées (je l’ai appelé news comme on veut afficher des news)

Comment afficher plusieurs résultats ?

Imaginons que vous voulez afficher toutes les news. On va utiliser une boucle while().

$sql = $bdd->query("SELECT * FROM news");
$sql->setFetchMode(PDO::FETCH_OBJ); // Récupérer sous forme d’objet
while($news = $sql->fetch())
{
echo 'Titre: '.$news->titre;
echo '\nDate: '.$news->date;
…
echo '\n\n'; // Pour bien voir la séparation entre chaque news
}

Comment compter le nombre d’enregistrements ?

L’équivalent de la fonction mysql_num_rows() est la méthode rowCount() du jeu de résultats.

$nombreEnregistrements = $sql->rowCount();

Comment connaître l’ID du dernier enregistrement ?

Vous pouvez utiliser la méthode lastInsertID() du jeu de résultats au lieu de faire une autre requête SELECT

$dernierID = $sql->lastInsertId();

Voilà vous savez tout sur PDO ! Attention tout de même aux injections SQL. Un autre tuto que vous pouvez consulter en cliquant sur ce lien vous explique le principe et comment y remédier.

PDO sur PHP.net : http://www.php.net/manual/fr/book.pdo.php

Articles similaires:

Lien Permanent pour cet article : http://jbvigneron.fr/2010/06/16/php-utiliser-pdo-avec-php/

(6 commentaires)

1 ping

Passer au formulaire de commentaire

  1. Bonjour je suis debutant php et j’essais de réalise un formulaire PHP /mysql

    le code ne m’amene pas à la page login PHP seulement à remplir des champ que j’ai déja rempli
    auriez vour une solution

    exec(« INSERT TO membre VALUES(‘$pseudo’,’$email’,’$pass’) »);
    //Apres on se connect à la page login
    die(« Inscription terminéconnectez-vous« );
    }else echo ‘Les deux password doivent etre identiques’;
    }
    }else echo »Veuillez saisir tout les champs »;
    {
    }

    • pascal Grah on 19 janvier 2016 at 16 h 59 min
    • Répondre

    Pascal Grah depuis la côte d’ivoire, je vous remercie beaucoup pour votre tuto . pour tt vous dire il m’a été d’une grande utilité. mais j’aimerai que vous fassiez un un autre sur les sessions en php si vous avez un bout de temps.

    Merci !

    • françois on 5 mai 2016 at 15 h 33 min
    • Répondre

    Bonjour, Jean-Batiste,
    Je suis comme beaucoup de personnes je cherche à faire un code page par page en pdo mais je n’y arrive pas.
    j’envoie je lis mais pour la pagination je suis vraiment un gros Zéro.
    Auriez-vous quelques lignes de code pour me faire avancer Merci
    François

    • stephane on 26 juillet 2017 at 9 h 19 min
    • Répondre

    Bonjour
    Je sais que ce tuto date de 5 ans mais c est tres certainement le plus simple que j ai trouvé… J ai presque tout compris.

    Mais une petite question : ne doit-on pas liberer $bdd en fin d’utilisation ?

    merci

    1. Bonjour Stéphane, merci beaucoup pour ton commentaire.
      En effet, ça peut être utile. Que proposes-tu pour libérer la base de données ?

  2. Bonjour,

    Merci pour votre article, il est d’une telle clarté et simplicité, que je vais me décider à retoucher les 5000 lignes de mon site, et enfin pouvoir passer en PHP7

  1. […] initialiser votre objet PDO ? Les requêtes SQL Les transactions. [PHP] Utiliser PDO avec PHP – Jean-Baptiste VIGNERON. Comme le savez, PHP intègre la programmation orientée objet depuis la version 4 et a été […]

Laisser un commentaire

Your email address will not be published.

css.php