Vous êtes sur la page 1sur 16

Accéder à une base de données

par PDO
Application à une base de données MySQL

association nationale
pour la formation professionnelle
des adultes
L’accès aux SGBD/R en PHP

PHP S'INTERFACE NATIVEMENT AVEC UN GRAND NOMBRE DE


SGBD DONT MYSQL PAR EXCELLENCE
AU BESOIN, RECOURS À DES MIDDLEWARE (ODBC, PDO…) POUR
COMMUNIQUER AVEC TOUT SGBD
L'INTERFAÇAGE SE FAIT AU MOYEN DE BIBLIOTHÈQUES DE
FONCTIONS SPÉCIFIQUES À CHAQUE SGBD (EXTENSIONS
PHP), À L'AIDE D'INSTANCIATION D'OBJETS (MYSQLI) OU À
L'AIDE D'UN FRAMEWORK D'ACCÈS AUX BDD (PDO)
LES FONCTIONS INCONTOURNABLES CONSISTENT À :
• se connecter au moteur
• préciser la base cible
• soumettre la requête SQL à exécuter
• récupérer le résultat pour le traiter et renvoyer au client un flot
d’informations HTML
• se déconnecter
04/19/2020 2
PHP et MySQL

MYSQL EST UN SGBD/R TRÈS PRISÉ DANS LES


ENVIRONNEMENTS LINUX/APACHE
LE QUARTET : "LAMP" pour les
• Linux en tant qu'OS intimes (et son
• Apache en tant que serveur WEB frère WAMP pour
• MySQL pour le SGBD Windows)
• PHP pour le développement côté serveur

EST UN GRAND CLASSIQUE DU "MONDE LIBRE" (ET GRATUIT)

MYSQL TRÈS PRÉSENT ENTRE AUTRES SUR LES SITES


D'HÉBERGEMENT
PHP OFFRE 3 MOYENS D'ACCÉDER À UNE BASE DE DONNÉES
MYSQL :
• Jeu d'instructions mysql_xxx historique mais déprécié (extension PHP)
• Jeu d'instructions mysqli_xxx (extension PHP) et objets MySQLi instanciables en PHP
(maintenant déprécié)
• Framework orienté objet PDO qui permet d'accéder à divers SGBD dont
MySQL
04/19/2020 3
Quelques mots sur MySQL

IL S'AGIT AVANT TOUT D'UN MOTEUR DE BASE DE DONNÉES


• "service" à l'écoute de requêtes, prêt à fournir ou à recevoir des
données
• rien à "voir"…
POUR CRÉER LES BASES/ADMINISTRER LE SERVICE, LE
DÉVELOPPEUR DISPOSE DE :
• Interfaces graphiques, sur le serveur lui-même ou par réseau local
(dont MySQL Workbench pour Windows)
• Interface Web… en PHP, donc accessible à distance :
PHPMyAdmin

NB : LES PACKAGES WAMPSERVER ET EASYPHP, EN


TÉLÉCHARGEMENT GRATUIT, INCLUENT LE SERVEUR APACHE,
L'INTERPRÉTEUR PHP, LE MOTEUR MYSQL ET L'INTERFACE
WEB PHPMYADMIN
04/19/2020 4
Le framework PDO

PDO EST UN FRAMEWORK (=ENSEMBLE DE CLASSES) DESTINÉ À


PRENDRE EN CHARGE TOUTE LA "QUINCAILLERIE"
NÉCESSAIRE POUR ACCÉDER EN PHP À UNE BASE DE DONNÉES
• Permet de faire abstraction du SGBD réellement mis en œuvre
• Favorise l'évolution de l'application
• Orienté objet
• Supporte les requêtes ‘préparées’ qui réalisent automatiquement les
concaténations périlleuses des libellés de requêtes SQL

04/19/2020 5
PDO : se connecter à une base MySQL
L’ESSENTIEL : Il suffit de modifier 1 fois ces
paramètres pour changer de
$PARAM_hote='localhost';  base de données ou de
$PARAM_port='3306'; serveur cible
$PARAM_nom_bd='video'; 
Point de départ avec PDO :
$PARAM_utilisateur='utilweb'; 
instancier un objet PDO !
$PARAM_mot_passe='utilweb'; 
$connexion = new PDO("mysql:host=$PARAM_hote;
port=$PARAM_port; dbname=$PARAM_nom_bd; charset=utf8",
$PARAM_utilisateur, $PARAM_mot_passe);

UN DERNIER PARAMÈTRE PERMET DE PRÉCISER LES MODALITÉS


DE FONCTIONNEMENT EN CAS D’ERREUR :
$connexion = new PDO (………, array(PDO::ATTR_ERRMODE=>
PDO::ERRMODE_EXCEPTION);

04/19/2020 6
PDO : se connecter à une base MySQL

OU ENCORE AVEC GESTION D'ERREUR :


try
{
$connexion = new PDO(………);
}
catch(Exception $e)
{
echo 'Erreur : '. $e->getMessage().'<br />';
echo 'N° : '. $e->getCode();
}

04/19/2020 7
PDO : extraction de données (requête SQL select)

L’ESSENTIEL :
$connexion = new PDO(…);
$resultats=$connexion->query("SELECT nommembre FROM membres
ORDER BY nommembre ASC");
while($ligne = $resultats->fetch()) // on récupère 1 à 1
{echo "Utilisateur : $ligne->nommembre<br />"; // on affiche…}
$resultats->closeCursor(); // on ferme le curseur des résultats

OU :
foraech($resultats as $ligne) {echo…}

OU ENCORE :
$records = $resultats->fetchAll(); // on lit tout

04/19/2020 8
PDO : récupérer le résultat d’une requête SQL select

PDO RETOURNE LES DONNÉES SOUS FORME DE :


• Tableau PHP indicé : $data=$resultats->fetch(PDO::FETCH_NUM);
• Tableau PHP associatif : $data=$resultats->fetch(PDO::FETCH_ASSOC);
• Objet standard PHP : $data=$resultats->fetch(PDO::FETCH_OBJ);
• Tableau PHP associatif et indicé : $data=$resultats->fetch();

04/19/2020 9
PDO : les requêtes préparées

TECHNIQUE POUR RÉALISER DES REQUÊTES SQL PARAMÉTRÉES


• PDO réalise les concaténations périlleuses du libellé de requête SQL

Il suffit de matérialiser le ou les


paramètres et de spécifier les valeurs
L’ESSENTIEL :
dans un array transmis à execute()
$idmembre = …… ;
// modèle requête
$sql ="SELECT * FROM membres ORDER BY membre ASC where id = ? ";
// preparation requête
$resultats = $connexion->prepare($sql);
// execution requete
$resultats->execute( array($idmembre));
//lit tous enregistrements
$data=$resultats->fetchAll();
NB : prepare() est une méthode de l’objet de
connexion mais execute() est une méthode de
l’objet d’accès au jeu d’enregistrements
04/19/2020 10
PDO : les requêtes préparées (suite)

POUR PASSER DE NOMBREUX PARAMÈTRES :


• PDO permet de nommer les paramètres puis de passer leurs
valeurs en nommant les postes du tableau de valeurs :
$sql = 'select * from location where NUM_ADHERENT = :numadh
and ID_FILM = :codfil and DEBUT_LOCATION = :cejour' ;
// preparation requête
$rs = $mysqlPDO->prepare($sql);
// execution requete
$rs->execute(array(':numadh'=>$dataResa["numadherent"],
':cejour'=>$dataResa["datejour"],
':codfil'=>$dataResa["codfil"]));

Le lien est fait sur les noms d’étiquettes


L’ordre des paramètres n’a plus d’importance

04/19/2020 11
PDO : mise à jour de données

L’ESSENTIEL :
$connexion = new PDO(………);
$connexion->exec("update membres set mot_pass='toto'
where…");

RÉCUPÉRATION DU NOMBRE DE LIGNES AFFECTÉES :


$nombre_changement=$connexion->exec("UPDATE membres SET
………");
OU ENCORE
$resultats = $connexion->prepare($sql);
$resultats->execute(…);
$nombre_changement = $resultats->rowCount();

NB : exec() est une méthode de l’objet de connexion


mais execute() et rowCount() sont des méthodes de
l’objet d’accès au jeu d’enregistrements

04/19/2020 12
PDO et les transactions

MÉCANISME DES TRANSACTIONS :


• Permet de s’assurer que les mises à jour formant un lot sont toutes
passées ou bien toutes annulées en cas de mise à jour incomplète
(cas d’erreur)
• Exemple typique : une écriture comptable nécessite au moins 2 mises à jour, un
débit et un crédit
• Est supporté par tous les SGBD/R modernes (dont MySQL à
condition d’utiliser le ‘moteur InnoDB)
• Est basé sur l’exploitation du ‘journal de transactions’ du SGBD
(trace des opérations de mise à jour)
• Est pris en relais par PDO :
• Par défaut, toute requête est exécutée et validée immédiatement (mode
‘autocommit’)
• Le développeur peut insérer des ordres spécifiques pour sécuriser les mises à
jour

04/19/2020 13
Instructions PDO relatives aux transactions

LA CLASSE PDO QUI SERT À INSTANCIER LES OBJETS DE


CONNEXION AU SGBD EXPOSE 3 MÉTHODES STATIQUES :
• PDO::beginTransaction() : marque un point de synchronisation
avant le lot de mises à jour
• PDO::commit() : suit la dernière commande SQL de mise à jour et
demande la validation du lot complet ou l’annulation de ce qui aurait
déjà été exécutées depuis le dernier point de synchronisation
• PDO::rollBack() : demande expressément l’annulation des mises à
jour exécutées depuis le dernier point de synchronisation
• À utiliser en cas de détection d’erreur par des tests if ou (mieux) des structures
try/catch

04/19/2020 14
PDO : bonnes pratiques

AVEC PDO, UTILISER SYSTÉMATIQUEMENT DES REQUÊTES


PRÉPARÉES :
• Code cohérent quelque soit le besoin d’accès à la BDD
• Pas de confusion entre les 2 objets connexion et recordset
• Objet recordset plus riche
• Requêtes paramétrables au besoin
• Dans ce cas, utiliser les paramètres nommés

04/19/2020 15
CRÉDITS
OEUVRE COLLECTIVE DE L’AFPA
Sous le pilotage de la DIIP
et du centre sectoriel Tertiaire

EQUIPE DE CONCEPTION
M. Benoit Hézard (Formateur)

Date de mise à jour : 31/03/16


Date de dépôt légal : 2016

----

© AFPA 2016
Reproduction interdite
Article L 122-4 du code de la propriété intellectuelle.
« Toute représentation ou reproduction intégrale ou partielle faite sans le consentement de l’auteur ou de ses
ayants droits ou ayants cause est illicite. Il en est de même pour la traduction, l’adaptation ou la reproduction
par un art ou un procédé quelconques ».

04/19/2020 16

Vous aimerez peut-être aussi