PHP: Connecter votre site à une base de données SQL avec PDO

PHP: Connecter votre site à une base de données SQL avec PDO

Dans ce tutoriel, nous allons voir comment vous pouvez permettre à votre site d’accéder à une base de données sql via PDO. mais commençons par comprendre d’abord l’expression PDO.

Qu’est-ce que PDO ? 
PDO (PHP Data Objects) est une extension PHP (depuis la version 5.1) qui permet, via une interface, d’accéder à une base de données. Elle est de type orienté objet et sa class s’appelle PDO.
Son atout réside dans le fait qu’il constitue une sorte d’abstraction entre une application PHP et un système de gestion de base de données(SGBD). En clair, le code reste le même quelque soit le SGBD utilisé.

Se connecter au serveur SQL

<?php
    $bd = new PDO('mysql:host=localhost;dbname=nom_base;charset=UTF8', 'utilisateur', 'mot_de_passe');
?>

Expliquons un peu le code ci-dessus : 

  • $bd :  une variable objet qui constitue une instance à la connexion à votre base de données. Vous pouvez nommer cette variable comme vous le voulez par exemple $base.
  • new PDO : Cette expression permet de créer l’instance de connexion à la base via la class PDO;
  • mysql:host=localhost : ici c’est localhost que vous devez changer. C’est le nom du serveur de la base de données. Localhost est généralement pour un serveur local mais aussi pour beaucoup de serveurs en ligne. Votre hébergeur vous fournira les identifiants;
  • dbname=nom_base : vous devez changer nom_base par le nom de votre base de données;
  • charset=UTF8 : il s’agit de l’encodage de la communication avec la base
  • utilisateur : il s’agit de l’utilisateur de la base de données;
  • mot_de_passe : le mot de passe de l’utilisateur de la base de données

Vous pouvez utiliser une exception pour vérifier si la connexion s’est bien passée :

<?php
try{
    $bd = new PDO('mysql:host=localhost;dbname=nom_base;charset=UTF8', 'utilisateur', 'mot_de_passe');
}catch(Exception $e){
    die ("Erreur:".$e->getmessage());
}
?>

try catch permet de vérifier si un certain code fonctionne bien. Dans notre code, on dit essaie (try) de te connecter à la base de données donc ce qui se trouve dans le bloc try{}. Si tu rencontres une erreur (on dit qu’il lève une exception), exécute le code se trouvant dans le bloc catch et là et il attrape l’exception.
Dans notre cas, si la connexion n’a pas pû se faire, il affichera l’erreur concernée.

Il est possible d’appliquer des attributs à notre instance de PDO avec la méthode setAttribute. La liste des attributs est ici mais nous allons nous intéresser à l’attribut de récupération des résultats d’une requête.

La syntaxe pour appliquer un attribut est : 

<?php
    public PDO::setAttribute ( int $attribute , mixed $value ) : bool
?>

Mode de récupération par défaut : PDO::ATTR_DEFAULT_FETCH_MODE

Ici, vous pouvez définir le mode récupération des résultats de vos requêtes SQL avec l’attribut PDO::ATTR_DEFAULT_FETCH_MODE et il prend plusieurs valeurs mais nous verrons 3 ou 4 intuitivement qui sont les plus utilisés à mon sens. Il s’agit de PDO::FETCH_ASSOCPDO::FETCH_OBJPDO::FETCH_CLASS et PDO::FETCH_BOTH(valeur par défaut).

Imaginons que nous ayons dans une table voitures une liste de voiture avec pour champs marque, couleur et année.

Ainsi, en faisant cette requête, on récupère la liste : 

<?php
    $query = $bd->query('SELECT id, marque, couleur, annee FROM voitures');
    $result = $query->fetch();
?>

Pour simplifier les choses, nous avons utilisé fetch qui retourne juste la première ligne des résultats.

Si l’attribut PDO::ATTR_DEFAULT_FETCH_MODE n’est pas défini, alors il est défini implicitement et sa valeur est PDO::FETCH_BOTH. Le résultat retourne un tableau indexé par les noms des colonnes mais aussi par leur numéro.

On pourra alors faire ceci pour afficher la marque :

echo $result['marque'];

ou cela

echo $result[1];

La colonne marque étant la 2ième colonne et un tableau commence à l’indice 0 donc marque sera à l’indice 1.

Avec fetchAll il suffirait de faire une boucle simplement:

$query = $bd->query('SELECT id, marque, couleur, annee FROM voitures');
$results = $query->fetchAll();

foreach($results as $result){
    echo $result['marque'];
}

/*** ou ***/

foreach($results as $result){
    echo $result[1];
}

Définissons maintenant le mode de récupération des résultats comme ceci : 

<?php
    $bd->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_ASSOC);
?>

ici, nous avons dit que nous voulons les résultats sous forme de tableau associatif où les champs retournés représentent les clés du tableau. Comme nous avons choisi ce mode de récupération, nous pouvons afficher la marque de la voiture en faisant ceci : 

echo $result['marque'];

Si le mode était PDO::FETCH_OBJ, on récupèrerait alors sous forme d’objet comme ceci : 

echo $result->marque;

Pour le mode class, après avoir défini la valeur de l’attribut à PDO::FETCH_CLASS, il faut spécifier dans la requête la class concernée en faisant ceci : 

<?php
    $query = $bd->query('SELECT marque, couleur, annee FROM voitures');
    $query->setFetchMode(PDO::FETCH_CLASS, 'Voiture'); // on spécifie la class concernée
    $voiture = $query->fetch();
?>

Pour plus de logique dans notre contexte, nous avons mis le résultat dans une variable appelée $voiture. Maintenant, il faudra que la class Voiture existe au préalable car chaque résultat sera une instanciation de la class avec chaque champ correspondant à une propriété de la class.

on pourra définir de façon basique notre class comme ça : 

<?php

class Voiture{
    private $id;
    private $marque;
    private $couleur;
    private $annee;

    public function __construct(){
    }

    public function getId(){
        return $this->id;
    }
    public function getMarque(){
        return $this->marque;
    }
    public function getCouleur(){
        return $this->couleur;
    }
    public function getAnnee(){
        return $this->annee;
    }
}

?>

Ainsi pour accéder à la marque, il suffira de faire ceci : 

<?= $voiture->getMarque(); ?>

Il faudra inclure la class (qui pourrait se trouver dans un fichier appelé par exemple Voiture.php) dans le fichier qui l’utilisera.

<?php
    require_once 'Voiture.php';

    $query = $bd->query('SELECT id, marque, couleur, annee FROM voitures');
    $query->setFetchMode(PDO::FETCH_CLASS, 'Voiture'); // on spécifie la class concernée
    $voiture = $query->fetch();
    echo $voiture->getMarque();
?>

Avec fetchAll on pourrait avoir ceci :

<?php
    require_once 'Voiture.php';
 
    $query = $bd->query('SELECT id, marque, couleur, annee FROM voitures');
    $query->setFetchMode(PDO::FETCH_CLASS, 'Voiture'); // on spécifie la class concernée
    $voitures = $query->fetchAll();

    foreach($voitures as $voiture){
        echo $voiture->getMarque();
    }
?>

NB: Il faudra avoir des notions sur les class

Publié dans PHP

4 réactions sur “ PHP: Connecter votre site à une base de données SQL avec PDO ”

  1. Ping PHP : générer un fichier xml à partir d’une base de données MySQL – Lookman Design

  2. Ping Connaître les colonnes d’une table avec une requête sql – Lookman Design

Laisser un commentaire