Chapitre 4.
PHP-Partie 2-
Prof. Amina ADADI
2ème Année Génie Logiciel
1 Année universitaire 2019-2020
Persistance: Session & Cookies
2
COOKIES
Un cookie est un fichier petit (65 Ko maxi) que l'on stocke sur le
poste du visiteur.
Exemple :
Vous stockez le pseudo du visiteur. Lorsqu'il revient sur votre site,
vous pouvez lire dans le cookie et lui afficher "Bonjour
votre_pseudo".
Contrairement à certaines légendes, les cookies sont totalement
inoffensifs, ce ne sont pas des virus ou troyens ou je ne sais quoi !
3
COOKIES
Création des cookies
On utilise la fonction setcookie()
4
COOKIES
Attention
Plusieurs conditions sont à respecter afin que l'utilisation des cookies se passe au mieux :
1. l'envoie d'un cookie doit être la première fonction PHP que vous utilisez dans votre
script,
ce qui veut dire que vous devez utiliser la fonction setcookie() tout en haut de votre
script (AUCUN AFFICHAGE ET AUCUN CODE HTML AVANT UN SETCOOKIE)
2. Si d'autres fonctions interviennent avant l'envoi du cookie, celui-ci ne fonctionnera
pas.
3. Si vous envoyez un cookie sur un poste client, celui-ci effacera automatiquement
l'ancien cookie qui portait le même nom (si il y en avait un), autrement il le créera
4. Note : pour effacer un cookie, vous devez lancer un cookie qui aura le même nom
que le cookie que vous voulez effacer, tout en lui donnant une valeur nulle (vous
pouvez également l'envoyer avec un temps de vie dépassé).
5
COOKIES
Afficher un cookie
$_COOKIE['Nom_cookie']
Modifier un cookie
6
COOKIES
Supprimer un cookie
Pour supprimer un cookie , on utilise setcookie() avec une date d’expiration passée:
Vérifier si les cookies sont « enable »
7
COOKIES
Exemple: Sondage avec
vérification des votes
8
COOKIES
Exemple: Sondage avec
vérification des votes
9
SESSION
Intérêt
Aller plus loin que les cookies
Permettre à plusieurs pages de partager les mêmes données
Conserver plusieurs données lors d’une session
Ranger les données de la session sur le serveur
Sécuriser le passage des données vers le serveur en
Donnant un identifiant à la session
Cryptant l’identifiant
Disposer de plusieurs sessions et donner un nom à chacune
10
SESSION
Intérêt
Aller plus loin que les cookies
Permettre à plusieurs pages de partager les mêmes données
Conserver plusieurs données lors d’une session
Ranger les données de la session sur le serveur
Sécuriser le passage des données vers le serveur en
Donnant un identifiant à la session
Cryptant l’identifiant
Disposer de plusieurs sessions et donner un nom à chacune
11
SESSION
Les sessions en PHP permettent de sauvegarder des
variables de page en page pendant une certaine durée
prédéfinie par PHP (et modifiable bien entendu).
Chaque utilisateur ayant besoin des sessions se voit
attribuer un identifiant unique appelé ID de session. Cet
identifiant est stocké sur le poste de l'internaute sous
forme d'un cookie ou transite via l'URL si l'option
session.use_trans_sid est à 1 (ou On) dans le fichier
[Link].
12
SESSION
Démarrer une session
Avant d'utiliser les sessions sur une page, on doit toujours utiliser la fonction
session_start() placée avant tout envoi de code HTML, et donc généralement tout en
haut de votre page PHP :
Création une variable de session
13
SESSION
Exemple
14
SESSION
Durée de vie d’une session
Dés que l'on ferme le navigateur la session est détruite.
Sauf à configurer le fichier [Link] avec [Link] qui
fixe la durée de vie, en secondes, du cookie envoyé au client.
La valeur 0 signifie "jusqu'à ce que le client soit fermé". Par
défaut à 0.
Donc si on le laisse à zéro la session dure jusqu'à la
fermeture du navigateur, pour laisser les données durant 30
minutes, il faut remplacer 0 par 1800 (= 30 minutes * 60
secondes dans une minute). [Link] = 0
15
SESSION
Affichage id session
Lit et/ou modifie l'identifiant courant de session
Suppression d’une variable de session
• La commande session_unregister() supprime une variable dans la session
courante.
• Elle retourne TRUE si success, FALSE sinon.
• Il est aussi possible de purger toutes les variables de la session avec
• Si vous utilisez le tableau superglobale $_SESSION, il suffit alors d'utiliser unset()
16
SESSION
Fermeture d’une session
Fermeture conservatrice avec session_write_close
• La commande session_write_close() écrit les valeurs des variables de session sur le
serveur et ferme la session.
Fermeture destructive avec session_destroy
Si vous voulez détruire la session du visiteur, vous pouvez faire un lien "Déconnexion" qui
améne vers une page qui fait appel à la fonction session_destroy()
La commande session_destroy() détruit toutes les données enregistrées d'une session.
Cette derniére commande est la plus utilisée car n'impose aucune sauvegarde au serveur.
Retourne TRUE en cas de succés, et FALSE sinon.
17
SESSION
Exemple:
Commande en ligne
18
SESSION
Exemple: Commande en ligne
19
SESSION
Exemple:
Commande en ligne
20
Accès à la base de données
21
3 façons pour accéder à la BD
PHP propose plusieurs moyens de se connecter à une base de données MySQL.
L'extension mysql_ : ce sont des fonctions qui permettent d'accéder à une
base de données MySQL et donc de communiquer avec MySQL. Leur nom
commence toujours par mysql_. Toutefois, ces fonctions sont vieilles et on
recommande de ne plus les utiliser aujourd'hui.
•L'extension mysqli_ : ce sont des fonctions améliorées d'accès à MySQL (Le
« i » pour « improved » ).Elles proposent plus de fonctionnalités et sont plus à
[Link] y’a deux variation: MySQLi (object-oriented) et MySQLi (procedural)
•L'extension PDO : c'est un outil complet qui permet d'accéder à n'importe
quel type de base de données. On peut donc l'utiliser pour se connecter aussi
bien à MySQL que PostgreSQL ou Oracle
22
Scénario de communication
1. le serveur utilise toujours PHP, il lui fait donc passer le message
2. PHP effectue les actions demandées et se rend compte qu'il a besoin de MySQL. En effet, le code
PHP contient à un endroit « Va demander à MySQL d'enregistrer ce message ». Il fait donc
passer le travail à MySQL ;
3. MySQL fait le travail que PHP lui avait soumis et lui répond « O.K., c'est bon ! » ;
4. PHP renvoie au serveur que MySQL a bien fait ce qui lui était demandé
23
Classes prédéfinies PDO
PDO : connexion PHP / base de données
__construct()
exec(), prepare(), query()
errorCode(), errorInfo()
getAttributes(), setAttribute()
lastInsertId(), quote()
beginTransaction()
commit(), rollBack()
getAvailableDrivers()
24
Classes prédéfinies PDO
PDOStatement : requête préparée, jeu de résultats
bindColumn(), bindParam(), bindValue(),
closeCursor()
errorCode(), errorInfo()
fetch(), fetchAll(), fetchColumn(),
fetchObject(), setFetchMode(),
nextRowset()
rowCount(), columnCount(), getColumnMeta()
getAttribute(), setAttribute()
execute()
debugDumpParams()
25
fonctions de l'extension MySQLi
Interface POO Interface procédural Description
Ouvre une connexion à un
mysqli::__construct() mysqli_connect()
serveur MySQL
Sélectionne une base de
mysqli::select_db() mysqli_select_db() données par défaut pour
les requêtes
Exécute une requête sur la
mysqli::query() mysqli_query()
base de données
Le nombre de lignes dans
$mysqli_result::num_rows mysqli_num_rows()
un résultat
Retourne une ligne de
résultat sous la forme d'un
mysqli_result::fetch_array() mysqli_fetch_array()
tableau associatif, d'un
tableau indexé, ou les deux
mysqli::close() mysqli_close() Ferme une connexion
26
Principales opération sur la base de données
CONNEXION
EFFECTUER DES REQUÊTES
LES REQUÊTES PRÉPARÉES
27
Connexion
MySQLi Object-Oriented
<?php
$servername = "localhost";
$username = "username";
$password = "password";
// Création de connexion
$conn = new mysqli($servername, $username, $password);
// Vérification de la connexion
if ($conn->connect_error) {
die("Connection failed: " . $conn->connect_error);
}
echo "Connected successfully";
?
28
Connexion
MySQLi Procedural
<?php
$servername = "localhost";
$username = "username";
$password = "password";
// Création de connexion
$conn = mysqli_connect($servername, $username,
$password);
// Vérification de la connexion
if (!$conn) {
die("Connection failed: " . mysqli_connect_error());
}
echo "Connected successfully";
?
29
Connexion
PDO
<?php
$servername = "localhost";
$username = "username";
$password = "password";
try {
$conn = new PDO("mysql:host=$servername;dbname=myDB",
$username, $password);
// Le mode PDO error est a réglé a EXCEPTION
$conn->setAttribute(PDO::ATTR_ERRMODE,
PDO::ERRMODE_EXCEPTION);
echo "Connected successfully";
}
catch(PDOException $e)
{
echo "Connection failed: " . $e->getMessage();
}
?>
30
Connexion
Fermeture de la connexion
MySQLi Object-Oriented:
$conn->close();
MySQLi Procedural:
mysqli_close($conn);
PDO:
$conn = null;
31
EFFECTUER DES REQUÊTES
PDO distingue 2 types de requêtes :
les requêtes de sélection : SELECT > query($requete)/
mysqli_query($requete)
les requêtes de modification insertion: UPDATE – INSERT – DELETE >
exec($requete)/ mysqli_query($requete)
La différence entre ces deux méthodes est que query() retournera un jeu de
résultats sous la forme d'un objet PDOStatement pour PDO
Alors que exec() retournera uniquement le nombre de lignes affectées. En
d'autres termes, vous utiliserez query() pour des requêtes de sélection
(SELECT) et exec() pour des requêtes d'insertion (INSERT), de modification
(UPDATE) ou de suppression DELETE)
32
EFFECTUER DES REQUÊTES
Requête SQL retournant une seule ligne
PDO mysqli
$query = 'SELECT * FROM salaries $query = 'SELECT * FROM salaries
WHERE where id=1;';
id=1;'; $result = mysqli_query($conn,$query);
$ligne = $pdo->query($query) $ligne = mysqli_fetch_assoc($result);
->fetch();
Requête SQL retournant plusieurs lignes
$query = 'SELECT * FROM salaries;'; $query = 'SELECT * FROM salaries;';
$liste = $pdo->query($query) $result = mysqli_query($conn,$query);
->fetchAll(); $liste = array();
while($ligne= mysqli_fetch_assoc($resu
lt)){
$liste[] = $ligne ;
}
Requête d'insertion, de modification ou de suppression
$query = 'DELETE FROM salaries WHERE $query = 'DELETE FROM salaries WHERE
id=2;'; id=2;';
$rowCount = $pdo->exec($query); mysqli_query(sconn,$query);
$rowCount = mysq l i_affected_rows();
33
LES REQUÊTES PREPAREES
Le principe est de préparer un « moule » de requête et de placer des place holders
aux endroits où l'on voudra insérer nos valeurs dynamiques.
Vous avez une requête avec des place holders (les points d'interrogation) :
$requete ='DELETE FROM salaries WHERE idsalaries = ?';
Le SGBD va préparer (interpréter, compiler et stocker temporairement son "plan
d'exécution logique" ) la requête.
PDO et Mysqli
$stmt = $conn->prepare($requete)
34
LES REQUÊTES PREPAREES
Une fois préparé, et lors de l’exécution il faut d’abord binder les paramètre . C-à-d, Il
faudra associer des valeurs aux place holders, qui agissent un peu comme des
variables $stmt->bind_param. Ensuite on exécute la requête préparée : $stm-
>execute() ;
Mysqli
$stmt = $conn->prepare("INSERT INTO MyGuests
(firstname, lastname, email) VALUES (?, ?, ?)");
$stmt->bind_param("sss", $firstname, $lastname,
$email);
// affecter les paramètre et exécuter
$firstname = « ahmad";
$lastname = « ahmadi";
$email = « ahmadi@[Link]";
$stmt->execute();
L’argument "sss" liste le type de données des paramètres. “S” veut dire string, i -
integer d - double
35
LES REQUÊTES PREPAREES
PDO
// bind parameters
$stmt = $conn->prepare("INSERT INTO MyGuests
(firstname, lastname, email)
VALUES (:firstname, :lastname, :email)");
$stmt->bindParam(':firstname', $firstname);
$stmt->bindParam(':lastname', $lastname);
$stmt->bindParam(':email', $email);
// exécuter
$firstname = « ahmad";
$lastname = « ahmadi";
$email = « ahmadi@[Link]";
$stmt->execute();
36
LES REQUÊTES PREPAREES
Exemple complet PDO
<?php
$servername = "localhost";
$username = "username";
$password = "password";
$dbname = "myDBPDO";
try {
$conn = new PDO("mysql:host=$servername;dbname=$dbname", $username,
$password);
// set the PDO error mode to exception
$conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
// prepare sql and bind parameters
$stmt = $conn->prepare("INSERT INTO MyGuests (firstname, lastname, email)
VALUES (:firstname, :lastname, :email)");
$stmt->bindParam(':firstname', $firstname);
$stmt->bindParam(':lastname', $lastname);
$stmt->bindParam(':email', $email);
37
LES REQUÊTES PREPAREES
Exemple complet PDO
// insert a row
$firstname = " Meryem ";
$lastname = " ALAMI ";
$email = " Meryem @[Link]";
$stmt->execute();
// insert another row
$firstname = "salim";
$lastname = "slimi";
$email = " salim @[Link]";
$stmt->execute();
echo "New records created successfully";
}
catch(PDOException $e)
{
echo "Error: " . $e->getMessage();
}
$conn = null;
?>
38
LES REQUÊTES PREPAREES
Exemple complet mysqli
<?php
$servername = "localhost";
$username = "username";
$password = "password";
$dbname = "myDB";
// Create connection
$conn = new mysqli($servername, $username, $password, $dbname);
// Check connection
if ($conn->connect_error) {
die("Connection failed: " . $conn->connect_error);
}
// prepare and bind
$stmt = $conn->prepare("INSERT INTO MyGuests (firstname, lastname, email) VALUES (?,
?, ?)");
$stmt->bind_param("sss", $firstname, $lastname, $email);
39
LES REQUÊTES PREPAREES
Exemple complet mysqli
// set parameters and execute
$firstname = "John";
$lastname = "Doe";
$email = "john@[Link]";
$stmt->execute();
$firstname = "Mary";
$lastname = "Moe";
$email = "mary@[Link]";
$stmt->execute();
$firstname = "Julie";
$lastname = "Dooley";
$email = "julie@[Link]";
$stmt->execute();
echo "New records created successfully";
$stmt->close();
$conn->close();
?>
40
Pour aller plus loin dans PHP
Accès au système de fichier
Gestion des dates calendrier
Gestion dynamique des images
Gestion des chaines de caractère et expression
régulière
41