Vous êtes sur la page 1sur 13

PHP et MySQL

Sourour Ammar Kessentini


sourour.ammar@gmail.com

Les SGBD
 Des programmes qui se chargent du stockage de
vos données
 MySQL : libre et gratuit, c'est probablement le
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.

2 sourour.ammar@gmail.com 2015-2016
Comment communiquer avec MySQL ?
 Utiliser le langage SQL (standard)
 Utiliser PHP qui fait la jonction entre
l’utilisateur et MySQL

3 sourour.ammar@gmail.com 2015-2016

PHPMyAdmin
 un des outils les plus connus permettant de
manipuler une base de données MySQL
 phpMyAdmin est livré avec WAMP

4 sourour.ammar@gmail.com 2015-2016
Comment se connecte-t-on à la base de
données en PHP ?
 PHP propose plusieurs moyens de se connecter à une
base de données MySQL.
 L'extension mysql_ : ce sont des fonctions qui
permettent d'accéder à une base de données MySQL et
donc de communiquer avec MySQL. Leur nom commence
toujours par mysql_. Toutefois, ces fonctions sont
vieilles et on recommande de ne plus les utiliser
aujourd'hui.

 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.

5 sourour.ammar@gmail.com 2015-2016

Se connecter à MySQL avec PDO


 Pour se connecter à une base depuis php, il faut
spécifier un nom de serveur, un nom d’utilisateur,
un mot de passe et un nom de base.

 le nom de l'hôte : c'est l'adresse de l'ordinateur où


MySQL est installé (comme une adresse IP). Le plus
souvent, MySQL est installé sur le même ordinateur que
PHP : dans ce cas, mettez la valeur localhost (cela
signifie « sur le même ordinateur »).

 la base : c'est le nom de la base de données à laquelle


vous voulez vous connecter.

 Login : ‘root’ sous Wamp par défaut


 Mot de passe : ‘’ sous Wamp par défaut

6 sourour.ammar@gmail.com 2015-2016
Connexion à MySQL avec PDO
<?php
// Sous WAMP (Windows)
$bdd = new PDO('mysql:host=localhost;dbname=test;
charset=utf8', 'root', '');
?>

$bdd : un objet qui représente la connexion à la


base de données

7 sourour.ammar@gmail.com 2015-2016

Connexion à MySQL avec PDO


Exemple :
<?php
try
{
$bdd = new
PDO('mysql:host=localhost;dbname=test;charset=utf8', 'root',
'');
$bdd->setAttribute(PDO::ATTR_ERRMODE,
PDO::ERRMODE_EXCEPTION);
}
catch (Exception $e)
{
echo 'Erreur : ' . $e->getMessage();
}
?>
8 sourour.ammar@gmail.com 2015-2016
Interrogation
 Pour envoyer une requête à une base de donnée,
il existe des fonctions : $bdd->query(‘str’);
qui prend pour paramètre une chaîne de
caractères qui contient la requête écrite en
SQL.

 Les requêtes les plus couramment utilisées


sont : CREATE (création d’une table), SELECT
(sélection), INSERT (insertion), UPDATE (mise
à jour des données), DELETE (suppression),
ALTER (modification d’une table), etc.

9 sourour.ammar@gmail.com 2015-2016

Interrogation :SELECT
<?php
$reponse = $bdd->query('SELECT * FROM
jeux_video');
?>

 $reponse contient maintenant la réponse de


MySQL.

 $reponse contient des informations


inexploitables (non organisé)  récupération
ligne par ligne

10 sourour.ammar@gmail.com 2015-2016
Interrogation

<?php
$donnees = $reponse->fetch();
?>

 $donnees est un array qui contient champ par champ


les valeurs de la première entrée.
 Il faut faire une boucle pour parcourir les
entrées une à une.

 Chaque fois qu’on appele $reponse->fetch(), on


passe à l'entrée suivante. La boucle est donc
répétée autant de fois qu'il y a d'entrées dans
notre table.

11 sourour.ammar@gmail.com 2015-2016

Exemple :
<?php
// On récupère le nom et le prix de la table jeux_video
$reponse = $bdd->query('SELECT nom, prix FROM jeux_video LIMIT
0,10');
// On affiche chaque entrée une à une
while ($donnees = $reponse->fetch())
{ $reponse->fetch(PDO::FETCH_ASSOC)
?> $reponse->fetch(PDO::FETCH_NUM)
<p>
<strong>Jeu</strong> : <?php echo $donnees['nom']; ?><br />
Prix : <?php echo $donnees['prix']; ?> euros !<br />
</p>
<?php
}
$reponse->closeCursor(); // Termine le traitement de la requête
?>

12 sourour.ammar@gmail.com 2015-2016
Exemple : methode 2
<?php
// On affiche chaque entrée une à une
foreach ($bdd->query('SELECT nom, prix FROM jeux_video LIMIT
0,10') as $donnees )
{
?>
<p>
<strong>Jeu</strong> : <?php echo $donnees['nom']; ?><br
/>
Prix : <?php echo $donnees['prix']; ?> euros !<br />
</p>
<?php
}
$reponse->closeCursor(); // Termine le traitement de la
requête
?>

13 sourour.ammar@gmail.com 2015-2016

Quelle est la différence entre $reponse et


$donnees ?
 $reponse contenait toute la réponse de MySQL
en vrac, sous forme d'objet.

 $donnees est un array renvoyé par le fetch().


Chaque fois qu'on fait une boucle, fetch va
chercher dans $reponse l'entrée suivante et
organise les champs dans l'array $donnees.

 while ($donnees = $reponse->fetch()) :


 récupère une nouvelle entrée et place son contenu
dans $donnees
 vérifie si $donnees vaut vrai ou faux.

14 sourour.ammar@gmail.com 2015-2016
Fermeture du curseur

<?php $reponse->closeCursor(); ?>

 provoque la « fermeture du curseur d'analyse


des résultats ».

15 sourour.ammar@gmail.com 2015-2016

Exemple :
<?php
try
{
$bdd = new PDO('mysql:host=localhost;dbname=test;charset=utf8',
'root', '');
}
catch(Exception $e)
{ echo 'Erreur : '.$e->getMessage(); }

$reponse = $bdd->query('SELECT nom FROM jeux_video');

while ($donnees = $reponse->fetch(PDO::FETCH_ASSOC))


{ echo $donnees['nom'] . '<br />'; }

$reponse->closeCursor();
?>

16 sourour.ammar@gmail.com 2015-2016
Construire des requêtes en fonction de
variables : requêtes préparées
 Solution 1 : utilisation de marqueurs « ? »

<?php
$req = $bdd->prepare('SELECT nom FROM jeux_video WHERE
possesseur = ?');
$req->execute(array($_GET['possesseur']));
?>

<?php
$req = $bdd->prepare('SELECT nom FROM jeux_video WHERE
possesseur = ? AND prix <= ?');
$req->execute(array($_GET['possesseur'],
$_GET['prix_max']));
?>

17 sourour.ammar@gmail.com 2015-2016

Construire des requêtes en fonction de


variables : requêtes préparées
 Solution 2 : utilisation de marqueurs
nominatifs
 Si la requête contient beaucoup de parties variables, il peut
être plus pratique de nommer les marqueurs plutôt que
d'utiliser des points d'interrogation.

<?php
$req = $bdd->prepare('SELECT nom, prix FROM
jeux_video WHERE possesseur = :possesseur AND prix
<= :prixmax');
$req->execute(array(
'possesseur'=>$_GET['possesseur'],
'prixmax'=>$_GET['prix_max']));
?>

18 sourour.ammar@gmail.com 2015-2016
INSERT, UPDATE, DELETE
 au lieu de faire appel à query() on va
utiliser exec() qui est prévue pour exécuter
des modifications sur la base de données

// On ajoute une entrée dans la table jeux_video


$bdd->exec('INSERT INTO jeux_video(nom,
possesseur, console, prix, nbre_joueurs_max,
commentaires) VALUES(\'Battlefield 1942\',
\'Patrick\', \'PC\', 45, 50, \'2nde guerre
mondiale\')');

19 sourour.ammar@gmail.com 2015-2016

INSERT, UPDATE, DELETE


<?php
$req = $bdd->prepare('INSERT INTO jeux_video(nom, possesseur,
console, prix, nbre_joueurs_max, commentaires) VALUES(:nom,
:possesseur, :console, :prix, :nbre_joueurs_max,
:commentaires)');

$req->execute(array(
'nom' => $nom,
'possesseur' => $possesseur,
'console' => $console,
'prix' => $prix,
'nbre_joueurs_max' => $nbre_joueurs_max,
'commentaires' => $commentaires
));
?>

20 sourour.ammar@gmail.com 2015-2016
INSERT, UPDATE, DELETE
<?php
$nb_modifs = $bdd->exec('UPDATE jeux_video SET prix = 10,
nbre_joueurs_max = 32 WHERE nom = \'Battlefield 1942\'');
?>

<?php
$req = $bdd->prepare('UPDATE jeux_video SET prix = :nvprix,
nbre_joueurs_max = :nv_nb_joueurs WHERE nom = :nom_jeu');
$req->execute(array(
'nvprix' => $nvprix,
'nv_nb_joueurs' => $nv_nb_joueurs,
'nom_jeu' => $nom_jeu
));
?>

21 sourour.ammar@gmail.com 2015-2016

INSERT, UPDATE, DELETE


<?php
$nb_modifs = $bdd->exec(‘DELETE FROM jeux_video
WHERE nom = \'Battlefield 1942\'');
?>

<?php
$req = $bdd->prepare(‘DELETE FROM jeux_video WHERE
nom = :nom_jeu');
$req->execute(array(
'nom_jeu' => $nom_jeu
));
?>

22 sourour.ammar@gmail.com 2015-2016
Les transactions
try { // Début de transaction
$db->beginTransaction();
// Requêtes
$db->exec($query1);
$db->exec($query2);
$db->exec($query3);
// Validation
$db->commit();
} catch(PDOException $ex) {
// Un problème : on annule la transaction
$db->rollBack();
echo $ex->getMessage(); }

// Un nouveau "beginTransaction()" annule également le


précédent

23 sourour.ammar@gmail.com 2015-2016

Exemple 1 :
 Base de données : test
 Table : jeux_videos

 Exemple 1 : affichage des 10 premières entrées


 Exemple 2 : Insertion dans la table à partir d’un
formulaire

24 sourour.ammar@gmail.com 2015-2016
Exemple 2 :
 Base de données : test
 Table : jeux_videos

 Exemple 1 : formulaire d’identification

25 sourour.ammar@gmail.com 2015-2016

Exemple 2 :
Login.php verif_login.php
<html> <body> <?php
<form action="verif_login.php" //connexion à la base de données ....
method="post"> $login = $_POST['login']; $pwd =
<fieldset> $_POST['pwd'];
$reponse = $bdd->prepare('SELECT login,
<strong> Login : </strong> pwd FROM identifiants WHERE login=
<input type="text" name="login" ?');
/> <br/><br/> $reponse->execute(array($login));
<strong> Mot de passe : </strong> if($reponse->rowCount()>0){
<input type="password" name="pwd" $donnees = $reponse->fetch();
/> if($donnees['login']==$login &&
<br/><br/> $donnees['pwd'] == $pwd)
<input type="submit" value="se echo 'Bravo! connexion avec succes
!';
connecter">
else
</form> </fieldset>
echo "mot de passe incorrect !!! ";
} else echo "identifiant inconnu";
$reponse->closeCursor();
?>
26 sourour.ammar@gmail.com 2015-2016

Vous aimerez peut-être aussi