Aller au contenu

Découverte

Étapes de liaison PHP à une base de données

Pour qu'un site web exploite une base de données, différentes étapes peuvent être identifiées :

  • Configuration préalable: activation de l'extension PHP
  • Connexion à la base de données
  • Génération d'une requête SQL en sécurisant les paramètres
  • Exécution de la requête
  • Récupération du résultat
  • Déconnexion de la base de données

Méthodes

PHP propose deux principales extensions pour interagir avec une base de données MySQL :

  • MySQLi (MySQL Improved)

    • Extension spécifique à MySQL.
    • Supporte les requêtes préparées et l'orienté objet.
    • Ne fonctionne qu'avec MySQL, limitant la portabilité.
  • PDO (PHP Data Objects)

    • Interface abstraite pour interagir avec plusieurs SGBD (MySQL, PostgreSQL, SQLite, etc.).
    • Prise en charge native des requêtes préparées.
    • Plus sécurisé grâce à la gestion des transactions et des requêtes préparées.

Dans ce cours, seul PDO sera travaillé. Cependant, n'hésitez pas à consulter les infomrmations concernant mySqli >>

PDO

PDO (PHP Data Objects) fournit une interface d'abstraction à l'accès de données, ce qui signifie que vous utilisez les mêmes fonctions pour exécuter des requêtes ou récupérer les données quelle que soit la base de données utilisée (MySQL, Oracle, ...). PDO ne fournit pas une abstraction de base de données : il ne réécrit pas le SQL ni n'émule des fonctionnalités manquantes.

L'avantage principal de PDO est d'avoir une application indépendante du SGBD. En réalité, cela nécessite également que la syntaxe des requêtes SQL respecte scrupuleusement le SQL standard (commun à tous les SGBD de type SQL).

PDO

Installation

PDO et le pilote PDO_SQLITE sont activés par défaut depuis PHP 5.1.0. Si nécessaire, il faut éditer le fichier "php.ini" pour activer le(s) pilote(s) de SGBD désiré(s). Pour MySQL :

extension=php_pdo_mysql.dll

Connexion et déconnexion

La connexion s'établit par l'instanciation d'un objet PDO >>

Le protocole détermine le driver à utiliser (mysql:, oci:, sqlsrv:, pgsql:, …) oci :Oracle Call Interface; dblib

Testing

Pour établir la connexion à une base de données MySQL, il faut d'abord s'authentifier sur le serveur de base de données en spécifiant l'url du serveur, son nom d'utilisateur et son mot de passe.

En général, les paramètres de connexion (url, nom d'utilisateur, mot de passe et nom de base de données) sont déclarés comme des constantes dans un fichier séparé.

  • Créez un nouveau dossier nommé PDOTesting
  • Créez un fichier nommé config.inc.php qui comprendra les constantes suivantes
config.inc.php
<?php
    const MYHOST = '192.168.132.203'; //url serveur MySQL
    const MYUSER = 'monMatricule'; //votre nom d'utilisateur de base de donnée
    const MYPASS = '1234';     //votre mot de passe associé
    const MYDB   = 'monMatricule'; //le nom de votre base de donnée qui, à HELMo, est identique à votre matricule
?>
  • Créez un fichier nommé db_link.inc.php. Ce fichier comprend une classe nommée DBLink. Cette classe comprend la méthode connect2db qui a comme objectif d'établir une connexion à une base de données MySQL spécifiée par $base et la méthode disconnect qui a comme objectif de fermer la connexion.
db_link.inc.php
<?php

    namespace DB;

    require 'config.inc.php';

    use PDO;
    use PDOException;

    /**
    * Classe DBLink : gestionnaire de la connexion à la base de données
    * @author Vincent MARTIN
    * @version 2.0
    */
    class DBLink
    {
        /**
        * Se connecte à la base de données
        * @var string $base Nom de la base de données
        * @var string $message ensemble des messages à retourner à l'utilisateur, séparés par un saut de ligne
        * @return PDO|false Objet de liaison à la base de données ou false si erreur
        */
        public static function connect2db($base, &$message)
        {
            try {
                $link = new PDO('mysql:host=' . MYHOST . ';dbname=' . $base . ';charset=UTF8', MYUSER, MYPASS);
                $link->setAttribute(PDO::ATTR_CASE, PDO::CASE_LOWER);
                $link->exec("set names utf8");
                $link->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
            } catch (PDOException $e) {
                $message .= $e->getMessage() . '<br>';
                $link = false;
            }
            return $link;
        }

        /**
        * Déconnexion de la base de données
        * @var PDO $link Objet de liaison à la base de données
        */
        public static function disconnect(&$link)
        {
            $link = null;
        }
    }
Explications

Méthode connect2db

  • Crée un objet PDO avec le Data Source Name (DSN) construit à partir des constantes et de $base
  • Configure PDO pour : - Transformer les noms de colonnes en minuscules (PDO::ATTR_CASE) - Utiliser l'encodage UTF-8 (set names utf8) - Lancer des exceptions en cas d'erreur (PDO::ATTR_ERRMODE avec PDO::ERRMODE_EXCEPTION).
  • En cas d'erreur, capture l'exception PDO, ajoute le message d'erreur à $message et retourne false.
  • Sinon, retourne l'objet PDO

Méthode disconnect

  • Fermer la connexion en attribuant null à l'objet PDO.
  • Créez un fichier nommé testDB.php avec le code suivant :
testDB.php
    <?php
    require 'db_link.inc.php';
    use DB\DBLink;

    $message = ""; 
    $bdd  = DBLink::connect2db(MYDB, $message);
    if ($bdd) {
        $message .= "Connexion à la base de données réussie!<br>";
    } else {
        $message .= "Impossible d'établir la connexion à la base de données!<br>";
    }
    DBLink::disconnect($bdd);

    echo "<p>$message</p>";
    ?> 
Explications

Si le message "Connexion à la base de données réussie!" est affiché, félicitation, vous êtes bien connecté à votre BD. Dans le cas inverse, vérifiez le chemin vers le fichier db_link.inc.php, vos informations de connexions...

Explications du code :

  • Charge le fichierdb_link.inc.php qui contient la définition de la classe DBLink (require 'db_link.inc.php';)
  • La classe DBLink appartient à l'espace de noms DB, donc pour l’utiliser sans écrire DB\DBLink, on l'importe avec use DB\DBLink;
  • Déclaration d'une variable qui contenir les messages d'état (succès ou erreur de connexion) ($message = ""; )
  • Appelle la méthode statique connect2db()de la classe DBLink ($bdd = DBLink::connect2db(MYDB, $message);) en passant :
    • MYDB : Nom de la base de données (défini dans config.inc.php)
    • $message : Une référence à une variable qui stockera les messages d’erreur ou de succès
  • $bdd contient un objet PDO si la connexion réussit, sinon false
  • Si la connexion est établie (pour rappel, $bdd est un objet PDO) (if ($bdd)), on affiche un message de validation, sinon on affiche un message d'échec.
  • Appelle DBLink::disconnect($bdd)pour fermer la connexion en mettant $bdd à null.