R213 – CM #3

DĂ©veloppement web S2


Rappel

  • Tableaux : structurer l'information.
  • Fonctions : structurer le code.
  • Beaucoup de fonctions internes et widgets pour les formulaires
  • Formulaire → validation → traitement

Examen

  • 22 mars
  • ThĂ©orique + 1 question de programmation
  • Une feuille A4 recto-verso manuscrite

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.

Brainstorming : que mettre dans une base de données ?

  • Utilisateurs : identifiant, mot de passe, date d'inscription
  • Commentaires : conteneur, auteur, contenu, date
  • Articles : texte, auteur, date
  • ...

BDD, SGBD, SQL

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

Structure d'une base de données

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

Chaque table contient des champs (colonnes, columns) et des entrées (lignes, rows).

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

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

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=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());
}

RequĂȘte SQL

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

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

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 ?

 

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)

Normalement, on les effectue durant le traitement d'un formulaire. Ensuite, on renvoie l'utilisateur vers une autre page avec la fonction header().

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

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

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=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 :

  • Fonctions SQL (scalaires et d'agrĂ©gat)
  • Mots-clĂ©s AS, GROUP BY et HAVING
  • Les types de dates : DATE, TIME ...
  • Les jointures (internes, externes Ă  gauche/droite)

À faire

RĂ©visez ce cours avant les prochains TPs.

Maintenant vous savez tout ce qu'il vous faut pour faire un site web dynamique.