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) : système qui enregistre des informations classées et structurées.
Système de gestion de base de données (SGBD) : 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) et des entrées (lignes)
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
Importez cette base de données dans votre serveur web local
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=nom_bdd;charset=utf8',
'root',
'');
?>
Exemple :
<?php
// (1) connexion à la BDD
$dbh = new PDO('mysql:host=localhost;dbname=nom_bdd;charset=utf8',
'root',
'');
// (2) requête SQL
$sth = $dbh->prepare('SELECT name, bio FROM users');
$sth->execute();
?>
Exemple :
<?php
// (1) connexion à la BDD
$dbh = new PDO('mysql:host=localhost;dbname=nom_bdd;charset=utf8',
'root',
'');
// (2) requête SQL
$sth = $dbh->prepare('SELECT name, bio FROM users');
$sth->execute();
// (3) résultats
$result = $sth->fetchAll();
?>
Exemple :
<?php
// (1) connexion à la BDD
$dbh = new PDO('mysql:host=localhost;dbname=nom_bdd;charset=utf8',
'root',
'');
// (2) requête SQL
$sth = $dbh->prepare('SELECT name, bio 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=nom_bdd;charset=utf8', 'root', '');
// serveur local, avec MAMP
$dbh = new PDO('mysql:host=localhost;dbname=nom_bdd;charset=utf8', 'root', 'root');
// serveur externe MMI (a-pedagoarles)
$dbh = new PDO('mysql:host=localhost;dbname=a22123456;charset=utf8', 'a22123456', 'secret');
// serveur externe AMU (pedaweb)
$dbh = new PDO('mysql:host=' . $_SERVER['dbHost'] . ';dbname=' . $_SERVER['dbBd'] . ';charset=utf8', $_SERVER['dbLogin'], $_SERVER['dbPass']);
Une fois connectés à la base de données, on lui envoie 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>';
?>
Faites une page qui affiche les prénoms de la table etudiants sous forme de liste à puces (<ul>
)
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
)
Utilisateurs + BDD = site web dynamique
Quand on modifie une base de données :
On envoie l'utilisateur directement vers une autre page avec la fonction header()
header('Location: index.html');
header('Location: pokemon.php?id=' . $pokemon);
On utilise cette fonction dans une page qui n'affiche rien
Les étapes sont :
Exemple :
$dbh = new PDO('mysql:host=localhost;dbname=a22012345;charset=utf8', 'a22012345', '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);
Ajoutez un formulaire pour ajouter des nouveaux prénoms.
$dbh = new PDO('mysql:host=localhost;dbname=a22012345;charset=utf8', 'a22012345', '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=a22012345;charset=utf8', 'a22012345', 'secret');
$sth = $dbh->prepare('DELETE FROM films
WHERE title=:nom_film');
$values = array('nom_film' => 'La favorite');
$sth->execute($values);
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 ?