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 ?
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.
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(); // 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');
?>
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);
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 d'écrire en SQL.
phpMyAdmin est installé dans notre serveur web. Il est sur a-pedagoarles-mmi.aix.univ-amu.fr/phpmyadmin
$dbh = new PDO('mysql:host=localhost;dbname=m2202_projet;charset=utf8',
'login',
'motdepasse');
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());
}
SELECT FROM
). Renvoie les résultatsINSERT INTO
)UPDATE
)DELETE FROM
)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>';
}
?>
Dans la validation d'un formulaire, vous devez vérifier si l'adresse email est déjà utilisée. Comment vous faites ?
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
Vous devez afficher le nombre de commentaires sur un film. Comment vous faites ?
$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)
$sth = $dbh->prepare('UPDATE users
SET display_name = :name
WHERE user_login = :login');
$values = array('name' => 'Philippe Caillat',
'login' => 'phil');
$sth->execute($values);
Corrigez ce code :
$sth = $dbh->prepare('UPDATE users
SET password = ' . $_POST['mdp'] .
' WHERE user_login = ' . $_SESSION['login']);
$sth->execute();
$sth = $dbh->prepare('DELETE FROM films
WHERE title=:nom_film');
$values = array('nom_film' => 'La favorite');
$sth->execute($values);
Autres choses Ă savoir sur SQL :
AS
, GROUP BY
et HAVING
DATE
, TIME
...RĂ©visez ce cours avant les prochains TDs.
Maintenant vous savez tout ce qu'il vous faut pour le projet.