PHP Accès à la BD
Extensions gestion BD
Pour la gestion des Bases de données, PHP offre plusieurs extensions :
L'extension mysql_ : Ensemble de fonction commençons par mysql_ et permettant de
communiquer avec mysql. Elle sont devenue obsolète.
L'extension mysqli_ : ce sont des fonctions améliorées d'accès à MySQL.
L'extension PDO : Outil complet qui permettant une abstraction du type de la base de
données traitée permettant ainsi de se connecter aussi bien à MySQL que PostgreSQL
ou Oracle.
PHP Accès à la BD
Extensions gestion BD
PHP Accès à la BD
PDO
PDO : PHP Data Objects
Extension fournissant des services d’accès aux bases de données.
Fournie avec plusieurs drivers (MySQL, sqlite, PostgreSQL
Disponible par défaut à partir des serveurs PHP 5.1.0
PHP Accès à la BD
Connexion à une BD
Pour se connecter à une base de données on instancie un objet PDO de la façon
suivante :
$maDb_connexion = new PDO('mysql:host=localhost;dbName=nomDeLaBase',
'userName', 'motDePasse');
On crée donc une nouvelle instance de PDO qu’on récupère dans la variable
$maDb_connexion. Le constructeur nécessite trois paramètres :
le driver utilisé, l'adresse du serveur et le nom de la base noté ainsi driver:hot=serveur;
dbName=nomDeLaBase'
le nom d'utilisateur à utiliser pour la connexion au serveur
le mot de passe du dit utilisateur
• Ces informations différent un peu selon le pilote.
PHP Accès à la BD
Connexion à une BD
Afin de gérer les erreurs liées à la Connexion à la BD, il faut capturer les erreurs de
type PDOException.
try {
$db_connexion = new PDO('mysql:host=localhost;dbname=user1', 'user1',
'motdepass');
} catch (PDOException $e) {
print "Erreur : " . $e->getMessage();
die();
}
PHP Accès à la BD
Pattern Design singleton
Pattern Design singleton
But : Singleton garantit qu’une classe n’a qu’une seule instance et fournit un point
d’accès global à cette instance.
Principe
Empêcher les développeur d’utiliser le ou les constructeurs de la classe : déclarer
privé tous les constructeurs de la classe.
Problème : la classe n’est plus instanciable que par elle-même.
Solution : Construire un pseudo constructeur à travers une méthode static. Par
convention il sera appelé getInstance.
On crée un attribut statique stockant l’unique instance de la classe.
Dans getInstance on teste si cet attribut est nul
Si null on instancie un objet et on le retourne
Sinon on retourne l’instance existante
PHP Accès à la BD
Pattern Design singleton
<?php
class ConnexionBD
{
private static $_dbname = "bdphp5";
private static $_user = "root";
private static $_pwd = "";
private static $_host = "localhost";
private static $_bdd = null;
private function __construct()
{
try {
self::$_bdd = new PDO("mysql:host=" . self::$_host . ";dbname=" . self::$_dbname . ";charset=utf8", self::$_user, self::$_pwd,
array(PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES UTF8'));
} catch (PDOException $e) {
die('Erreur : ' . $e->getMessage());
}
}
public static function getInstance()
{
if (!self::$_bdd) {
new ConnexionBD();
}
return (self::$_bdd);
}
}
PHP Accès à la BD
Pattern Design singleton
Afin d’afficher les détails des erreurs liées à la BD, il faut activer le suivi de ces erreurs
lors de la connexion à la BD.
try {
$db_connexion = new PDO('mysql:host=localhost;dbname=user1', 'user1',
'motdepass', array(PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION)
);
} catch (PDOException $e) {
print "Erreur : " . $e->getMessage();
die();
}
PHP Accès à la BD
Requête simple
Afin d’interroger une BD via PDO, nous utilisons la méthode query qui prend en
paramètre la requête à exécuter.
Exemple :
$req=« select * From maTable »;
$reponse = $_bdd->query($req);
La variable $reponse contiendra un objet contenant la réponse de MySQL qui n’est pas
directement exploitable.
Pour exploiter ces données nous utilisons la méthode fetch qui retourne une ligne ou
fetchAll qui retourne un tableau contenant toutes les lignes du jeu d'enregistrements
L’un des paramètres des méthodes fetch et fetchAll est l’attribut fetch_style qui permet
de spécifier le type de la valeur de retour de fetch et fetchAll
PHP Accès à la BD
Fetch style
Contrôle comment la prochaine ligne sera retournée à l'appelant. Cette valeur doit être
une des constantes PDO::FETCH_*.
PDO::FETCH_BOTH (défaut): retourne un tableau indexé par les noms de colonnes et
aussi par les numéros de colonnes, commençant à l'index 0, comme retournés dans le
jeu de résultats
PDO::FETCH_ASSOC : retourne un tableau indexé par le nom de la colonne comme
retourné dans le jeu de résultats
PDO::FETCH_NUM : retourne un tableau indexé par le numéro de la colonne comme
elle est retourné dans votre jeu de résultat, commençant à 0
PDO::FETCH_OBJ : retourne un objet anonyme avec les noms de propriétés qui
correspondent aux noms des colonnes retournés dans le jeu de résultats
…
PHP Accès à la BD
Fetch style
Exemple de parcours en utilisant des objets :
$games = $rep->fetchAll(PDO::FETCH_OBJ);
foreach($games as $game) :
echo $game->nom." - ".$game->commentaires."<br>";
endforeach;
PHP Accès à la BD
Requête paramétrable
Afin de paramétrer une requête nous pouvons utiliser deux méthodes:
Paramétrage manuelle en concaténons les paramètres dans la requête. ENORME
FAILLE DE SECURITE SQL INJECTION
les requêtes préparées
Deux types de requêtes préparées :
En utilisant les marqueurs « ? »
En utilisant les marqueurs nominatifs
PHP Accès à la BD
Requête préparée
Pour simplifier les choses une requête préparé est une requête dont les paramètres
sont insérés dans la fonction lors de l’exécution.
Elle est effectuée en 2 étapes :
Préparer la requête à l’aide de la méthode prepare
Transmettre les paramètres dans un tableau et exécuter la requête préparée à l’aide
de la méthode execute
Les paramètres sont indiqués dans l’ordre d’apparition dans la requête préparée
Le contenu des variables est automatiquement sécurisé pour prévenir les risques
d'injection SQL.
Exemple :prepare
$req = $bdd->prepare ('SELECT * FROM personne WHERE nom = ? AND age <= ?
ORDER BY cin');
$req->execute(array($nom, $age));
PHP Accès à la BD
Requête préparée
Pour simplifier les choses une requête préparé est une requête dont les paramètres
sont insérés dans la fonction lors de l’exécution.
Elle est effectuée en 2 étapes :
Préparer la requête à l’aide de la méthode prepare
Transmettre les paramètres dans un tableau et exécuter la requête préparée à l’aide
de la méthode execute
Les paramètres sont indiqués dans l’ordre d’apparition dans la requête préparée
Le contenu des variables est automatiquement sécurisé pour prévenir les risques
d'injection SQL.
Exemple :
$req = $bdd->prepare('SELECT * FROM personne WHERE nom = ? AND age <= ?
ORDER BY cin');
$nom=« test »;$age=« 10 »;
$req->execute(array($nom, $age));
PHP Accès à la BD
Requête préparée
Requête paramétrable avec des marqueurs nominatifs
Afin de rendre la requête préparée plus lisible, ion peut remplacer les ? Par des
marqueurs nommés
Un marqueur nommé est un nom précédé par « : »
Exemple :
$req = $bdd->prepare('SELECT * FROM personne WHERE nom = :nom AND age <=
:age ORDER BY cin');
$req->execute(array(‘nom’=>$nom, age=>$age));
L’ordre des paramètres n’a plus d’importance vu que nous utilisons des tableaux
associatifs.
PHP Accès à la BD
Requête préparée
Afin de récupérer le nombre d’enregistrement retourné par la requête on utilise la
méthode rowCount.
Exemple :
$req="select * maTable";
$rep = $bdd->query($req);
echo "le nombre d'enregistrements est :".$rep->rowCount();
Afin de récupérer l’id du dernier enregistrement, on utilise la méthode lastInsertedId.
Remarque : Ca ne marche qu’après un INSERT.
Exemple :
echo "le dernier id est :".$bdd->lastInsertId()."<br>";
PHP Accès à la BD
Ajout d’enregistrement BD
Afin d’ajouter, modifier et supprimer un enregistrement dans la Base de données PDO
nous offre la méthode execute.
Cette méthode prend en paramètre la requête à exécuter.
On peut utiliser la méthode prépare afin de préparer la requête à exécuter.
$req= $bdd->prepare(« La requête à préparer »)
Une fois la requête préparée, on utilise la méthode execute en lui passant un tableau
associatif contenant la liste des paramètres.
$req= $bdd->prepare("insert into matable (`champ1`,
`champ2`, `champn`) VALUES (:val1,:val2,:valn)");
$req->execute(array(
'val1'=>'val1',
'val2'=>'val2',
'valn'=>5
));
PHP Accès à la BD
Modification d’enregistrement BD
Même fonctionnement que l’ajout.
Requête update.
$req= $bdd->prepare(« update matable set champ1=:val1,
champ2= :val2, champ3= :champ3 where champ_condition=
:cnd");
$req->execute(array(
'val1'=>‘newval1',
'val2'=>‘newval2',
'valn'=>7,
‘cnd'=>’valCnd’,
));
PHP Accès à la BD
Suppression d’enregistrement BD
Même fonctionnement que l’ajout et la mise à jour.
Requête delete.
$req= $bdd->prepare(« delete from matable where
champ_condition= :cnd");
$req->execute(array(
‘cnd'=>’valCnd’,
));
%
50
e
nic
r Se
one
Cum
C
ce
erv
rS
ma
Cat
ter
ow
Ru