Site web dynamique = beaucoup de données :
On n'écrit pas ces données dans des tableaux dans les fichiers PHP.
Base de données (BDD, database) : systÚme qui enregistre des informations classées et structurées.
SystÚme de gestion de base de données (SGBD, database management system) : logiciel qui gÚre une base de données, comme MySQL, Oracle, MariaDB...
SQL : langage pour communiquer avec une BDD. Commun Ă tous les SGBD (sauf pour les requĂȘtes compliquĂ©es).
Une base de données est formée de tables.
Chaque table contient des champs (colonnes, columns) et des entrées (lignes, rows).
SELECT FROM
). Renvoie les résultatsINSERT INTO
)UPDATE
)DELETE FROM
)On peut manipuler (voir, créer, modifier) une base de données avec le logiciel phpMyAdmin, au lieu d'écrire en SQL.
phpMyAdmin est installé dans notre serveur web. Il est sur a-pedagoarles-mmi.aix.univ-amu.fr/phpmyadmin
Pour manipuler une base de données avec PHP nous utilisons l'extension PDO (PHP Data Objects)
C'est un ensemble de classes. Ăa ressemble Ă des fonctions.
Un fichier PHP qui affiche les données d'une base de données doit :
On peut faire plusieurs requĂȘtes dans le mĂȘme fichier PHP. Il suffit de se connecter une seule fois
Exemple :
<?php
// (1) connexion Ă la BDD
$dbh = new PDO('mysql:host=localhost;dbname=m2202td4exo1;charset=utf8',
'root',
'');
?>
Exemple :
<?php
// (1) connexion Ă la BDD
$dbh = new PDO('mysql:host=localhost;dbname=m2202td4exo1;charset=utf8',
'root',
'');
// (2) requĂȘte SQL
$sth = $dbh->prepare('SELECT * FROM users');
$sth->execute();
?>
Exemple :
<?php
// (1) connexion Ă la BDD
$dbh = new PDO('mysql:host=localhost;dbname=m2202td4exo1;charset=utf8',
'root',
'');
// (2) requĂȘte SQL
$sth = $dbh->prepare('SELECT * FROM users');
$sth->execute();
// (3) résultats
$result = $sth->fetchAll();
?>
Exemple :
<?php
// (1) connexion Ă la BDD
$dbh = new PDO('mysql:host=localhost;dbname=m2202td4exo1;charset=utf8',
'root',
'');
// (2) requĂȘte SQL
$sth = $dbh->prepare('SELECT * FROM users');
$sth->execute();
// (3) résultats
$result = $sth->fetchAll();
// (4) affichage
foreach ($result as $row) {
echo '<p>';
echo '<b>' . $row['name'] . '</b> ' . $row['bio'];
echo '</p>';
}
?>
On doit se connecter à une base de données avec un compte utilisateur. Il faut :
La base de donnĂ©es est souvent hĂ©bergĂ©e dans le mĂȘme serveur que le site web.
Avec PDO :
$dbh = new PDO('mysql:host=localhost;dbname=nom_bdd;charset=utf8',
'login',
'motdepasse');
Une seule connexion par fichier PHP.
ParamÚtres différents sur un serveur local / externe
// serveur local, avec XAMPP ou WAMP
$dbh = new PDO('mysql:host=localhost;dbname=r213tp6exo1;charset=utf8', 'root', '');
// serveur local, avec MAMP
$dbh = new PDO('mysql:host=localhost;dbname=r213tp6exo1;charset=utf8', 'root', 'root');
// serveur externe MMI (a-pedagoarles)
$dbh = new PDO('mysql:host=localhost;dbname=a20123456;charset=utf8', 'a20123456', 'secret');
// serveur externe AMU (pedaweb)
$dbh = new PDO('mysql:host=' . $_SERVER['dbHost'] . ';dbname=' . $_SERVER['dbBd'] . ';charset=utf8', $_SERVER['dbLogin'], $_SERVER['dbPass']);
Encore mieux, avec affichage de messages d'erreur
try {
$dbh = new PDO('mysql:host=localhost;dbname=r213tp6exo1;charset=utf8',
'root',
'',
array(PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION));
} catch(Exception $e) {
die('Erreur : ' . $e->getMessage());
}
Une fois connectĂ©s Ă la base de donnĂ©es, on peut lui envoyer un message (requĂȘte SQL)
//...
$sth = $dbh->prepare('SELECT title FROM movies'); // prĂ©parer la requĂȘte SQL
$sth->execute(); // l'envoyer au serveur
// ...
Normalement, on utilise des variables dans une requĂȘte SQL.
//...
$sth = $dbh->prepare('SELECT title, year
FROM movies
WHERE director = :real');
$values = array('real' => $directeur);
$sth->execute($values); // :real est remplacé par la variable $directeur
// ...
:real
est un marqueur nominatif
On obtient les rĂ©sultats de la requĂȘte et on les donne Ă une variable :
// ...
$result = $sth->fetchAll();
// ...
Le rĂ©sultat de la requĂȘte est un tableau bidimensionnel :
Il suffit de parcourir le tableau (for
, foreach
) et afficher son contenu
// ...
echo '<ul>';
foreach ($result as $row) {
echo '<li>' . $row['title'] . ' (' . $row['year'] . ')</li>'; // <li>Dune (1984)</li>
}
echo '</ul>';
?>
Dans la validation d'un formulaire, vous devez vérifier si l'adresse email est déjà utilisée. Comment vous faites ?
Vous devez afficher le nombre de commentaires sur un film. Comment vous faites ?
new
et ->
. C'est la programmation orientée objet.
$dbh
(connexion), $sth
(requĂȘte), $values
(variables de la requĂȘte), $result
(résultat)
Les autres requĂȘtes SQL sont l'insertion (INSERT INTO
), la modification (UPDATE
) et la suppression (DELETE FROM
)
Normalement, on les effectue durant le traitement d'un formulaire. Ensuite, on renvoie l'utilisateur vers une autre page avec la fonction header()
.
Les Ă©tapes sont :
Exemple :
$dbh = new PDO('mysql:host=localhost;dbname=a20123456;charset=utf8', 'a20123456', 'secret');
$sth = $dbh->prepare('INSERT INTO users(user_login, user_mail, display_name)
VALUES(:login, :email, :name)');
$values = array('login' => $nom,
'email' => $adresse,
'name' => $nom_prenom);
$sth->execute($values);
$dbh = new PDO('mysql:host=localhost;dbname=a20123456;charset=utf8', 'a20123456', 'secret');
$sth = $dbh->prepare('UPDATE users
SET display_name = :name
WHERE user_login = :login');
$values = array('name' => 'Philippe Caillat',
'login' => 'phil');
$sth->execute($values);
Corrigez ce code :
$sth = $dbh->prepare('UPDATE users
SET password = ' . $_POST['mdp'] .
' WHERE user_login = ' . $_SESSION['login']);
$sth->execute();
$dbh = new PDO('mysql:host=localhost;dbname=a20123456;charset=utf8', 'a20123456', 'secret');
$sth = $dbh->prepare('DELETE FROM films
WHERE title=:nom_film');
$values = array('nom_film' => 'La favorite');
$sth->execute($values);
Autres choses Ă savoir sur SQL :
AS
, GROUP BY
et HAVING
DATE
, TIME
...RĂ©visez ce cours avant les prochains TPs.
Maintenant vous savez tout ce qu'il vous faut pour faire un site web dynamique.