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 ?
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 ?
On sait transmettre des variables entre les pages web avec les formulaires et les URLs ($_GET
, $_POST
).
Autre façon : sessions et cookies.
Pourquoi ?
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.
Durée | Taille | |
---|---|---|
Session | courte | illimitée |
Cookie | longue | limitée |
session_start()
$_SESSION
session_destroy()
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');
?>
setcookie('nom', 'valeur', time() + 365*24*60*60);
$_COOKIE['nom']
setcookie('nom', 'valeur2', time() + 365*24*60*60);
// $_COOKIE['nom'] = 'valeur2'; NON !!!
setcookie('nom', NULL, -1);
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.
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, 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).
Une BDD est formée de tables.
Chaque table contient des champs (colonnes, columns) et des entrées (lignes, rows).
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
$bdd = new PDO('mysql:host=localhost;dbname=m2202_projet;charset=utf8',
'login',
'motdepasse');
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
?>
// 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');
$req = $bdd->prepare('SELECT titre
FROM movies
WHERE director = :real AND year = :annee');
$donnes = array('real' => $directeur,
'annee' => $annee);
$req->execute($donnes);
$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);
$req = $bdd->prepare('UPDATE users
SET display_name = :name
WHERE user_login = :login');
$donnes = array('name' => 'Philippe Caillat',
'login' => 'phil');
$req->execute($donnes);
$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 :
AS
, GROUP BY
et HAVING
DATE
, TIME
...SELECT * FROM livres LIMIT 5, 10
SELECT * FROM wp_posts ORDER BY post_date LIMIT 15, 5 WHERE comment_count > 0
RĂ©visez ce cours avant le TD #5.
Travaillez sur le projet.