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

Brainstorming

On veut faire un programme dans une page web pour miner des bitcoins (faire de calculs complexes dans l'ordinateur du visiteur pour gagner de l'argent).

Quel langage de programmation utilisera-t-on ?

  • PHP
  • JavaScript
  • Aucun

Brainstorming

On veut faire un jeu d'aventure graphique sur le navigateur web, comme l'épisode « Black Mirror : Bandersnatch ».

Quel langage de programmation utilisera-t-on ?

  • PHP
  • JavaScript
  • Aucun

Examen

  • 17 mai
  • PHP seulement
  • Une feuille A4 recto-verso manuscrite

Mise Ă  niveau

  • SĂ©ances de rĂ©vision pratique → thĂ©orie
  • Questionnaire Ă  remplir

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 ?

  • 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Ă©)

On envoie une variable vers toutes les autres pages.

Cas pratique : 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();
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 type="password" name="mdp" id="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);

Question surprise : création d'un cookie

Mettez la bonne valeur dans la fonction

<?php
setcookie('max_score', 19.348, /* un mois */);
?>

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 de passer par SQL.

phpMyAdmin est installé dans notre serveur web. Il est sur a-pedagoarles-mmi.aix.univ-amu.fr/phpmyadmin

Connexion

$bdd = new PDO('mysql:host=localhost;dbname=m2202_projet;charset=utf8', 
               'login', 
               'motdepasse');
  • host : nom d'hĂŽte
  • dbname : le nom de la BDD

RequĂȘtes SQL

Effectuer une requĂȘte dans la BDD :

// prendre toutes les entrées de la table 'users'
$reponse = $bdd->query('SELECT * FROM users');

Pour extraire chaque entrĂ©e :

// $donnees est un tableau associatif contenant une entrée
$donnees = $reponse->fetch();

Exemple complet

<?php
// connexion Ă  la BDD
$bdd = new PDO('mysql:host=localhost;dbname=m2202_projet;charset=utf8', 
              'root', 
              '');
// requĂȘte SQL
$reponse = $bdd->query('SELECT * FROM users');
// afficher les données
while ($donnees = $reponse->fetch()) {
  echo '<p>';
  echo '<b>' . $donnees['name'] . '</b> ';
  echo $donnees['bio'];
  echo '</p>';
}
// terminer le traitement de la requĂȘte
$reponse->closeCursor();
?>

Exemple plus complet

<?php
try {
  /* On se connecte Ă  la BDD. 
   * Le dernier paramĂštre affiche des messages d'erreur faciles Ă  lire */
  $bdd = new PDO('mysql:host=localhost;dbname=test;charset=utf8', 
                 'root', 
                 '', 
                 array(PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION));
} catch(Exception $e) {
  /* En cas d'erreur, on affiche un message et on arrĂȘte tout, 
   * au lieu de montrer le code PHP */
  die('Erreur : ' . $e->getMessage());
}
// Si ça marche, on continue
// On récupÚre tout le contenu de la table 'users'
$reponse = $bdd->query('SELECT * FROM users');
// On affiche chaque entrée une à une
while ($donnees = $reponse->fetch()) {
  echo '<p>';
  echo '<b>' . $donnees['name'] . '</b> ';
  echo $donnees['bio'];
  echo '</p>';
}
$reponse->closeCursor(); // Termine le traitement de la requĂȘte
?>

Plus de requĂȘtes SQL

// charger seulement le contenu de deux champs de la table
$reponse = $bdd->query('SELECT name, bio 
                        FROM users');
// seulement les entrées avec commentaires
$reponse = $bdd->query('SELECT name, bio 
                        FROM users 
                        WHERE nb_commentaires > 0');
// entrées triées par date décroissante
$reponse = $bdd->query('SELECT name, bio 
                        FROM users 
                        WHERE nb_commentaires > 0
                        ORDER BY date_inscription DESC');
// seulement 5 entrées, commençant par l'entrée #15
$reponse = $bdd->query('SELECT name, bio 
                        FROM users 
                        WHERE nb_commentaires > 0
                        ORDER BY date_inscription DESC
                        LIMIT 15, 5');

RequĂȘte SQL avec des variables

$req = $bdd->prepare('SELECT titre
                      FROM movies 
                      WHERE director = :real AND year = :annee');
$donnes = array('real' => $directeur, 
                'annee' => $annee);
$req->execute($donnes);

Ajouter une entrée

$req = $bdd->prepare('INSERT INTO users(user_login, user_mail, display_name) 
                      VALUES(:login, :email, :name)');
$donnes = array('login' => $nom, 
                'email' => $adresse, 
                'name'  => $nom_prenom);
$req->execute($donnes);

Modifier une entrée

$req = $bdd->prepare('UPDATE users 
                      SET display_name = :name
                      WHERE user_login = :login');
$donnes = array('name' => 'Philippe Caillat',
                'login' => 'phil');
$req->execute($donnes);

Supprimer une entrée

$req = $bdd->prepare('DELETE FROM films 
                      WHERE title=:nom_film');
$donnes = array('nom_film' => 'La favorite');
$req->execute($donnes);

Il y a encore plus de 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)

Questionnaire vrai/faux

  1. On utilise une boucle for pour parcourir les entrées d'une table
  2. phpMyAdmin n'est pas un SGBD
  3. Cette requĂȘte SQL affiche les entrĂ©es 5-10 :
    SELECT * FROM livres LIMIT 5, 10
  4. Cette requĂȘte SQL est bien formatĂ©e :
    SELECT * FROM wp_posts ORDER BY post_date LIMIT 15, 5 WHERE comment_count > 0

Conclusion

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

À faire

RĂ©visez ce cours avant le TD #5.

Travaillez sur le projet.