M2202 – CM #3

Algorithmique et 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

  • 13 avril
  • ThĂ©orique + 1 question de programmation
  • Une feuille A4 recto-verso manuscrite si en physique, tous cours permis sinon

Sessions (et cookies)

On sait transmettre des variables entre les pages web avec les formulaires et les URLs ($_GET, $_POST).

Autre façon : sessions et cookies.

Pourquoi faire ?

  • Afficher notre identifiant sur chaque page
  • Savoir si on s'est identifiĂ©
  • PrĂ©-remplir un formulaire (carte bancaire, adresse e-mail)
  • Se rappeler des choix (langue des sous-titres, billet rĂ©servĂ©)

En commun : besoin d'envoyer une variable vers toutes les autres pages.

Exemple : on a un formulaire. S'il est bien rempli, on continue. Sinon, on montre le formulaire Ă  nouveau avec des messages d'erreur.

Différences

DuréeTaille
Sessioncourteillimitée
Cookielonguelimitée

Sessions

  • Au dĂ©but de chaque fichier PHP : session_start()
  • Variables stockĂ©es dans $_SESSION
  • Effacer la session : session_destroy()

Exemple

Voir les pages seulement si on est identifié

## index.php ##
<?php 
session_start(); // important : faire ceci avant la premiĂšre ligne de code HTML
if (!isset($_SESSION['login']))
  header('Location: login.html'); 
?>

<h1>Bienvenue</h1>
<a href="page1.php">Page 1</a>
<a href="page2.php">Page 2</a>
<a href="page3.php">Page 3</a>
<a href="logout.php">Logout</a>
## login.html ##
<form method="post" action="validation.php">
  <label for="mdp">Mot de passe :</label>
  <input id="mdp" type="password" name="mdp">
  <input type="submit" value="Envoyer">
</form>
## validation.php ##
<?php
session_start();
if ($_POST['mdp'] == '1234') {
  $_SESSION['login'] = true; // $_SESSION['login'] est défini maintenant
}
header('Location: index.php');
?>
## page1.php ##
<?php 
session_start();
if (!isset($_SESSION['login']))
  header('Location: login.html');
?>

<p>La page 1</p>
<a href="logout.php">Logout</a>
## logout.php ##
<?php
session_start();
session_destroy();
header('Location: index.php');
?>

Cookies

  • CrĂ©er un cookie :
    setcookie('nom', 'valeur', time() + 365*24*60*60);
  • StockĂ© dans : $_COOKIE['nom']
  • Modifier :
    setcookie('nom', 'valeur2', time() + 365*24*60*60);
    // $_COOKIE['nom'] = 'valeur2'; NON !!!
  • Effacer : setcookie('nom', NULL, -1);

Sessions et cookies : variables disponibles dans n'importe quelle page du site web.

Attention aux différences dans la création / modification / suppression.

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 BDD

Une BDD est formée de tables.

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

phpMyAdmin

On peut manipuler (voir, créer, modifier) une BDD 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

Connexion

$dbh = new PDO('mysql:host=localhost;dbname=m2202_projet;charset=utf8', 
               'login', 
               'motdepasse');
  • host : nom d'hĂŽte
  • 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=m2202td4exo1;charset=utf8', 'root', '');
// serveur local, avec MAMP
$dbh = new PDO('mysql:host=localhost;dbname=m2202td4exo1;charset=utf8', 'root', 'root');

// serveur externe MMI
$dbh = new PDO('mysql:host=localhost;dbname=a20123456;charset=utf8', 'a20123456', 'secret');

Encore mieux, avec affichage de messages d'erreur

try {
  $dbh = new PDO('mysql:host=localhost;dbname=m2202td4exo1;charset=utf8', 
                 'root', 
                 '', 
                 array(PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION));
} catch(Exception $e) {
  die('Erreur : ' . $e->getMessage());
}

RequĂȘtes SQL

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

Lire des entrées

  1. Se connecter
  2. Faire la requĂȘte
  3. Recupérer les résultats
  4. Les traiter

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) afficher les données
foreach ($result as $row) {
  echo '<p>';
  echo '<b>' . $row['name'] . '</b> ' . $row['bio'];
  echo '</p>';
}
?>

Exercice

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

RequĂȘte SQL avec des variables

Normalement, on utilise des variables dans une requĂȘte SQL.

//...
$sth = $dbh->prepare('SELECT title
                      FROM movies 
                      WHERE director = :real AND year = :annee');
$values = array('real'  => $directeur, 
                'annee' => $annee);
$sth->execute($values);
// ...

:real et :anne sont des marqueurs nominatifs

Exercice

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

Ajouter une entrée

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

On execute la requĂȘte SQL et c'est fini (pas de rĂ©sultats)

Modifier une entrée

$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

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

Conclusion

  • DonnĂ©es → formulaire → session, cookie ou BDD
  • Peu, simples, personnelles : session ou cookie
  • Sinon : BDD

À faire

RĂ©visez ce cours avant les prochains TDs.

Maintenant vous savez tout ce qu'il vous faut pour le projet.