PHP – MYSQL
[Link]
[Link]
[Link]
SOMMAIRE
Sommaire ................................................................................................................................... 1
PHP – MySQL – V1 : mysqli .......................................................................................................... 4
1. Bibliothèques utilisées...................................................................................................................... 4
Utilisation de la base de données en PHP .................................................................................................... 4
2. Création d’une BD ............................................................................................................................ 4
3. mysqli pour utiliser sa BD mysql ....................................................................................................... 5
0 : présentation de l’usage de mysqli ........................................................................................................... 5
Documentation mysqli : ............................................................................................................................................5
1 : la gestion des erreurs avec mysqli ........................................................................................................... 5
2 : la connexion à la BD avec mysqli ............................................................................................................. 5
3-1 : Envoi d’une requête avec mysqli – version de base ............................................................................ 6
3-2 : Envoi d’une requête avec mysqli – version « préparé » ...................................................................... 6
4 : Fermeture de la connexion...................................................................................................................... 6
PHP – MySQL – v2 : PDO .............................................................................................................. 7
00. Présentation du document ............................................................................................................. 7
Exemples et exercices................................................................................................................................... 7
Remarque ..................................................................................................................................................... 7
Document « slidé » ....................................................................................................................................... 7
Objectifs généraux de ce document............................................................................................................. 8
Exemples ....................................................................................................................................................... 8
Exercices ....................................................................................................................................................... 8
PHP-MySQL : ................................................................................................................................................. 8
01. Rappels sur l’accès au serveur de BD avec Laragon ou WAMP .......................................................... 9
Ouvrir un client MySQL................................................................................................................................. 9
Ouvrir phpMyAdmin ..................................................................................................................................... 9
Créer et utiliser une Base de données avec phpMyAdmin ........................................................................ 10
Créer une Base de données avec phpMyAdmin .....................................................................................................10
Créer une table et les tuples avec phpMyAdmin ...................................................................................................10
Mettre à jour la colonne des BD à gauche : onglet flèche circulaire verte ............................................................11
Affichez le contenu de la table utilisateur ..............................................................................................................11
Exécuter un SELECT dans phpMyAdmin .................................................................................................................11
Exporter avec phpMyAdmin ...................................................................................................................................11
Importer avec phpMyAdmin...................................................................................................................................11
Créer et utiliser une Base de données avec un client MySQL .................................................................... 12
Créer une BD, une table et les tuples .....................................................................................................................12
Exécuter un SELECT dans phpMyAdmin .................................................................................................................12
1. Connexion à la BD et print_r du contenu d’une table ........................................................................13
Utilisation de la base de données en PHP .................................................................................................. 13
PDO ou mysqli ? PDO !!! ............................................................................................................................. 13
Connexion à la BD : new PDO (exemple-1 – connexion) .......................................................................... 14
Code ........................................................................................................................................................................14
new PDO ..................................................................................................................................................... 15
Afficher le contenu d’une table -1 : query(), fetch(), print_r (exemple-2-select) .................................... 17
Exemple...................................................................................................................................................................17
PHP – 03 – PHP-MySQL – page 1/38
Explications .............................................................................................................................................................17
Résultats..................................................................................................................................................................18
Exercices ..................................................................................................................................................... 19
Exercice-1 : chargez les exemples 1 et 2 et testez-les ............................................................................................19
Exercice-2 : utiliser le code bogué de 01-exercice-connexion-select-bug .............................................................19
2. Vocabulaire de Programmation orientée objet .................................................................................20
Classe .......................................................................................................................................................... 20
Objet ........................................................................................................................................................... 20
Méthode ..................................................................................................................................................... 20
Constructeur ............................................................................................................................................... 20
Attribut d’instance (attribut d’objet) ......................................................................................................... 21
Attribut et constante de classe .................................................................................................................. 21
Exceptions................................................................................................................................................... 21
Guides de style ........................................................................................................................................... 21
3. Technique de programmation – PDO et PDOStatement - $bdd, $reqSQL, $reqPHP ..........................22
Terminologie : $bdd - $reqSQL - $reqPHP - $ligne ............................................................................................22
$bdd (PDO) – query - prepare ...............................................................................................................................23
$requete (PDOStatement) - execute - fetch - closeCurseur .............................................................................23
Synthèse ..................................................................................................................................................................23
Déboguer : or die bdd->errorInfo() ............................................................................................................ 24
Présentation............................................................................................................................................................24
Créer le $bdd avec la gestion des erreurs ..............................................................................................................24
Aternative : exécuter la requête (query ou execute) « or die » .............................................................................24
4. Premiers Select ...............................................................................................................................25
Accès aux champs, order by, like, limit (exemple-3-Select Where) ....................................................... 25
Accéder aux champs ...............................................................................................................................................25
Where et Order by ..................................................................................................................................................25
like ...........................................................................................................................................................................25
limit .........................................................................................................................................................................25
Requêtes variables : where realisateur = ? (exemple-4-Select Variable)................................................. 26
Objectif....................................................................................................................................................................26
Solution basique à éviter : risque XSS .....................................................................................................................26
Solution avec requête préparée : where ? , prepare et execute ...........................................................................27
Remplacer les ? par des :alias .................................................................................................................................27
5. DML ................................................................................................................................................28
Ajouter, modifier, supprimer des données dans une table (exemple-5-insert-update-delete) .............. 28
Select via phpMyAdmin – Afficher .........................................................................................................................28
DML via phpMyAdmin – SQL ..................................................................................................................................28
DML en PHP : INSERT ..............................................................................................................................................28
DML en PHP : DELETE..............................................................................................................................................29
DML en PHP : UPDATE ............................................................................................................................................30
Bons usages.............................................................................................................................................................30
6. Exercice...........................................................................................................................................31
Exercice-3 : chargez les exemples 3, 4 et 5 et testez-les .......................................................................................31
7. TP Site Artiste – non MVC ................................................................................................................32
Exemple-6 : Site Artiste - Etape 1 : uniquement les œuvres ...................................................................... 32
Exercice-4 : installez, testez et regardez bien le code de l’exemple 6 ...................................................................32
Contenu du dossier .................................................................................................................................................32
Installation ..............................................................................................................................................................32
Tester le code..........................................................................................................................................................32
Exercice-5 : Site artiste-étape 2 : œuvres, exposition et œuvres exposées – gestion basique dans le
HTML ........................................................................................................................................................... 33
1) Quand on choisit « œuvres », on obtient ceci qui est la page d’accueil : ........................................................33
2) Quand on choisit « exposition » on obtient ceci : .............................................................................................34
3) Quand on clique sur une exposition, on obtient la liste des œuvres exposées : ..............................................35
Questions à se poser : .............................................................................................................................................36
Schéma de synthèse à réaliser................................................................................................................................37
PHP – 03 – PHP-MySQL – page 2/38
Exercice-6 : Site artiste-étape 3 – comme l’étape 2 mais avec séparation du PHP et du HTML ............... 38
Edition : septembre 2021
PHP – 03 – PHP-MySQL – page 3/38
PHP – MYSQL – V1 : MYSQLI
1. Bibliothèques utilisées
Utilisation de la base de données en PHP
• 3 jeux de fonctions (API) permettent de se connecter à la BD et de l’utiliser :
➢ mysql,
➢ mysqli
➢ PDO
➔ [Link]
• Le jeu mysql est le plus ancien : mieux vaut l’éviter.
• On peut utiliser mysqli ou PDO (PHP Data Object), et particulièrement PDO_MYSQL.
• Mysqli permet d’utiliser MySQL et est plus facile à mettre en œuvre.
• PDO permet d’utiliser n’importe quel SGBD et est plus complexe à mettre en œuvre.
• On commence par mysqli
2. Création d’une BD
Pour nos codes, d’exemple, on suppose une BD existant dont le code de création est le suivant :
DROP database if exists DB_movies_anthropocene;
CREATE database DB_movies_anthropocene;
USE DB_movies_anthropocene;
CREATE table movies(
id integer auto_increment,
titre varchar(30) not null,
annee integer not null,
realisateur varchar(20) not null,
primary key(id)
);
INSERT INTO movies VALUES
(null, "Une vérité qui dérange", 2006, "Davis Guggenheim"),
(null, "Don't look up", 2021, "Adam McKay"),
(null, "Beasts of the southern wild", 2012, "Benh Zeitlin"),
(null, "Melencholia", 2011, "Lars von Trier"),
(null, "Sauve qui peut (la vie)", 1980, "Jean-Luc Godard"),
(null, "Nope", 2022, "Jordan Peele"),
(null, "L'amour à mort", 1984, "Alain Resnais");
PHP – 03 – PHP-MySQL – page 4/38
3. mysqli pour utiliser sa BD mysql
0 : présentation de l’usage de mysqli
Pour utiliser la bibliothèque mysqli, il n’y a rien à faire : elle est accessible « nativement » en PHP.
Pour pouvoir utiliser une BD avec mysqli, on suit 4 étapes :
1. Gestion des erreurs
2. Connexion à la BD
3. Envoi de la requête
4. Fermeture de la connexion
Documentation mysqli :
• [Link] : [Link]
• w3schools : [Link]
1 : la gestion des erreurs avec mysqli
Le code ci-dessous permet d’avoir des messages d’erreur explicites.
// gérer les messages d'erreurs
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
2 : la connexion à la BD avec mysqli
Le code ci-dessous permet de se connecter à la BD.
On précise la machine sur laquelle se trouve le serveur de BD (pour nous : localhost), l’utilisateur qui
se connecte (root), le mot de passe (rien sur PC, root sur mac), la database à laquelle on va accéder.
On instancie un nouvel objet qu’on appelle en général $mysql avec ces 4 paramètres.
// connexion à la BD
$localhost = "localhost";
$user = "root";
$password = "";
$database = "DB_movies_anthropocene";
$mysqli = new mysqli($localhost, $user, $password, $database);
PHP – 03 – PHP-MySQL – page 5/38
3-1 : Envoi d’une requête avec mysqli – version de base
La méthode « query » permet d’envoyer une requête SQL.
Le résultat sera exploitable avec une boucle foreach.
$reqSQL = "
SELECT *
FROM movies
ORDER BY annee DESC
";
$films = $mysqli->query($reqSQL);
foreach ($films as $film) {
echo $film["id"] . " - ";
echo $film["titre"] . " - ";
echo $film["titre"] . " - ";
echo $film["titre"] . "<br>";
}
3-2 : Envoi d’une requête avec mysqli – version « préparé »
Pour passer des variables en paramètres à une requête, on utilise la syntaxe des requêtes
« préparées » : ça sécurise le code en évitant les injections SQL.
Exemple avec un fonction delete et un $id en paramètre : on ne retourne rien.
function deleteFilm($id){
$sql = "
DELETE FROM movies
WHERE id = ?
";
$stmt = $mysqli->prepare($sql); // stmt : statement
$stmt->bind_param("i", $id); // "i" pour un integer
// "is" pour integer et string
// "iii" pour 3 integer
$stmt->execute();
}
4 : Fermeture de la connexion
Pour alléger le serveur, on peut de déconnecter :
$mysqli->close();
PHP – 03 – PHP-MySQL – page 6/38
PHP – MYSQL – V2 : PDO
00. Présentation du document
Exemples et exercices
• Les exemples sont présentés dans un chapitre en vert avec le mot clé : exemple-
• Les dossiers d’exemples sont fournis dans l’article qui contient ce fichier de cours.
➔ [Link]
➔ Chargez ce fichier et mettez-le dans le dossier « php » du répertoire web « www » du
serveur WEB. Vous pouvez aussi structurer les choses avec des dossiers J1, J2, etc.
correspondant aux journées de travail.
• Les exercices à faire sont présentés dans un chapitre en jaune avec les mots-clés : TP- et
exercice-
➔ Les sources pour les exercices, quand il y en a, sont fournis dans le dossier des exemples.
Remarque
• Certains fichiers d’exemple commencent par ces trois lignes :
echo '<h1>CODE PHP</h1>';
highlight_file('[Link]');
echo '<h1>RESULTATS</h1>';
• Ce code affiche deux balises h1 avec CODE PHP puis RESULTATS
• La fonction « highlight_file » permet d’afficher le contenu du fichier proposé. Quand on teste le
code, on commence par affiche le code. Ca permet de voir le code en même temps que les
résultats.
• Pour généraliser le code, on écrit : highlight_file(basename(__FILE__));
• basename(__FILE__) permet de récupérer le nom du fichier en cours de traitement.
Document « slidé »
• Ce document Word est en partie « slidé » : chaque page tient, en général, sur un écran, comme
un slide.
PHP – 03 – PHP-MySQL – page 7/38
Objectifs généraux de ce document
• Utilisation de la bibliothèque PDO
• Usage de la programmation objet en PHP
• Select et DML en PDO
• Organisation du code non MVC
Exemples
1. Connexion à la BD : new PDO (exemple-1 – connexion)
2. Afficher le contenu d’une table -1 : query(), fetch(), print_r (exemple-2-select)
3. Accès aux champs, order by, like, limit (exemple-3-Select Where)
4. Requêtes variables : where realisateur = ? (exemple-4-Select Variable)
5. Ajouter, modifier, supprimer des données dans une table (exemple-5-insert-update-delete)
6. Exemple-6 : Site Artiste - Etape 1 : uniquement les œuvres
Exercices
• Exercice-1 : chargez les exemples 1 et 2 et testez-les
• Exercice-2 : charger le code bogué suivant
➔ L’objectif est d’avoir compris le mécanisme de connexion à la BD.
• Exercice-3 : chargez les exemples 3, 4 et 5 et testez-les
➔ L’objectif est de comprendre les Select et le DML
• Exercice-4 : installez, testez et regardez bien le code de l’exemple 6
➔ L’objectif est de comprendre une première architecture applicative.
• Exercice-5 : Site artiste-étape 2 : œuvres, exposition et œuvres exposées – gestion basique dans
le HTML
➔ L’objectif est d’avoir compris l’architecture de l’exercice 4 et de la mettre en œuvre.
• Exercice-6 : Site artiste-étape 3 – comme l’étape 2 mais avec séparation du PHP et du HTML
➔ L’objectif est de bien séparer le PHP du HTML
PHP-MySQL :
• OCR :
➔ [Link]
mysql/presentation-des-bases-de-donnees-2
• Manuel de Référence du PHP :
➔ [Link]
• Manuel de Référence du SQL :
➔ [Link] : à noter que la représentation ensembliste pour expliquer
les jointures n’a aucun sens !
PHP – 03 – PHP-MySQL – page 8/38
01. Rappels sur l’accès au serveur de BD avec Laragon ou WAMP
Ouvrir un client MySQL
• Laragon : ouvrir un terminal, puis commande : mysql -uroot -p
• WAMP : W / MySQL / console MySQL
➔ On n’utilise pas la console dans cette présentation mais phpMyAdmin
Ouvrir phpMyAdmin
• Laragon : ouvrir Base de données (si phpMyAdmin a été installé, sinon ça ouvre HeidiSQL)
• WAMP : W / phpMyAdmin
PHP – 03 – PHP-MySQL – page 9/38
Créer et utiliser une Base de données avec phpMyAdmin
Créer une Base de données avec phpMyAdmin
• Onglet Base de données
• Dans le champ « nom de base de données » saisissez : « BD_Utilisateurs »
• On vient de créer la BD_Utilisateurs. Elle apparaît dans le navigateur à gauche. Actualisez si
nécessaire (icône flèche circulaire).
Créer une table et les tuples avec phpMyAdmin
• Sélectionner la nouvelle BD dans la liste à gauche
• Allez dans l’onget SQL.
• Collez le code dans la zone de saisie SQL et exécuter.
• La table est créée avec les tuples.
• On va créer la table suivante avec les tuples associés (fichier BD_Utilisateur.sql de l’exercice 1.
CREATE TABLE Utilisateurs (
id int(11) primary key AUTO_INCREMENT,
prenomNom varchar(20) NOT NULL,
adMail varchar(20) NOT NULL,
motDePasse varchar(20) NOT NULL,
annee int(4) NOT NULL
) ENGINE=InnoDB;
Insert into Utilisateurs values (NULL, 'Sia PEI',
'ji@[Link]','jipei', 1995);
Insert into Utilisateurs values (NULL, 'Yawei CAI',
'jawei@[Link]','yaweicai',1996);
Insert into Utilisateurs values (NULL, 'Zikeng PENG',
'zikeng@[Link]','zikeng',1994);
Insert into Utilisateurs values (NULL, 'Jiawen LI',
'jiawen@[Link]','jiawen',1995);
Insert into Utilisateurs values (NULL, 'Xiaoyu LIU',
'xiowyu@[Link]','liu',1996);
Insert into Utilisateurs values (NULL, 'Olivier
TRAN','tran@gmailcom','olivier',1997);
PHP – 03 – PHP-MySQL – page 10/38
Mettre à jour la colonne des BD à gauche : onglet flèche circulaire verte
• Cliquez sur la flèche circulaire verte pour mettre à jour la colonne des BD.
• Vous pouvez ouvrir la BD « BD_Utilisateur ».
• Vous voyez apparaître la table « Utilisateur ».
Affichez le contenu de la table utilisateur
• En cliquant sur la table dans la colonne des BD, on voit apparaître la liste des tuples.
Exécuter un SELECT dans phpMyAdmin
En allant dans l’onglet SQL, on peut saisir une requête. Par exemple :
SELECT * FROM `utilisateur` WHERE id = 3
Exporter avec phpMyAdmin
• On peut exporter la BD dans différents formats :
➔ SQL : Ca génère un script SQL qui permet de reconstituer la BD à l’identique, donc une
sauvegarde.
➔ Exportez la BD générée et regardez le script.
➔ CSV : Ca génère un fichier texte qu’on pourra importer sur Excel.
➔ Exportez la BD en format CSV et importez le fichier CSV dans Excel.
Importer avec phpMyAdmin
• On commence par créer une BD. Ensuite, on peut importer le contenu de la BD dans différents
formats :
➔ SQL : on choisir le fichier à importer. C’est un fichier avec du code SQL (du DDL et du
DML : des CREATE TABLE et des INSERT INTO). Par exemple, c’est un fichier exporté
de sauvegarde.
➔ CSV : on peut importer un fichier Excel qui aura été enregistré au format CSV. Il faut
préciser le séparateur de colonne (plutôt un « ; » en CSV) et préciser si les colonnes ont une
première ligne avec le nom de colonne. On peut dire de ne pas s’arrêter en cas d’erreur
d’INSERT. Il faudra ensuite ajouter des contraintes d’intégrité dans la table.
Particulièrement mettre les clés primaires et étrangères et donnez un nom à la table.
PHP – 03 – PHP-MySQL – page 11/38
Créer et utiliser une Base de données avec un client MySQL
Créer une BD, une table et les tuples
• Dans la console mysql, avec le prompt mysql>
• Collez le code suivant.
• La BD et la table sont créées avec les tuples.
• On va créer la table suivante avec les tuples associés (fichier BD_Utilisateur.sql de l’exercice 1.
drop database if exists BD_Utilisateurs;
create database BD_Utilisateurs;
use BD_Utilisateurs;
CREATE TABLE Utilisateurs (
id int(11) primary key AUTO_INCREMENT,
prenomNom varchar(20) NOT NULL,
adMail varchar(20) NOT NULL,
motDePasse varchar(20) NOT NULL,
annee int(4) NOT NULL
) ENGINE=InnoDB;
Insert into Utilisateurs values (NULL, 'Sia PEII',
'ji@[Link]','jipei', 1995);
Insert into Utilisateurs values (NULL, 'Yawei CAI',
'jawei@[Link]','yaweicai',1996);
Insert into Utilisateurs values (NULL, 'Zikeng PENG',
'zikeng@[Link]','zikeng',1994);
Insert into Utilisateurs values (NULL, 'Jiawen LI',
'jiawen@[Link]','jiawen',1995);
Insert into Utilisateurs values (NULL, 'Xiaoyu LIU',
'xiowyu@[Link]','liu',1996);
Insert into Utilisateurs values (NULL, 'Olivier
TRAN','tran@gmailcom','olivier',1997);
Exécuter un SELECT dans phpMyAdmin
mysql> SELECT * FROM `utilisateur` WHERE id = 3
PHP – 03 – PHP-MySQL – page 12/38
1. Connexion à la BD et print_r du contenu d’une table
Utilisation de la base de données en PHP
• 3 jeux de fonctions (API) permettent de se connecter à la BD et de l’utiliser :
➢ mysql,
➢ mysqli
➢ PDO
➔ [Link]
• Le jeu mysql est le plus ancien : mieux vaut l’éviter.
• On peut utiliser mysqli ou PDO (PHP Data Object), et particulièrement PDO_MYSQL.
PDO ou mysqli ? PDO !!!
• [Link]
• [Link]
• Dans les framework modernes, c’est PDO qui est utilisé.
• L’intérêt du PDO est que c’est une interface d’abstraction permettant l’utilisation de n’importe
quelle BD. De plus elle est « orienté objet ».
➔ On utilisera plutôt PDO_MYSQL.
➔ [Link]
PHP – 03 – PHP-MySQL – page 13/38
Connexion à la BD : new PDO (exemple-1 – connexion)
Code
<?php
function connexionBD($dbname){
// paramètres de la base de donnée
$sgbdname='mysql';
$host='localhost';
$charset='utf8';
// dsn : data source name
$dsn =
$sgbdname .
':host='.$host .
';dbname='.$dbname.
';charset='.$charset;
// utilisateur connecté à la base de donnée
$username = 'root';
$password = '';
// pour avoir des erreurs SQL plus claires
$erreur = array(
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION
);
try {
// connexion à la BD : new PDO
$bdd = new PDO($dsn, $username, $password, $erreur);
echo'<p>Connexion réussie</p>';
return $bdd;
} catch (PDOException $e) {
echo 'Connexion échouée : ' . $e->getMessage();
return NULL;
// die ('Connexion échouée : ' . $e->getMessage() );
// pas de die avec PDO
}
}
?>
PHP – 03 – PHP-MySQL – page 14/38
new PDO
On fait un new PDO avec 4 paramètres
• PDO est une classe.
➔ [Link]
• On crée un nouvel objet de la classe qu’on appelle $bdd.
• Le new PDO à 4 paramètres :
➔ $dsn (data source name) : contient des infos sur le SGBD (mysql), le serveur (host, ici :
localhost), le nom de la BD, le jeu de caractères utilisé (UTF8 pour que ce soit le plus
générique).
➔ $username : nom de l’utilisateur qui se connecte à la BD.
➔ $password : password de l’utilisateur qui se connecte à la BD.
➔ $erreur : pour gérer les messages d’erreur.
On utilise des variables pour rendre le code lisible et facile à paramétrer :
• $host : la machine du serveur de SGBD,
• $sgbdname : le type de SGBD,
• $username : le nom de l’utilisateur qui se connecte sur la BD,
• $password : le mot de passe de cet utilisateur,
• $dbname : le nom de la BD à laquelle on accède sur le SGBD.
PHP – 03 – PHP-MySQL – page 15/38
$erreur : gestion des erreurs
$erreur = array(
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION
);
• En ajoutant le paramètre $erreur tel qu’il est là dans le new PDO, on aura des messages d’erreurs
du SGBD, par exemple si le SELECT est mal écrit.
• $erreur est un tableau associatif. On lui fournit un couple key => value.
➔ key : PDO ::ATTR_ERRMODE
➔ value : PDO::ERRMODE_EXCEPTION
• Syntaxe de POO-PHP :
➔ PDO ::ATTR_ERRMODE et PDO::ERRMODE_EXCEPTION sont des constantes de
classe définies dans la classe PDO.
➔ [Link]
➔ Classe::CONSTANTE_DE_CLASSE
➔ PDO ::ATTR_ERRMODE : [Link]
➔ PDO::ERRMODE_EXCEPTION : [Link]
Gestion des erreurs avec try catch
• La structure « try » « catch » est une structure de programmation objet pour gérer les erreurs : les
exceptions.
➔ On essaye un code : try
➔ Si ça « plante », on attrape une exception et on la gère
➔ [Link]
• Le die permet d’arrêter proprement l’exécution de la page en cas d’erreur.
➔ Il ne s’utilise pas avec PDO.
PHP – 03 – PHP-MySQL – page 16/38
Afficher le contenu d’une table -1 : query(), fetch(), print_r (exemple-2-select)
Exemple
<?php
// 1 : on écrit la requête
$reqSQL='SELECT * FROM utilisateurs';
// 2 : on récupère le résultat
$reqPHP=$bdd->query($reqSQL);
echo '<pre>'; print_r($reqPHP); echo '</pre>';
// 3 : on affiche le résultat ligne par ligne
while($ligne=$reqPHP->fetch()){
echo '<pre>'; print_r($ligne); echo '</pre>';
echo '<p> nombre d’éléments de $ligne : ' .sizeof($ligne). '</p>';
}
// 4 : on libère les tables de la requête
$reqPHP->closeCursor(); // pour finir le traitement
?>
Explications
7. On écrit la requête SQL dans $reqSQL : c’est une simple chaine de caractères.
8. On utilise la méthode (fonction) query de $bdd (->) en passant la $reqSQL en paramètre.
➔ Le résultat est dans $reqPHP : c’est un objet complexe sur lequel on peut appliquer des
méthodes (des fonctions) qui donnera accès au tableau de données du select.
➔ On affiche la $reqPHP pour voir son contenu : seule la requête s’affiche (la requête n’est pas
exécutée à ce stade).
9. $reqPHP est « fétché » : on récupère les lignes de la réponse à la requête une par une. Quand il
n’y en a plus ça retourne false.
➔ Chaque $ligne retournée par le fetch est un tableau associatif : on peut faire un print_r de
$ligne.
➔ On constate alors qu’on a deux accès possibles à chaque donnée : par le nom du champs (id
par exemple) ou par un numéro (0 pour id) : il y a donc 2 fois plus d’éléments que prévu
dans chaque ligne
10. Quand on a fini de travailler, on fait un closeCursor, pour libérer les tables de la requête
PHP – 03 – PHP-MySQL – page 17/38
Résultats
Connexion réussie
DEBUT
PDOStatement Object
(
[queryString] => SELECT * FROM utilisateur
)
while($ligne=$resultat->fetch()){
Array
(
[id] => 1
[0] => 1
[prenomNom] => Sia PEI
[1] => Sia PEI
[adMail] => ji@[Link]
[2] => ji@[Link]
[motDePasse] => jipei
[3] => jipei
[annee] => 1995
[4] => 1995
)
nombre d’éléments de $ligne : 10
Array
(
[id] => 2
[0] => 2
Etc.
PHP – 03 – PHP-MySQL – page 18/38
Exercices
Exercice-1 : chargez les exemples 1 et 2 et testez-les
• Il faut parfois charger les BD pour pouvoir tester les exemples.
Exercice-2 : utiliser le code bogué de 01-exercice-connexion-select-bug
• Le code est dans le dossier des exemples
• Installer-le sur votre serveur local et tester-le. On utilise la bd_utilisateurs déjà créée.
• Constatez les erreurs une par une et corrigez-les une par une en observant les résultats :
➔ Une erreur de mot de passe
➔ Une erreur de BD
➔ Une erreur de Select et de gestion d’erreur
PHP – 03 – PHP-MySQL – page 19/38
2. Vocabulaire de Programmation orientée objet
[Link]
Classe
[Link]
• Une classe, c’est un type, comme un entier, un réel, un caractère, une string ou un booléen.
• Une classe va permettre de créer de variables de type « classe » : ce seront des objets.
• En plus, on associe des fonctions à une classe : on les appelle alors « méthode ».
Objet
[Link]
• Un objet c’est une variable de type Classe.
• En général, un objet correspond à l’équivalent d’un tableau associatif : il contient des couples
clé-valeur. Les différentes clés sont appelées « attribut » (comme avec du JSON).
• Une classe va permettre de définir les clés – attributs - de façon générale pour tous les objets de
la classe : comme ça, on n’a pas besoin de les redéfinir à chaque fois.
• Quand on crée un objet avec des valeurs pour les couples clé-valeur (pour les attributs), on dit
qu’on instancie un objet.
➔ Ca passe par la commande « new ».
Méthode
• Les méthodes sont des fonctions qui sont attachées à une classe.
• Elle ne se sont utilisables que par les objets de la classe.
• On écrit : objet->methode() pour appeler la méthode pour l’objet en question : c’est comme si on
avait passé l’objet en paramètre de la méthode.
Constructeur
• Le constructeur est la méthode qui permet d’instancier un nouvel objet.
[Link]
PHP – 03 – PHP-MySQL – page 20/38
Attribut d’instance (attribut d’objet)
• Les attributs d’un objet peuvent avoir des valeurs différentes pour chaque objet.
• Un attribut d’objet est défini au niveau de la classe. Chaque objet instancié portera les attributs
de sa classe et pourra avoir des valeurs spécifiques pour chacun des attributs.
Attribut et constante de classe
[Link]
• Un attribut de classe est un attribut qui a une valeur « attachée » à la classe et pas à un objet
particulier.
• On utilise souvent les attributs de classe pour définir des constantes de classe : des attributs
attachés à une classe avec une valeur fixe.
Exceptions
• Les erreurs en POO sont gérés par une mécanisme de « try » « catch » :
• On essaye (try) un code. Si ça marche on fait certains traitements. Si ça plante on attrape (catch)
l’erreur générée et on fait les traitements nécessaires.
• Les erreurs sont appelées des « exceptions ».
Guides de style
• [Link]
• [Link]
PHP – 03 – PHP-MySQL – page 21/38
3. Technique de programmation – PDO et PDOStatement - $bdd, $reqSQL, $reqPHP
• Pour manipuler la BD, on utilise principalement 2 classes correspondant à 2 objets :
➔ classe PDO -> objet $bdd
➔ classe PDOStatemenet -> objet $reqPHP
Terminologie : $bdd - $reqSQL - $reqPHP - $ligne
• $bdd : un objet de la classe PDO sera appelé $bdd. C’est en quelque sorte l’objet qui permet
l’accès concret à la base de données, pour un utilisateur et une base de donnée.
• $reqSQL : le texte de la requête sera mis dans un $reqSQL. C’est une simple chaine de
caractères. Il ne doit pas être confondu avec le résultat de la requête : $requete.
• $reqPHP : un objet de la classe PSOStatement sera appelé $requete (statement peut vouloir dire
« requête ». Cette $reqPHP est un objet complexe qui contient à la fois le $reqSQL et permet
l’accès au résultat de la requête une fois celle-ci exécutée.
• $ligne : le résultat d’un fetch() est une ligne : $ligne =$requete->fetch(). C’est un tuple de la
table résultant de la requête SQL.
PHP – 03 – PHP-MySQL – page 22/38
$bdd (PDO) – query - prepare
• [Link]
• La classe PDO ne contient que des méthodes (elle ne contient pas d’attributs). Notons
Particulièrement :
➔ query($reqSQL) : renvoie un $reqPHP auquel est associé le $reqSQL passé en paramètre
et donne accès au résultat de la requête (le résultat du Select) prêt à être fetché (prêt à être
parcouru).
➔ prepare($reqSQL) : renvoie un $reqPHP auquel est associé le $reqSQL passé en
paramètre. La requête n’a pas été exécutée. Elle peut contenir des variables.
• PDO contient aussi des méthodes propres à une BD comme la gestion des transactions : commit,
rollback, etc., et d’autres choses.
$requete (PDOStatement) - execute - fetch - closeCurseur
• [Link]
• La classe PDOStatement contient un attribut : la valeur du $resSQL fourni en paramètre quand il
a été créé. Il contient aussi des méthodes. Notons particulièrement :
➔ execute() : permet d’exécuter une une requête avec des variables. Il faut fournir en
paramètre un tableau de valeurs pour les variables.
➔ fetch() : permet de récupérer les lignes du résultat de la requête, une par une.
➔ fetchAll() : permet de récupérer les lignes du résultats de la requête, toutes dans un tableau.
➔ closeCurseur() : permet de refaire un execute.
Synthèse
$bdd : PDO $reqPHP : PDOStatement
-> query($reqSQL) : PDOStatement -> fetch() : ligne
-> prepare($reqSQL) : PDOStatement -> exectute() : bool
-> closeCursor() : bool
-> fetchAll() : toutes les lignes
PHP – 03 – PHP-MySQL – page 23/38
Déboguer : or die bdd->errorInfo()
Présentation
• On a déjà vu les 2 techniques pour déboguer :
➔ le paramètre $erreur dans le new PDO()
➔ le « or die() »
Créer le $bdd avec la gestion des erreurs
• Pour afficher les détails d’une erreur, on crée un $bdd avec la gestion des erreurs :
$erreur = array(PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION);
$bdd = new PDO($dsn, $username, $password, $erreur);
• C’est suffisant pour obtenir des messages d’erreur propres.
Aternative : exécuter la requête (query ou execute) « or die »
• Si on n’utilise pas un $erreur dans le new PDO, on peut ajouter un « or die » au query ou au
execute pour afficher les détails d’une erreur.
$requete=$bdd->query($reqSQL) or die(print-r($bdd-
>errorInfo())) ;
ou
$requete->execute(array( … )) or die(print-r($bdd-
>errorInfo())) ;
➔ Le « or die » est inutile avec une connexion PDO en ERRMODE.
➔ [Link]
Les limites du « or die » : confidentialité et user friendly
• Le « or die » peut être pratique en phase de développement.
• En production, il met au jour des informations qui peuvent être confidentielles et n’est pas user-
friendly.
• [Link]
PHP – 03 – PHP-MySQL – page 24/38
4. Premiers Select
Accès aux champs, order by, like, limit (exemple-3-Select Where)
Accéder aux champs
• $ligne est un tableau associatif. On peut donc accéder à chacune de ses clés et on peut écrire :
echo '<p><strong> prenom nom </strong></p>';
while($ligne=$requete->fetch()){
echo '<p>' .$ligne[prenom]. ' ' .$ligne[nom]. '</p>';
}
Where et Order by
$reqSQL='
Select realistateur, titre, annee from films
where realisateur = \'King Vidor\'
order by annee
';
// on precise 3 champs : realisateur, titre et annee
// attention au \'
// on trie par annee
like
$reqSQL='
SELECT * FROM films
WHERE realisateur like \'%manki%\'
order by realisateur, annee
';
// like % manki % : n’importe quoi autour de manki
// order by realisateur, annee : plusieurs realisateurs possibles
// dans le resultat : j’ordonne le résultat
limit
$reqSQL='
Select realistateur, titre, annee from films
where annee = 1960
order by annee
limit 0, 10
') ;
// on prend les 10 premiers (de 1 à 10)
// limit 10, 10 pour les 10 suivants
// limite 20, 10 pour les 10 suivants, etc.
PHP – 03 – PHP-MySQL – page 25/38
Requêtes variables : where realisateur = ? (exemple-4-Select Variable)
Objectif
• Mettre une variable dans une requête
➔ par exemple, une information saisie par l’utilisateur dans un formulaire).
Solution basique à éviter : risque XSS
• On pourrait mettre un $_GET dans la $reqSQL :
$reqSQL='Select… where auteur=\'' .$_GET['realisateur']. '\'') ;
➔ A éviter !!! si le $_GET contient ‘toto \' or \'a\'=\'a, le select renverra toute la table !
PHP – 03 – PHP-MySQL – page 26/38
Solution avec requête préparée : where ? , prepare et execute
• On met un « ? » pour la valeur variable de la requête.
• Ensuite on utilise une methode prepare() pour préparer la $reqPHP
• Ensuite on utilise une methode execute() sur le $reqPHP en lui passant en paramètres la ou les
valeurs pour prendre la place du ou des « ? »
$reqSQL='Select… where realisateur = ?;
$requete=$bdd->prepare($reqSQL)
$requete->execute(array(
$_GET['realisateur']
));
➔ On sépare les arguments par des « , » dans le array du execute
Remplacer les ? par des :alias
• On peut remplacer les « ? » par des alias de la forme « :nomAlias ».
• Du coup, dans le exécute on passe des couples clé-valeur : la clé correspond à l’alias, dans le
« : ».
• Cette solution est la plus lisible et celle qu’on va privilégier.
$reqSQL='Select… where realisateur= :realisateur;
$requete=$bdd->prepare($reqSQL)
$requete->execute(array(
'realisateur'=> $_GET['realisateur']
));
PHP – 03 – PHP-MySQL – page 27/38
5. DML
Ajouter, modifier, supprimer des données dans une table (exemple-5-insert-update-delete)
Select via phpMyAdmin – Afficher
• On peut utiliser l’interface graphique.
• On peut aussi entrer une commande SQL.
DML via phpMyAdmin – SQL
• On peut entrer les commandes SQL : INSERT, UPDATE et DELETE.
• Le système propose un pré-remplissage des commandes.
DML en PHP : INSERT
$reqSQL='
INSERT INTO films
(titre, realisateur, annee) VALUES
(:titre, :realisateur, :annee)
';
//exemple('Dead Man','Jim JarmushKing Vidor','1995');
$requete=$bdd->prepare($reqSQL)
$resultat=$req-> execute(array(
'titre'=>$_GET['titre'],
'realisateur'=>$_GET['realisateur'],
'annee'=>$_GET['annee']
)); // or die(print-r($bdd->errorInfo())) ;
/* le or die est inutile avec la connexion en ERRMODE */
/* $resultat pour traiter les erreurs proprement, sans ERRMODE */
PHP – 03 – PHP-MySQL – page 28/38
DML en PHP : DELETE
$reqSQL='
DELETE FROM films
WHERE titre = :titre AND realisateur = :realisateur'
;
$requete=$bdd->prepare($reqSQL);
$resultat=$requete->execute(array(
'titre'=>$_GET['titre'],
'realisateur'=>$_GET['realisateur']
));
/* pour tester le résultat : 0 si pas de DELETE */
if($requete->rowCount() ){ // rowCount compte le nombre de delete
echo '<br/>DELETE effectué ' .$requete->rowCount(). ' fois';
}
else {
echo '<br/> Le DELETE a échoué';
}
• rowCount permet de savoir combien de delete on été effectués.
• [Link]
ATTENTION au DELETE !!
• Attention au delete : quand une donnée est supprimée, on ne peut pas la récupérer si on est en
mode validation (autocommit) ce qui est le plus fréquent !
• Il faut donc faire des vérifications, par exemple :
if (
!isset($_GET['realisateur']) or
!isset($_GET['titre']) or
$_GET['realisateur']=='' or
$_GET['titre']==''
){
echo '<br/> Vous n\'avez pas saisi tous les paramètres';
}
PHP – 03 – PHP-MySQL – page 29/38
DML en PHP : UPDATE
$reqSQL='
UPDATE films
SET duree=:duree
WHERE titre = :titre AND realisateur = :realisateur
';
ATTENTION à l’UPDATE!!
• Attention à l’UPDATE : quand une donnée est modifiée, on ne peut pas la récupérer si on est en
mode validation (autocommit) ce qui est le plus fréquent !
Bons usages
• A la place de :
'titre'=>$_GET['titre']
• on aura
'titre'=>$titre
➔ Les variables $titre, $realisateur, etc. seront récupérées via un $_POST ou un $_GET.
PHP – 03 – PHP-MySQL – page 30/38
6. Exercice
Exercice-3 : chargez les exemples 3, 4 et 5 et testez-les
• Il faut parfois charger les BD pour pouvoir tester les exemples.
➔ Pour charger une BD, on peut faire un copier-coller directement dans un client mysql ou
dans la fenêtre SQL de phpMyAdmin
➔ Ou alors, dans phpMyAdmin, on peut aussi faire une importation de la création des tables et
des tuples dans une BD existant déjà
➔ A noter qu’il faut peut-être laisser 2 lignes vides au début du fichier.
➔ Ou alors, on peut aussi démarrer un client mysql en lui fournissant un fichier :
C:>mysql -uroot -p <[Link]
➔ A noter qu’on peut avoir des difficultés avec les accents
• Dans les exemples, quand on fait du DML, vérifier le résultat avec un script MySQL, soit dans
phpMyAdmin, soit dans un client MySQL.
PHP – 03 – PHP-MySQL – page 31/38
7. TP Site Artiste – non MVC
Exemple-6 : Site Artiste - Etape 1 : uniquement les œuvres
Exercice-4 : installez, testez et regardez bien le code de l’exemple 6
Contenu du dossier
• Le dossier de l’exemple 6 contient :
• Le code de la BD : BD_ARTISTE.sql et un dossier d’images.
• Le fichier de connexion à la BD.
• Une page pour l’affichage des œuvres.
Installation
• Installez la BD sur WAMP.
• Parcourez le contenu de la BD pour bien la comprendre.
• Regardez la page d’affichage des œuvres : [Link]
Tester le code
• On obtient l’affichage suivant :
PHP – 03 – PHP-MySQL – page 32/38
Exercice-5 : Site artiste-étape 2 : œuvres, exposition et œuvres exposées – gestion basique dans
le HTML
• Ensuite on veut pouvoir afficher aussi les expositions et les œuvres exposées.
• On considère que « Site Artiste » et le « nav » sont dans un header HTML.
• La BD_ARTISTE-[Link] avec les expositions et les œuvres exposées se trouve dans le dossier
exercice-05-Site-artiste-étape-2 qui se trouve dans le dossier des exemples.
➔ Il faut produire les pages présentées ci-dessous.
➔ Mettre à jour la page des œuvres.
➔ Créer la page des expositions sur le même modèle que la page des œuvres mais en gérant le
lien vers les œuvres exposés.
➔ Créer la page des œuvres exposées sur le même modèle que la page des œuvres mais en
gérant le fait qu’on vient d’une exposition particulière et qu’on affiche cette exposition et ses
œuvres.
1) Quand on choisit « œuvres », on obtient ceci qui est la page d’accueil :
PHP – 03 – PHP-MySQL – page 33/38
2) Quand on choisit « exposition » on obtient ceci :
PHP – 03 – PHP-MySQL – page 34/38
3) Quand on clique sur une exposition, on obtient la liste des œuvres exposées :
PHP – 03 – PHP-MySQL – page 35/38
Problématique d’organisation de base : quels fichiers pour mes projets ?
• Le but est d’afficher les œuvres, les expositions et les œuvres exposées.
Questions à se poser :
• Quels fichiers dois-je créer ?
➔ Il y aura 1 fichier par page.
• Comment circule-t-on de page en page ?
• Y a-t-il des éléments commun côté HTML ?
➔ Côté HTML, le header sera partagé.
• Y a-t-il de éléments commun côté PHP ?
➔ Côté PHP, la connexion à la BD sera partagée.
PHP – 03 – PHP-MySQL – page 36/38
Schéma de synthèse à réaliser
PHP – 03 – PHP-MySQL – page 37/38
Exercice-6 : Site artiste-étape 3 – comme l’étape 2 mais avec séparation du PHP et du HTML
• On va maintenant organiser le code en séparant au maximum le code PHP et le code HTML.
➔ Pour ça, on va utiliser la fonction fetchAll() :
$lesOeuvres=$requete->fetchAll();
• Ainsi, on récupère le tableau complet des œuvres issu du Select.
• On peut ensuite parcourir ce tableau dans le PHP avec un classique « foreach » :
foreach($lesOeuvres as $ligne){
echo '<h3>[' .$ligne['id']. '] : ' .$ligne['titre']. ' - '
.$ligne['annee']. ' - ' .$ligne['prix'].' euros</h3>';
etc.
}
• On peut éventuellement partir de cette version pour démarrer.
PHP – 03 – PHP-MySQL – page 38/38