PHP 03 PHP MySQL
PHP 03 PHP MySQL
PHP 03 PHP MySQL
https://openclassrooms.com/courses/concevez-votre-site-web-avec-php-et-mysql/presentation-des-
bases-de-donnees-2
http://php.net/manual/fr/langref.php
Open Class Room
SOMMAIRE
Sommaire ...................................................................................................................................... 1
PHP - MySQL ................................................................................................................................. 4
Installation des fichiers de test ................................................................................................................ 4
Les exemples sont présentés dans un chapitre en vert. ............................................................................. 4
Les exercices à faire sont présentés dans un chapitre en jaune. ................................................................ 4
Utilisation de PHPMyAdmin .................................................................................................................... 4
Oouvrir phpMyAdmin ................................................................................................................................. 4
Créer une Base de données ........................................................................................................................ 4
Créer une table et les tuples ....................................................................................................................... 4
Mettre à jour la colonne des BD à gauche : onglet flèche circulaire verte ................................................. 5
Affichez le contenu de la table utilisateur .................................................................................................. 5
Exécuter un SELECT .................................................................................................................................... 5
Exporter ...................................................................................................................................................... 5
Importer ..................................................................................................................................................... 5
Connexion à la BD et print_r du contenu d’une table ............................................................................... 7
Utilisation de la base de donnée en PHP .................................................................................................... 7
Connexion à la BD : new PDO (exemple 1 – connexion) ........................................................................... 7
Code ........................................................................................................................................................................ 7
Explications ............................................................................................................................................................. 7
Afficher le contenu d’une table -1 : query(), fetch(), print_r (exemple 2 – select) ................................... 8
Exemple .................................................................................................................................................................. 8
Explications ............................................................................................................................................................. 9
Résultats ................................................................................................................................................................. 9
Chargez les exemples 1 et 2 et testez-les. ............................................................................................................ 10
Vocabulaire de Programmation orientée objet ...................................................................................... 10
Classe ........................................................................................................................................................ 10
Objet ......................................................................................................................................................... 10
Méthode ................................................................................................................................................... 10
Exceptions ................................................................................................................................................. 10
Guides de style ......................................................................................................................................... 10
Gestion des requêtes ............................................................................................................................. 11
Technique de programmation – PDO et PDOStatement - $bdd, $requete, $reqSQL ............................... 11
Terminologie : $bdd - $reqSQL - $requete - $ligne .......................................................................................... 11
$bdd (PDO) – query - prepare ............................................................................................................................. 11
$requete (PDOStatement) - execute - fetch - closeCurseur ............................................................................ 11
Synthèse ................................................................................................................................................................ 11
Accès aux champs, gestion erreurs, order by, like, limit (exemple 3 – Select Where) ........................ 12
Chargez la BD pour pouvoir tester les codes ........................................................................................................ 12
Accéder aux champs ............................................................................................................................................. 12
Select attribut1, attribut2, Where, Order by ........................................................................................................ 12
Select … like .......................................................................................................................................................... 12
Select … Order by, limit ......................................................................................................................................... 12
Requêtes variables : where realisateur = ? (exemple 4 – Select Variable) ............................................. 13
MVC ............................................................................................................................................ 22
Problématique : quels fichiers, quels dossiers pour mes projets ............................................................ 22
Organisation non-MVC .......................................................................................................................... 22
Principes d’organisation non-MVC ........................................................................................................... 22
Défauts de l’organisation non-MVC ......................................................................................................... 22
Présentation du MVC ............................................................................................................................ 23
MVC : Modèle - Vue - Contrôleur. ............................................................................................................ 23
Le Modèle (SQL) ....................................................................................................................................... 23
La Vue (HTML) .......................................................................................................................................... 23
Le Contrôleur (PHP) .................................................................................................................................. 24
Fonctionnement global ............................................................................................................................. 24
MVC : design pattern tête la première ..................................................................................................... 25
Organisation des répertoires et des fichiers dans le MVC ...................................................................... 26
Organisation de répertoires MVC ............................................................................................................. 26
Les fichiers « modèle » ............................................................................................................................. 26
Les fichiers « contrôleur » ........................................................................................................................ 26
Les fichiers « vue » .................................................................................................................................... 26
Le font contrôleur = contrôleur global = routeur = indexSwitch ............................................................. 27
Le problème .............................................................................................................................................. 27
La solution : un « front contrôleur » ......................................................................................................... 27
Le fichier indexSwitch.html : le routeur ................................................................................................... 27
Principes ................................................................................................................................................................ 27
Exemple ................................................................................................................................................................ 27
empty() ou isset() .................................................................................................................................................. 28
Include entête et pied de page ............................................................................................................................. 28
Déconnexion ......................................................................................................................................................... 28
Debug .................................................................................................................................................................... 28
Variante sans switch : beaucoup plus courte ! ......................................................................................... 28
PHP-MySQL :
https://openclassrooms.com/courses/concevez-votre-site-web-avec-php-et-mysql/presentation-des-
bases-de-donnees-2
Manuel de Référence du PHP :
http://php.net/manual/fr/langref.php
Manuel de Référence du SQL :
http://www.w3schools.com/sql/
Chargez ce fichier et mettez-le dans le dossier Partie_4 du répertoire web « www » du serveur
WAMP.
Utilisation de PHPMyAdmin
Oouvrir phpMyAdmin
Icône Wamp / bouton droit / phpMyAdmin
On va créer la table suivante avec les tuples associés (fichier BD_Utilisateur.sql de l’exercice 1.
Exécuter un SELECT
En allant dans l’onglet SQL, on peut saisir une requête. Par exemple :
Exporter
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.
Importer
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.
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 = 'root';
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() );
}
}
?>
Explications
Exemple
// on écrit la requête
$reqSQL='SELECT * FROM utilisateur';
// on récupère le résultat
$requete=$bdd->query($reqSQL);
echo '<pre>'; print_r($requete); echo '</pre>';
Résultats
Connexion réussie
DEBUT
< pre > print_r($requete); < /pre >
PDOStatement Object
(
[queryString] => SELECT * FROM utilisateur
)
while($ligne=$requete->fetch()){
Array
(
[id] => 1
[0] => 1
[prenomNom] => Sia PEI
[1] => Sia PEI
[adMail] => ji@gmail.com
[2] => ji@gmail.com
[motDePasse] => jipei
[3] => jipei
[annee] => 1995
[4] => 1995
)
nombre d’éléments de $ligne : 10
Array
(
[id] => 2
[0] => 2
[prenomNom] => Yawei CAI
[1] => Yawei CAI
[adMail] => jawei@yahoo.com
[2] => jawei@yahoo.com
[motDePasse] => yaweicai
[3] => yaweicai
[annee] => 1996
[4] => 1996
)
nombre d’éléments de $ligne : 10
Classe
Une classe, c’est un type, comme un entier, un réel, un caractère, une string ou un booléen.
En général, une classe correspond à l’équivalent d’un tableau associatif : elle contient plus couples de
clé-valeur. Les différentes clés sont appelées « attribut ».
En plus, on associe des fonctions à une classe : on les appelle alors « méthode ».
Objet
Un objet c’est une variable de type Classe.
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.
Exceptions
En cas d’erreur, en programmation objet on passe par des objets de classe Exception.
Ca se fait avec un « try » « catch »
try : on essaie d’exécuter une suite d’instruction
catch : si la suite d’instructions exécutée à générer une erreur sous la forme d’une exception, on passe
dans le bloc catch
Le catch précise le nom de l’objet exception qu’on va traiter.
On peut alors accéder à des informations par la méthode getMessage() par exemple.
Guides de style
https://fr.wikipedia.org/wiki/CamelCase
https://eilgin.github.io/php-the-right-way/#code_style_guide
Synthèse
$bdd : PDO $requete : PDOStatement
-> query($reqSQL) : PDOStatement -> fetch() : ligne
-> prepare($reqSQL) : PDOStatement -> exectute() : bool
-> closeCursor() : bool
-> fetchAll() : toutes les lignes
Select … 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
$requete=$bdd->prepare($reqSQL)
$requete->execute(array(
$_GET['realisateur']
));
$requete=$bdd->prepare($reqSQL)
$requete->execute(array(
'realisateur'=> $_GET['realisateur']
));
Le « or die » est inutile avec une connexion PDO en ERRMODE. Le « or die » s’utilise quand on
travaille avec le jeu « mysql » de fonctions et la fonction mysql_connect(…).
http://php.net/manual/fr/pdo.errorinfo.php
$requete=$bdd->prepare($reqSQL)
$resultat=$req-> execute(array(
'titre'=>$_GET['titre'],
'realisateur'=>$_GET['realisateur'],
'annee'=>$_GET['annee']
)); // or die(print-r($bdd->errorInfo())) ;
$requete=$bdd->prepare($reqSQL);
$resultat=$requete->execute(array(
'titre'=>$_GET['titre'],
'realisateur'=>$_GET['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.
Exemple 6 : Etape 1 : uniquement les œuvres – TP 2 : Installez, testez et regardez bien le code
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 : indexOeuvres.php
Tester le code
On obtient l’affichage suivant :
$lesOeuvres=$requete->fetchAll();
foreach($lesOeuvres as $ligne){
echo '<h3>[' .$ligne['id']. '] : ' .$ligne['titre']. ' - '
.$ligne['annee']. ' - ' .$ligne['prix'].' euros</h3>';
etc.
Questions à se poser :
Quels fichier dois-je créer ?
Il y aura 1 fichier par page.
https://openclassrooms.com/courses/votre-site-php-presque-complet-architecture-mvc-et-bonnes-
pratiques/avant-propos-comment-fonctionne-ce-tutoriel
https://openclassrooms.com/courses/adopter-un-style-de-programmation-clair-avec-le-modele-mvc
Organisation non-MVC
Une page c’est comme un « main » qui reçoit des paramètres ($_GET, $_POST). La liste des
paramètres est variable selon l’entrée (un href, un autre href, un formulaire de saisie, un autre, un
header). Il y a aussi des variables globales partagées par toutes les pages dans $_SESSION.
Cela rend le code plus facile à mettre à jour et permet d’organiser le travail en 3 parties et donc de
travailler en parallèle.
La connaissance de l’architecture MVC rend capable de créer un site web de qualité et facile à
maintenir.
En pratique, les architectures MVC mises en œuvre s’appuient sur la théorie mais l’adaptent de façon
pragmatique. Il y a donc plusieurs façons de mettre en œuvre le MVC.
Les principaux framework sont développés en MVC : CodeIgniter, CakePHP, Symfony, Jelix, Zend
Framework, etc.
Le Modèle (SQL)
Le modèle gère les données du site. Essentiellement les accès à la BD. Mais aussi la gestion de
fichiers. Il propose des fonctions pour faire des Insert, des Update, des Delete, des Select. Ces
fonctions peuvent renvoyer des tableaux de données. Les résultats seront exploités par le contrôleur
mais aussi par le HTML.
L’idée générale est que dans une application, la base de données est centrale.
Si la BD est bien conçue, l’application sera facile à maintenir et à faire évoluer.
Si la BD est mal conçue, l’application sera complexe à maintenir.
La Vue (HTML)
La vue affiche la page HTML. Elles récupèrent des variables du Contrôleur et/ou du Modèle pour
savoir ce qu’elles doivent afficher.
C’est une page HTML avec quelques boucles et conditions PHP très simples, pour afficher les
Le contrôleur est le « chef d’orchestre » : il récupère la demande de l’utilisateur à travers la vue (la
page HTML) par un href, un formulaire ou un header. Il échange des données avec le modèle, fait les
calculs (qui peuvent être complexes) puis choisit une vue à afficher en lui fournissant les variables.
Le rôle du contrôleur peut se limiter à faire le lien entre le modèle et la vue : de la colle !
Fonctionnement global
Un utilisateur, à travers une vue, fait appel à une page : un contrôleur (par un href ou un formulaire).
Le contrôleur « include » un modèle et utilise une des fonctions du modèle.
Il fait ensuite des calculs.
Selon les résultats, il include une vue ou une autre à afficher à l’utilisateur.
Et ainsi de suite.
On dit que le MCV est un design pattern (DP). C’est en réalité un assemblage de DP élémentaires (un
par lettre) : les DP « stratégie », « composite » et « observateur » (les DP ont des noms).
Si on code réellement ces DP, alors on aura une mise à jour automatique des notifications (DP
observateur).
Le fichier PHP n’aura pas de balise fermante ( ?>) : ça évite des problèmes !
L’objet bdd sera déclaré en global pour ne pas avoir à refaire la connexion à chaque opération. Dans
l’idéal, il faut utiliser un DP singleton qui permet de ne recréer un objet que s’il n’a pas déjà été créé.
Dans chaque sous-repertoire de module, on crée un fichier par fonction qui a le nom de la fonction.
Ainsi on fait un include du fichier et un appel à la fonction.
Quand on demande un fichier dans la barre d'adresse, c’est un contrôleur qu’on appelle.
Le problème
Avec l’organisation précédente, on aura un « main » par page (par contrôleur).
Un problème majeur va être de faire le lien entre les pages : en effet, un href partira d’une page (un
contrôleur) pour aller à un autre page (un autre contrôleur).
Le problème est que ça obligera à parcourir l’arborescence des fichiers avec des href du type :
Href= «../admin/pageAdmin.php »
Si on a des href dans un fichier « includé », il en sera de même.
Avec un telle organisation, on risque souvent d’avoir des problèmes de « routage » (trouver la route
pour une page à ouvrir) très complexe. Si on change un peu la structure des fichiers ou des
répertoires, ou simplement si on change le nom d’un répertoire, il faudra retrouver tous les href qui
sont référence à ce répertoire pour les mettre à jour : c’est long et pénible !
C’est le « front contrôleur » ou « routeur ». On retrouve le terme de « routeur » dans les frameworks.
Les autres contrôleurs sont parfois appelés backContoller.
Le rôle du « front contrôleur » est de déterminer quel contrôleur appeler et de faire des initialisations
générales (connexion à la BD, affichage d’en-tête ou de pied de page, etc.).
Le fichier index.html appellera le routeur avec une route particulière, c’est-à-dire un contrôleur
particulier, donc une page particulière à afficher.
Principes
IndexSwitch est le front contrôleur qui choisit le contrôleur à exécuter.
Ce front controleur, c’est ce qu’on appellera le « routeur » dans les framework php.
On regarde quel index est setté pour savoir quel contrôleur appeler.
On teste sur $_GET et $_POST car on peut venir d’un header, d’un href ou d’un formulaire.
Exemple
<?php
session_start();//On démarre la session
include('modele/connexion_sql.php'); // connexion à la BD
empty() ou isset()
C’est presque la même chose. empty() est vrai pour non défini, =0 ou =null. isset() est faux
uniquement pour non défini.
http://php.net/manual/fr/function.empty.php
Déconnexion
Pour libérer proprement la BD.
En PDO, la déconnexion n’est pas utile si on a fait des close cursor
include('modele/deconnexion_sql.php'); // deconnexion à la BD
Debug
On affiche $_ SESSION, POST et GET pour suivre ce qui se passe pour chaque page. On n’a plus
besoin du nom du fichier puisque c’est toujours le même : celui du front controleur !
On peut mettre ça dans un test : ainsi, il suffit de passer debut à 0 pour arrêter l’affichage des
superglogabes.
$debug=1;
if($debug==1){
print_r($_SESSION);echo'<br/>'; echo'POST : ';
print_r($_POST);echo'<br/>'; echo'GET : ';
print_r($_GET);echo'<br/>';
}
A partir de là, le front controleur vérifie que $_GET ou $_POST sont setté et que le fichier
correspondant au controleur qu’on veut appeler existe (is_file()).
Si c’est le cas, on peut faire un include du controleur back. Sinon, on revient à la page d’accueil.
...
//On inclut le contrôleur s'il existe et s'il est spécifié
if (!empty($_GET['page']) &&
is_file('controleurs/'.$_GET['page'].'.php'))
else
include 'controleurs/accueil.php'; // controleur accueil
...
Le fichier index.html
Le fichier index.html appelle avec une fonction header() le front contrôleur : ici le fichier
indexSwitch.
On passe un paramètre à l’URL : par exemple, indexOeuvres : se sera la page d’accueil du site.
On donne n’importe quelle valeur au paramètre. On ne fera que tester s’il est setté.
<?php
// on appelle indexSwith en settant indexArticle avec n'importe
quel valeur
header('location: indexSwitch.php?indexOeuvre=set');
?>
Pour se connecter comme administrateur, il faudra créer un formulaire par exemple comme ceci
(dans chaque page de la partie publique) :
Vérifier le login
if(isset($_POST['admin'])
AND htmlspecialchars($_POST['admin'])== 'admin'
AND isset($_POST['password'])
AND htmlspecialchars($_POST['password'])=='admin'){
$_SESSION['admin'] = $_POST['admin'];
}
Dans le contrôleur d’administration, on vérifie au début si on a bien reçu le bon login – motDePasse.
On vérifie que les deux champs sont settés et qu’ils contiennent, par exemple « admin » et « admin ».
Ø Gestion de la déconnexion
Quand on se déconnecte, on passera un $_POST['deconnexion'] à la page de retour : en l’occurrence
celle des œuvres.
De là, dans la page des œuvres, on teste si $_POST['deconnexion'] est setté (on vient du bouton
déconnexion). Si c’est le cas, on unset $_SESSION['admin']
Ø Page d’erreur
On crée une nouvelle vue pour gérer l’erreur si l’admin n’a pas le mot de passe.
La vue garde le header des utilisateurs publics : on peut retourner sur les œuvres et les expositions.
Quand on ajoute une exposition, il faut pouvoir préciser la liste des œuvres exposées.
Quand on supprime une exposition, il faut supprimer aussi toutes les œuvres exposées.
Quand on modifie une exposition, il faut pouvoir ajouter ou supprimer des œuvres et aussi modifier
le prix des œuvres dans l’exposition.
Quand l’utilisateur sera connecté comme administrateur, on fera en sorte qu’il reste connecté où qu’il
aille, sauf s’il se déconnecte.