R213 – TD #1

Développement web S2


Bases de données

Site web dynamique = beaucoup de données :

  • Horaires des trains de la SNCF
  • Articles du Monde
  • Posts sur Facebook
  • Vidéos sur YouTube

On n'écrit pas ces données dans des tableaux dans les fichiers PHP

BDD, SGBD, SQL

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)

Structure d'une base de données

Une base de données est formée de tables.

Chaque table contient des champs (colonnes) et des entrées (lignes)

Requêtes SQL

  • Lire (SELECT FROM). Renvoie les résultats
  • Ajouter (INSERT INTO)
  • Modifier (UPDATE)
  • Supprimer (DELETE FROM)

phpMyAdmin

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

Exercice 1

Importez cette base de données dans votre serveur web local

Bases de données avec PDO

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

Lire des données

Un fichier PHP qui affiche les données d'une base de données doit :

  1. se connecter à la base de données
  2. faire la requête SQL
  3. récupérer les résultats
  4. les afficher

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>';
}
?>

Connexion

On doit se connecter à une base de données avec un compte utilisateur. Il faut :

  • L'adresse URL du serveur de la base de données (hôte)
  • Le nom de la base de données
  • L'identifiant de l'utilisateur
  • Le mot de passe

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');
  • host : nom d'hôte. C'est localhost normalement
  • dbname : le nom de la BDD

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']);

Requête SQL

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
// ...

Requête SQL avec des variables

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

Récupérer le résultat

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 :

  • Un tableau numéroté, avec un élément pour chaque ligne de la base de données
  • Chaque élément est un tableau associatif, avec un élément pour chaque colonne. La clé est le nom de la colonne.

Afficher le résultat

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>';
?>

Exercice 2

Faites une page qui affiche les prénoms de la table etudiants sous forme de liste à puces (<ul>)

Bref

  • Connexion → requête → récupération → affichage
  • Deux mots-clé de PHP que vous ne maîtrisez pas : new et ->. C'est la programmation orientée objet
  • Attention aux plusieurs variables : $dbh (connexion), $sth (requête), $values (variables de la requête), $result (résultat)

Autres requêtes SQL

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 :

  1. Formulaire : définir l'information
  2. Validation
  3. Traitement : faire la modification dans la base de données (insertion, modification ou suppression)
  4. Redirection : envoyer l'utilisateur vers une autre page

Ajouter une entrée

Les étapes sont :

  1. se connecter à la base de données
  2. faire la requête SQL préparée

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);

Exercice 3

Ajoutez un formulaire pour ajouter des nouveaux prénoms.

Modifier une entrée

  1. se connecter à la base de données
  2. faire la requête SQL préparée
$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);

Exercice

Corrigez ce code :

$sth = $dbh->prepare('UPDATE users 
                      SET password = ' . $_POST['mdp'] . 
                      ' WHERE user_login = ' . $_SESSION['login']);
$sth->execute();
 

Supprimer une entrée

  1. se connecter à la base de données
  2. faire la requête SQL préparée
$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);

Exercice

Dans la validation d'un formulaire, vous devez vérifier si l'adresse email est déjà utilisée. Comment vous faites ?

 

Exercice

Vous devez afficher le nombre de commentaires sur un film. Comment vous faites ?