Vous êtes sur la page 1sur 62

CHAPITRE 8: PHP ET BD

Module: Architecture Client / Serveur

F. OUAKASSE
Plan
• Stocker des informations dans une base de données (PHP avec MySQL)
• Tester la présence d’erreurs
• Récupérer les données
• les critères de sélection en sql
• Les requêtes préparées
• Traquer les erreurs
• Ajouter / modifier /supprimer des données (php-sql)
• Rappel SQL
3

Stocker des informations dans une base de données


4

Présentation des bases de données


• MySQL : libre et gratuit, c’est probablement le Système de gestion de base
de données (SGBD) le plus connu;
• PostgreSQL : libre et gratuit comme MySQL, avec plus de fonctionnalités
mais un peu moins connu ;
• SQLite : libre et gratuit, très léger mais très limité en fonctionnalités ;
• Oracle : utilisé par les très grosses entreprises ; sans aucun doute un des
SGBD les plus complets, mais il n’est pas libre et on le paie le plus souvent
très cher ;
• Microsoft SQL Server : le SGBD de Microsoft
5

Communication entre PHP et MySQL


6

Mais où sont enregistrées les données ?


7

Se connecter à la base de données en PHP

• Pour pouvoir travailler avec la base de données en PHP, il faut d’abord


s’y connecter.
• MySQL demande d’abord un nom d’utilisateur et un mot de passe.
 Il va donc falloir que PHP s’authentifie
8

Comment se connecte-t-on à la base de données en


PHP?
9

Se connecter à la base de données en PHP


• L’extension mysql_ : ce sont des fonctions qui permettent d’accéder à une
base de données MySQL et donc de communiquer avec MySQL.
• L’extension mysqli_ : ce sont des fonctions améliorées d’accès à MySQL.
Elles proposent plus de fonctionnalités et sont plus à jour.
• L’extension PDO : c’est un outil complet qui permet d’accéder à n’importe
quel type de base de données. On peut donc l’utiliser pour se connecter aussi
bien à MySQL que PostgreSQL ou Oracle
10

Quel moyen choisir parmi tous ceux-là ?


11

Activer PDO (PHP Data Object)


12

Etapes pour interagir avec une base de données


• L'exploitation de MySQL avec PHP s'effectue en plusieurs
étapes :

• Ouverture d'une connexion à MySQL et sélection de la base de données


• Requête sur la base de données
• Exploitation des résultats de la requête
• Fermeture de la connexion à MySQL
13

Se connecter à MySQL avec PDO

• Le nom de l’hôte
• Le nom de la base de données
• Le login
• Le mot de passe
14

Se connecter à MySQL avec PDO

• Exemple de connexion locale:


<?php
$bdd = new PDO('mysql:host=localhost;dbname=agence', 'root', '');
?>
• Exemple avec un site en ligne:
<?php
$bdd = newPDO('mysql:host=sql.monsite.com;dbname=mabase', 'admin' ,
'secret');
?>
15

Tester la présence d’erreurs


• Exemple :
<?php
try {
$bdd = new PDO('mysql:host=localhost;dbname=agence', 'root', '');
}
catch (Exception $e){
die('Erreur : ' . $e->getMessage());
} ?>
16

Récupérer les données


• Création de requête:

$reponse = $bdd->query(’Tapez votre requête SQL ici’);

• Exemple:
<?php
$reponse = $bdd->query(' SELECT * FROM voitures ');
?>
17

Récupérer les données

• Pour afficher le résultat d’une requête on utilise fetch()


• Syntaxe :
$donnees = $reponse->fetch();
18

Afficher le résultat d’une requête


• Exemple:
<?php
try{
$bdd = new PDO('mysql:host=localhost;dbname=agence', 'root', '');}
catch (Exception $e){
die('Erreur : ' . $e->getMessage());
}
$reponse = $bdd->query('SELECT * FROM voitures');
while ($donnees = $reponse->fetch())
?>
19

Afficher le résultat d’une requête


<?php echo $donnees['Marque'];
?><br />
La Modele de cette voiture:
<?php echo $donnees['Modele']; ?>,
le moteur est <?php echo $donnees['Moteur']; ?>
</p>
<?php}
$reponse->closeCursor(); // Termine le traitement de la requête
?>
20

Afficher seulement le contenu de quelques champs


<?php
try{
$bdd = new PDO('mysql:host=localhost;dbname=agence', 'root', '');}
catch (Exception $e){
die('Erreur : ' . $e->getMessage());}
$reponse = $bdd->query('SELECT * FROM voitures');
while ($donnees = $reponse->fetch())
echo $donnees['Marque'] . '<br />';
$reponse->closeCursor();
?>
21

les critères de sélection


• Afficher avec « WHERE »:
<?php
try {
$bdd = new PDO('mysql:host=localhost;dbname=agence', 'root', '');}
catch(Exception $e){
die(' Erreur : '.$e->getMessage());}
$reponse = $bdd->query('SELECT marque, modele FROM voitures WHERE
marque = \'Peugeot\'');
while ($donnees = $reponse->fetch()){
echo ($donnees[‘marque'] . ' ' . $donnees[‘modele'] . ' <br /> ');}
$reponse->closeCursor();
?>
22

les critères de sélection


• Afficher avec «ORDER BY»:
<?php
try{
$bdd = new PDO('mysql:host=localhost;dbname=agence', 'root', '');}
catch(Exception $e){
Die(' Erreur : '.$e->getMessage());}
$reponse = $bdd->query('SELECT marque, moteur FROM voitures ORDER
BY Moteur ');
while ($donnees = $reponse->fetch()){
echo $donnees[‘marque'] . '' . $donnees[‘moteur'] . ' <br /> ';}
$reponse->closeCursor();
?>
23

les critères de sélection


• Afficher avec «LIMIT»:
<?php
try{
$bdd = new PDO('mysql:host=localhost;dbname=agence', 'root', '');}
catch(Exception $e){
die(' Erreur : '.$e->getMessage());}
$reponse = $bdd->query(' SELECT marque FROM voitures LIMIT 0, 10 ');
Echo ' <p>Voici les 10 premières entrées de la table voitures:</p> ';
while ($donnees = $reponse->fetch()){
echo $donnees[‘marque'] . ' <br /> ';}
$reponse->closeCursor(); ?>
24

les critères de sélection


• Afficher avec plusieurs critères:
SELECT marque, modele, moteur
FROM voitures WHERE marque=’peugeot’
OR moteur=’essence’
ORDER BY modele
LIMIT 0,10
25

Construire des requêtes en fonction de variables


• Exemple:
<?php
$reponse = $bdd->query('SELECT modele FROM voitures where marque=\''.
$_POST[ 'marque'] . '\' ');
?>
26

Les requêtes préparées


• Beaucoup plus sûr
• Rapide pour la base de données si la requête est exécutée plusieurs fois
• Ajouter un marqueur « ? »:
<?php
$req = $bdd->prepare('SELECT modele FROM voitures where marque=?');
?>
27

Les requêtes préparées


• Exécuter la requête:
$req->execute(array($_POST['marque']));
• Plusieurs paramètres:
<?php
$req = $bdd->prepare(’SELECT marque FROM voitures WHERE marque = ?
AND moteur = ?’);
$req->execute(array($_GET[‘marque’], $_GET[‘moteur ’]));
?>
28

Les requêtes préparées


• Le contenu de ces variables aura été automatiquement sécurisé pour
prévenir les risques d’injection SQL.
• Il faut vérifier que $_POST[’marque’] contient bien ce qu’on attend
29

Les requêtes préparées


• Les requêtes préparées avec des marqueurs « nominatifs »
<?php
$req = $bdd->prepare(’SELECT marque, moteur FROM voiture WHERE
marque = :marque AND moteur = : moteur ’);
$req->execute(array(‘marque’ => $_GET[‘marque’], ‘moteur ’ =>
$_GET[‘moteur ’]));
?>
30

Traquer les erreurs


• Exemple d’erreur: Fatal error: Call to a member function fetch() on a non-
object in C:\wamp\www\tests\index.php on line 13
• On rajoute le code: or die(print_r($bdd-> errorInfo())
• Exemple : Cas d’une requête simple
<?php
$reponse = $bdd->query(’SELECT Marque FROM voitures’) or
die(print_r($bdd->errorInfo()));
?>
31

Traquer les erreurs


• Exemple : supposons que j’ai écris mal le nom d’un champ:
<?php
$reponse = $bdd->query(’SELECT maque FROM voitures’) or die(
print_r($bdd->errorInfo()));?>
• Résultat:
Unknown column ‘maque ’ in ’field list’
32

Traquer les erreurs


• Cas d’une requête préparée
<?php
$req = $bdd->prepare(’SELECT marque , modele FROM voitures WHERE
moteur = : moteur ’) or die(print_r($bdd-> errorInfo()));
?>
33

INSERT : ajouter des données


• Exemple1:
INSERT INTO voitures(marque, modele,moteur) VALUES(\'citroen\', \‘C5\',
\'Diesel\')
• Exemple2:
INSERT INTO voitures(marque, id, modele, moteur) VALUES(\'Renault\',
LAST_INSERT_ID() , \'clio\', \‘Diesel\')
• Exemple 3:
INSERT INTO voitures VALUES(\'citroen\',NULL, \'c1\', \'essence\')
34

INSERT : ajouter des données


• Application en PHP:
<?php
try {
$bdd = new PDO('mysql:host=localhost;dbname=agence', 'root', '');}
catch (Exception $e){
die('Erreur : ' . $e -> getMessage()); }
$bdd->exec('INSERT INTO voitures(marque, id, modele,moteur)
VALUES(\'Renault\', LAST_INSERT_ID() , \'clio\', \'Diesel\')') or
die(print_r($bdd-> errorInfo()));
Echo 'la voiture a été bien ajouté'; ?>
35

INSERT : ajouter des données


• Insertion de données variables grâce à une requête préparée:
<?php
try {
$bdd = new PDO('mysql:host=localhost;dbname=agence', 'root', '');}
catch (Exception $e){
die('Erreur : ' . $e -> getMessage());
}
$req = $bdd->prepare ('INSERT INTO voitures(marque, modele,moteur)
VALUES(:marque, :modele,:moteur)');
$req->execute (array(‘marque' => $marque, ‘modele' => $modele,‘moteur' =>
$moteur));
echo 'la voiture a été bien ajouté';
?>
36

UPDATE : modifier des données


• Exemple1:
<?php
try {
$bdd = new PDO('mysql:host=localhost;dbname=agence', 'root', '');}
catch (Exception $e){
die('Erreur : ' . $e -> getMessage());
}
$bdd->exec('UPDATE voitures SET modele = \'fluence\' WHERE
modele = \'twingo\'');
?>
37

UPDATE : modifier des données


• Exemple 2:
<?php
$nb_modifs = $bdd->exec('UPDATE voitures SET modele =
\'fluence\' WHERE modele = \'twingo\'');
echo $nb_modifs . 'entrées ont été modifiées !';
?>
38

UPDATE : modifier des données


• Avec une requête préparée
<?php
$req = $bdd->prepare('UPDATE voitures SET modele = :modele,
marque = :marque WHERE modele = \'fluence\'');
$req->execute(array( 'modele' => $modele,
'marque' => $marque));
?>
39

DELETE : supprimer des données


• Exemple:
<?php
try {
$bdd = new PDO('mysql:host=localhost;dbname=agence', 'root', '');}
catch (Exception $e){
die('Erreur : ' . $e -> getMessage());
}
$bdd->exec('DELETE FROM voitures WHERE modele=107' )

?>
40

Rappel SQL
41

Les catégories des fonctions SQL

• Les fonctions scalaires : elles agissent sur chaque entrée.;


• Les fonctions d’agrégat : lorsque vous utilisez ce type de fonctions, des
calculs sont faits sur l’ensemble de la table pour retourner une valeur
42

Utiliser une fonction scalaire SQL


• Upper:
SELECT UPPER(marque) FROM voitures

• Utiliser un alias:
SELECT UPPER(marque) as marque FROM voitures
43

Utiliser une fonction scalaire SQL


• Exemple:
<?php
$req = $bdd->query('SELECT UPPER(marque) as marquem FROM
voitures');
while ($donnees = $req->fetch())
{
echo $donnees['marquem'] . '<br />';
}
$req->closeCursor();
?>
44

Utiliser une fonction scalaire SQL


• LOWER:
'SELECT LOWER(marque) AS marque_min FROM voitures‘

• LENGTH:
'SELECT LENGTH(marque) AS marque_lon FROM voitures‘
45

Utiliser une fonction d’agrégat SQL


• AVG:
SELECT AVG(prix) AS prix_moyen FROM voitures
• SUM :
SELECT SUM(prix) AS prix_total FROM voitures
• MAX
SELECT MAX(prix) AS prix_max FROM voitures
• MIN
SELECT MIN(prix) AS prix_min FROM voitures
46

Utiliser une fonction d’agrégat SQL

• COUNT :
SELECT COUNT(*) AS nbvoitures FROM voitures
SELECT COUNT(DISTINCT marque) AS nbvoitures FROM voitures distinct
47

Utiliser une fonction d’agrégat SQL

• GROUP BY
SELECT AVG(prix) AS prix_moyen, marque from voitures GROUP BY marque
• HAVING
SELECT AVG(prix) AS prix_moyen, marque from voitures GROUP BY marque
HAVING prix_moyen <=300
48

Les différents types de dates

• DATE
• TIME
• DATETIME
• TIMESTAMP
• YEAR
49

Les fonctions de gestion des dates


• NOW :
INSERT INTO voitures(Marque, date_reser ) VALUES(\'citroen\', NOW())

• CURDATE()
INSERT INTO voitures(marque, date_reser ) VALUES(’renault’, CURDATE())
50

Extraire des informations d’une date:


• DAY()
SELECT marque, DAY(date_reser) AS jour FROM voitures

• MONTH()
SELECT marque, MONTH(date_reser) AS mois FROM voitures

• YEAR()
SELECT marque, YEAR(date_reser) AS annees FROM voitures
51

Extraire des informations d’une date:


• HOUR()
SELECT marque, HOUR(date_reser) AS heure FROM voitures

• MINUTE()
SELECT marque, MINUTE(date_reser) AS minute FROM voitures

• SECOND()
SELECT marque, SECOND(date_reser ) AS seconde FROM voitures
52

Extraire des informations d’une date:


• DATE_FORMAT : formater une date:
SELECT marque, DAY(date_reser ) AS jour,
MONTH(date_reser ) AS mois,
YEAR(date_reser ) AS annee,
HOUR(date_reser ) AS heure,
MINUTE(date_reser ) AS minute,
SECOND(date_reser ) AS seconde FROM voitures
echo $donnees[’jour’] . ’/’ . $donnees[’mois’] . ’/’ . $donnees[’annee’] ;
53

Extraire des informations d’une date:


• DATE_FORMAT : formater une date:

SELECT marque, DATE_FORMAT(date_reser, \'%d/%m/%Y %Hh%imin%ss\')


AS datee FROM voitures
54

Extraire des informations d’une date:


• DATE_ADD
SELECT marque, DATE_ADD(date_reser, INTERVAL 15 DAY) AS
date_expiration FROM voitures where date_reser = \'2013-12-04\‘

• DATE_SUB :
SELECT marque, DATE_SUB(date_reser, INTERVAL 5 MONTH) AS
date_expiration FROM voitures where date_reser = \'2013-12-04\'
55

Les jointures entre tables


• Les jointures internes : elles ne sélectionnent que les données
qui ont une correspondance entre les deux tables ;

• Les jointures externes : elles sélectionnent toutes les données,


même si certaines n’ont pas de correspondance dans l’autre table.
56

Les jointures internes


• WHERE
SELECT voitures.marque, reservation.client
FROM voitures, reservation
WHERE voitures.id = reservation.id_voiture
• Utilisez les alias:
SELECT voitures.marque AS marque_voiture, reservation.client AS
client_voiture
FROM voitures, reservation
WHERE voitures.id = reservation.id_voiture
57

Les jointures internes

• Utilisez les alias des tables:


SELECT v.marque AS marque_voiture, r.client AS client_voiture
FROM voitures v, reservation r
WHERE v.id = r.id_voiture
58

Les jointures internes

• JOIN:
SELECT v.marque AS marque_voiture, r.client AS client_voiture
FROM reservation r
INNER JOIN voitures v
on v.id = r.id_voiture
59

Les jointures externes

• LEFT JOIN : récupérer toute la table de gauche


SELECT v.marque AS marque_voiture, r.client AS client_voiture
FROM reservation r
LEFT JOIN voitures v
on v.id = r.id_voiture
60

Les jointures externes

• RIGHT JOIN : récupérer toute la table de droite


SELECT v.marque AS marque_voiture, r.client AS client_voiture
FROM reservation r
RIGHT JOIN voitures v
on v.id = r.id_voiture
61

Les jointures
62

Exercice d’application (TP6)

• Création d’un site avec PHP et MySql qui permet la gestion (ajouter , modifie,
supprimer) d’une liste des étudiants.
1) Création de la base de données
2) Création des formulaires
3) Rendre les pages dynamiques (communication php et mysql)

Vous aimerez peut-être aussi