Académique Documents
Professionnel Documents
Culture Documents
PARTIE II
L’interactivité
en PHP
Formulaire HTML
Retourne des informations saisies par un utilisateur vers une application serveur
3
PHP et les formulaires
</select>
</select>
4
PHP et les formulaires
– La méthode GET place les informations d'un formulaire directement à la suite de l'adresse URL de
la page appelée.
• http://www.site.com/cible.php?champ=valeur&champ2=valeur
• inconvénients :
- De plus, la longueur totale est limitée à 255 caractères, ce qui rend impossible la
transmission d’un volume de données important
PARTIE 2
– La méthode POST regroupe les informations dans l'entête d'une requête HTTP
6
PHP et les formulaires
7
PHP et les formulaires
<?php
echo $resultat;
?>
8
PHP et les formulaires
Une validation côté serveur, en PHP, va donc également s’imposer pour filtrer les données potentiellement
dangereuses.
Le PHP nous offre différentes options pour sécuriser nos formulaires en testant la validité des données envoyées : on
va pouvoir utiliser des fonctions, des filtres, des expressions régulières, etc.
La première fonction que vous devez absolument connaitre est la fonction htmlspecialchars(). Cette fonction va
permettre d’échapper certains caractères spéciaux comme les chevrons « < » et « > » en les transformant en entités
HTML. En échappant les chevrons, on se prémunit d’une injection de code JavaScript puisque les balises <script> et
</script> vont être transformées en & <script> et &/<script> et ne vont donc pas être exécutées par le navigateur.
PARTIE 2
La deuxième fonction est stripslashes() qui va supprimer les antislashes que certains hackers pourraient utiliser pour
échapper des caractères spéciaux. La troisième fonction est trim() qui va supprimer les espaces inutiles
10
PHP et les formulaires
Ou bien on peut créer une fonction personnalisée qui va se charger d’exécuter chacune
des fonctions ci-dessus :
$nom = valid_donnees($_POST["nom"]);
PARTIE 2
function valid_donnees($donnees){
$donnees = trim($donnees);
$donnees = stripslashes($donnees);
$donnees = htmlspecialchars($donnees);
return $donnees;
} 11
Les cookies
Principe
Un cookie est un fichier texte créé par un script et stocké sur l’ordinateur des visiteurs
d’un site
Les cookies permettent de conserver des renseignements utiles sur chaque utilisateur,
et de les réutiliser lors de sa prochaine visite
Les cookies étant stockés sur le poste client, l’identification est immédiate et ne
concernent que les renseignements qui le concernent
12
Les cookies
précédents visites
13
Les cookies
if (!$_COOKIE["premierCookie"]) {
echo "le cookie n’a pas été défini";}
else {
PARTIE 2
14
Les cookies
Écriture de cookies
15
Les cookies
Lecture de cookies
Il faut d’abord vérifier l’existence des variables dont les noms et les valeurs ont
été définis lors de la création du cookie.
<?php
if (isset($_COOKIE["premierCookie"])){
PARTIE 2
}
?>
16
Les cookies
$col="#FF0000";
$size=24;
$font="Arial";
$text="Je suis le cookie";
PARTIE 2
17
Les cookies
$arr=explode("&", $_COOKIE["la_cookie"]);
echo "<b> ces variables ont été établies à partir de la chaîne cookie : </b> <br>
<br>";
18
Les cookies
Supprimer un cookie
setcookie("Visites");
Une autre méthode consiste à envoyer un cookie dont la date d'expiration est
passée:
PARTIE 2
setcookie("Visites","",time()-1 )
19
Les sessions
Principe
20
Les sessions
si ce n’est pas le cas, elle démarre une nouvelle session en créant un nouvel
ID de session.
21
Les sessions
Vous pouvez stocker toutes vos données de session sous forme de paires clé-valeur dans
le tableau $_SESSION[]. Les données stockées sont accessibles pendant la durée de vie
d’une session. Considérons le script suivant, qui crée une nouvelle session et enregistre
deux variables de session.
<?php
// Démarrer la session
session_start();
$_SESSION["nom"] = "Jean";
PARTIE 2
$_SESSION["adresse"] = "Paris";
?>
22
Les sessions
Pour accéder aux données de session que nous avons définies dans l’exemple ci-dessus depuis
n’importe quelle autre page, il suffit de recréer la session en appelant session_start() puis de
passer la clé correspondante au tableau associatif $_SESSION.
<?php
// Démarrer la session
session_start();
?>
23
Les sessions
session_start();
if(isset($_SESSION["adresse"])){
unset($_SESSION["adresse"]);
Pour supprimer toutes les variables de session globales et détruire la session, utilisez
session_unset() et session_destroy() :
PARTIE 2
24
Les sessions
Exemple d’authentification
Nous allons créer un système de connexion simple en utilisant PHP . Nous allons créer un formulaire
de connexion, ainsi qu’une page d’accueil et un script de déconnexion.
Créons un autre fichier PHP appelé « auth.php » et y mettons le code d’exemple suivant. Cet
exemple de code va créer un formulaire web qui permet aux utilisateurs de s’authentifier.
25
Les sessions
Exemple d’authentification
Les entrées seront vérifiées par rapport aux informations d’identification stockées dans la
base de données. Si le nom d’utilisateur et le mot de passe correspondent, l’utilisateur est
autorisé et se voit accorder l’accès au site, sinon la tentative de connexion sera rejetée.
<?php
session_start();
@ $login=$_POST["login"];
@ $mdp=crypt($_POST["password"], '$1$rasmusle$');
@ $submit=$_POST["submit"];
$_SESSION["login"]=$login;
$erreur='';
if (isset($submit)){
if($login=="alae" && $mdp=='$1$rasmusle$uwzLzKVWDEpvbNytWXBmS/'){
PARTIE 2
$_SESSION["autoriser"]="ok";
header("location:accueil.php");//header est une fonction qui renvoie les entêtes http
}else{ $erreur="login ou mot de passe incorrect"; echo $erreur; }
}
?>
26
Les sessions
Exemple d’authentification
Créer la page d’accueil
Voici le code de notre fichier « accueil.php », où l’utilisateur est redirigé après une connexion réussie.
<?php
// Initialiser la session
session_start();
// Vérifiez si l'utilisateur est connecté, sinon redirigez-le vers la page de
connexion
if(!isset($_SESSION["autoriser"])){
header("Location: auth.php");
exit(); //arret prematurer
}
?>
<h1>Bienvenue <?php echo $_SESSION['login']; ?>!</h1>
<p>C'est votre page d'accueil.</p>
PARTIE 2
<a href="deconnection.php">Déconnexion</a>
</div>
</body>
</html>
27
Les sessions
Exemple d’authentification
Maintenant, créons le fichier « deconnection.php ». Lorsque l’utilisateur clique sur le lien de déconnexion, le
script à l’intérieur de ce fichier détruit la session et redirige l’utilisateur vers la page de connexion.
<?php
// Initialiser la session
session_start();
// Détruire la session.
if(session_destroy())
header("Location: auth.php");
?>
28
Connexion à une base de données MySQL
avec PHP PDO
Le SGBD le plus connu pour accompagner le langage PHP est MySQL. Cependant, PHP peut aussi
dialoguer avec plusieurs autres SGBD comme PostgreSQL, Oracle, SQL Server...
jusqu'à la version 5 de PHP, la connexion à une base de données (en particulier MySQL) se faisait d'une
manière transparente grâce à des fonctions du genre mysql_connect(), mysql_select_db(),
mysql_query()... Ces fonctions marchent encore sur les dernières versions PHP5.x (y compris PHP5.6),
mais elles sont rendues obsolètes à partir de PHP5.5. A la sortie de PHP7 elles ont été supprimées.
Bien que ces fonctions marchaient très bien, leurs limites n'ont pas mis beaucoup de temps pour se
PARTIE 2
manifester, en particulier quand on souhaite migrer vers un SGBD autre que MySQL.
29
Connexion à une base de données MySQL
avec PHP PDO
PDO signifie PHP Data Objects. Il s'agit d'une interface qui permet au scripts PHP d’interroger une base
de données via des requêtes SQL.
PDO est une extension qui s'ajoute au PHP pour que ses différentes fonctionnalités soient disponibles
dans le langage. Il constitue une interface d'abstraction de la base de données, c'est à dire qu'on peut
utiliser l'ensemble de ses fonctions pour exécuter des requêtes SQL quelque soit le SGBD. Autrement
dit, si l'application Web repose sur le SGBD MySQL, on peut migrer vers le SGBD PostgreSQL sans
modifier le code source (quelques modifications mineurs sont requises).
PARTIE 2
30
Connexion à une base de données MySQL
avec PHP PDO
Le bon fonctionnement de PDO repose sur la disponibilité du pilote de la base de données. Il faut que
celui-ci soit pris en charge pour pouvoir interroger le SGBD souhaité.
Pour déclarer le pilote du SBGD MySQL par exemple, il faut aller dans le fichier php.ini et ajouter la
ligne suivante (si elle n'est pas déjà déclarée):
extension = php_pdo_mysql.dll
extension = php_pdo.dll
31
Connexion à une base de données MySQL
avec PHP PDO
Nous allons pouvoir créer une nouvelle base de données avec PDO en PHP en utilisant la requête SQL CREATE DATABASE
suivie du nom que l’on souhaite donner à notre base de données.
Note : A partir de maintenant, nous allons commencer à découvrir et à utiliser le langage SQL. Comme nous l’avons
expliqué précédemment, nous allons envoyer nos requêtes SQL via PDO en PHP.
Pour exécuter une requête SQL en PDO, nous allons devoir utiliser la méthode exec() qui va prendre en paramètre une
requête SQL.
<?php
$host='localhost';$username = 'root';$password = '';
try{//dsn
$pdo = new PDO("mysql:host=$host", $username, $password);
$sql = "CREATE DATABASE maBase";
$pdo->exec($sql); // PDO::exec() - Exécute une requête SQL et retourne le nombre de lignes affectées
PARTIE 2
catch(PDOException $e){
echo "Erreur : " . $e->getMessage();
}
?>
32
Connexion à une base de données MySQL
avec PHP PDO
Les connexions sont établies en créant des instances de la classe de base de PDO. Peu importe quel pilote vous voulez
utiliser ; vous utilisez toujours le nom de la classe PDO. Le constructeur accepte des paramètres pour spécifier la
source de la base de données (connue en tant que DSN) et optionnellement, le nom d'utilisateur et le mot de passe
(s'il y en a un).
<?php
?>
33
Connexion à une base de données MySQL
avec PHP PDO
Lorsque la connexion à la base de données a réussi, une instance de la classe PDO est retournée à votre script. La
connexion est active tant que l'objet PDO l'est. Pour clore la connexion, vous devez détruire l'objet en vous assurant
que toutes ses références sont effacées. Vous pouvez faire cela en assignant null à la variable gérant l'objet. Si vous ne
le faites pas explicitement, PHP fermera automatiquement la connexion lorsque le script arrivera à la fin.
// et maintenant, fermez-la !
$sth = null;
PARTIE 2
$dbh = null;
34
Connexion à une base de données MySQL
avec PHP PDO
Une table de base de données a son propre nom unique et se compose de colonnes et de lignes.
Pour créer une nouvelle table dans une base de données, on utilise l’instruction CREATE TABLE. L’instruction SQL
suivante crée la table « Users »:
address VARCHAR(250)
)
PARTIE 2
Nous exécutons cette instructions SQL pour créer la table « Users » via un outil en ligne de commande ou un outil
d’interface graphique MySQL.
35
Connexion à une base de données MySQL
avec PHP PDO
//Nous avons créé une connexion à la base de données MySQL en instanciant une instance
de la classe PDO et en transmettant l’argument $dsn à son constructeur.
//Ensuite, nous avons spécifié l’instruction SQL qui crée la table « Users ».
$msg = '';
Insérer des données dans une table MySQL avec PHP PDO
Le formulaire pour insérer des données dans une table MySQL avec PHP PDO.
<!DOCTYPE html>
<html>
<head>
<title>Insérer des données dans la table Users</title>
</head>
<body>
<form action="process.php" method="post">
<p>Nom: <input type="text" name="firstname"></p>
<p>Prenom:<input type="text" name="lastname"></p>
<p><input type="submit" name="insert" value="Insérer"></p>
</form>
</body>
PARTIE 2
</html>
37
Connexion à une base de données MySQL
avec PHP PDO
Insérer des données dans une table MySQL avec PHP PDO
Script pour insérer des données dans une table MySQL avec PHP PDO
insérer des données dans la table « Users » dans la base de données « test »
<?php
$host = 'localhost';
$dbname = 'test';
$username = 'root';
$password = '';
if(isset($_POST['insert'])){
try {
// se connecter à mysql
$pdo = new PDO("mysql:host=$host;dbname=$dbname","$username","$password");
} catch (PDOException $exc) {
echo $exc->getMessage();
exit();
PARTIE 2
}
// récupérer les valeurs
$firstname = $_POST['firstname'];
$lastname = $_POST['lastname'];
38
Connexion à une base de données MySQL
avec PHP PDO
Insérer des données dans une table MySQL avec PHP PDO
Script pour insérer des données dans une table MySQL avec PHP PDO
insérer des données dans la table « Users » dans la base de données « test »
$res = $pdo->prepare($sql);
$exec = $res->execute(array(":firstname"=>$firstname,":lastname"=>$lastname));
// vérifier si la requête d'insertion a réussi
if($exec){
echo 'Données insérées';
}else{
PARTIE 2
39
Connexion à une base de données MySQL
avec PHP PDO
try{
$pdo = new PDO($dsn, $username, $password);
//PDO::query() prépare et exécute une requête SQL en un seul appel de fonction,
retournant la requête en tant qu'objet PDOStatement.
$stmt = $pdo->query($sql);
}
}catch (PDOException $e){
echo $e->getMessage();
}
?>
40
Connexion à une base de données MySQL
avec PHP PDO
Pour toutes les requêtes renvoyant des données autres que le nombre d'enregistrements concernés, nous allons utiliser
query().
Cette fonction ne renvoit pas directement les données prêtes à être affichées mais un sous objet PDO qui dispose de 2
méthodes permettant de manipuler ces données.
Méthode fetchAll() : Toutes les données sont rangées dans un tableau et le SGBD est libéré. Avantage : nous avons toutes
les données d'un coup et pouvons travailler dessus. Inconvénient : toutes les données sont présentes en mémoire.
PARTIE 2
Méthode fetch() : Les résultats sont lus de manière séquentielle, un par un. Avantage : parfait pour traiter des résultats
très nombreux sans surcharger la mémoire. Inconvénient : on ne peut pas faire d'autres requêtes pendant le traitement
de ces résultats.
41
Connexion à une base de données MySQL
avec PHP PDO
PDOStatement::fetch
Récupère une ligne depuis un jeu de résultats associé à l'objet PDOStatement. Le paramètre mode détermine la façon
dont PDO retourne la ligne.
</tr>
<?php endwhile; ?>
42
Connexion à une base de données MySQL
avec PHP PDO
<?php
$row = $stmt->fetchAll();
<tr>
</tr>
<?php
} ?>
43
Connexion à une base de données MySQL
avec PHP PDO
Contrôle comment la prochaine ligne sera retournée à l'appelant. Cette valeur doit être une des constantes
PDO::FETCH_*, et par défaut, vaut la valeur de PDO::ATTR_DEFAULT_FETCH_MODE (qui vaut par défaut la valeur de la
constante PDO::FETCH_BOTH).
PDO::FETCH_ASSOC: retourne un tableau indexé par le nom de la colonne comme retourné dans le jeu de résultats
PDO::FETCH_BOTH (défaut): retourne un tableau indexé par les noms de colonnes et aussi par les numéros de
colonnes, commençant à l'index 0, comme retournés dans le jeu de résultats
PDO::FETCH_BOUND: retourne true et assigne les valeurs des colonnes de votre jeu de résultats dans les variables
PHP à laquelle elles sont liées avec la méthode PDOStatement::bindColumn()
PDO::FETCH_CLASS: retourne une nouvelle instance de la classe demandée, liant les colonnes du jeu de résultats aux
noms des propriétés de la classe et en appelant le constructeur par la suite, sauf si PDO::FETCH_PROPS_LATE est
également donné. Si fetch_style inclut PDO::FETCH_CLASS (c'est-à-dire PDO::FETCH_CLASS | PDO::FETCH_CLASSTYPE),
alors le nom de la classe est déterminé à partir d'une valeur de la première colonne.
PARTIE 2
PDO::FETCH_INTO : met à jour une instance existante de la classe demandée, liant les colonnes du jeu de résultats
aux noms des propriétés de la classe
44
Connexion à une base de données MySQL
avec PHP PDO
PDO::FETCH_LAZY : combine PDO::FETCH_BOTH et PDO::FETCH_OBJ, créant ainsi les noms des variables de l'objet,
comme elles sont accédées
PDO::FETCH_NAMED : retourne un tableau de la même forme que PDO::FETCH_ASSOC, excepté que s'il y a plusieurs
colonnes avec les mêmes noms, la valeur pointée par cette clé sera un tableau de toutes les valeurs de la ligne qui a ce
nom comme colonne
PDO::FETCH_NUM : retourne un tableau indexé par le numéro de la colonne comme elle est retourné dans votre jeu
de résultat, commençant à 0
PDO::FETCH_OBJ : retourne un objet anonyme avec les noms de propriétés qui correspondent aux noms des
colonnes retournés dans le jeu de résultats
PDO::FETCH_PROPS_LATE : lorsqu'il est utilisé avec PDO::FETCH_CLASS, le constructeur de la classe est appelé avant
que les propriétés ne soient assignées à partir des valeurs de colonne respectives.
PARTIE 2
45
Connexion à une base de données MySQL
avec PHP PDO
Nous allons utiliser l’instruction SQL UPDATE suivie du nom de la table pour mettre à jour des données dans une table.
Cette instruction va toujours être accompagnée de SET qui va nous servir à préciser la colonne à mettre à jour ainsi
que la nouvelle valeur pour la colonne.
En s’arrêtant là, en effet, nous allons mettre à jour toutes les valeurs d’une colonne d’un coup ! Ce sera très rarement
ce que nous voudrons faire en pratique, et c’est pour cela que nous allons généralement également utiliser la clause
WHERE pour spécifier quelles entrées doivent être mises à jour.
PARTIE 2
46
Connexion à une base de données MySQL
avec PHP PDO
lastname = :lastname,
address = :address
WHERE id = :id";
$stmt = $pdo->prepare($sql);
$stmt->execute();
47
Connexion à une base de données MySQL
avec PHP PDO
Pour supprimer des données d’une table, nous allons utiliser l’instruction SQL DELETE FROM.
Pour préciser quelles entrées doivent être supprimées, nous allons accompagner DELETE FROM d’une clause WHERE
nous permettant de cibler des données en particulier dans notre table.
48
Connexion à une base de données MySQL
avec PHP PDO
Pour modifier la structure d’une table en soi, nous allons utiliser l’instruction SQL ALTER TABLE.
Cette commande va nous permettre d’ajouter, de supprimer ou de modifier une colonne dans une table.
Pour ajouter une colonne, nous allons également devoir utiliser ADD avec le nom de la colonne à ajouter et le type de
données attendu.
$sql = "
ALTER TABLE Users
ADD DateInscription TIMESTAMP
";
PARTIE 2
$pdo->exec($sql);
echo 'Colonne ajoutée';
49
Connexion à une base de données MySQL
avec PHP PDO
Pour maintenant supprimer une colonne dans une table, nous allons cette fois-ci utiliser ALTER TABLE de concert avec
l’instruction DROP COLUMN.
En revanche, il n’y a bien évidemment pas besoin de préciser le type de données de la colonne lorsqu’on souhaite la
supprimer.
$sql = "
ALTER TABLE Users
PARTIE 2
$pdo->exec($sql);
echo 'Colonne supprimée';
50
Connexion à une base de données MySQL
avec PHP PDO
Pour finalement modifier le type de donnée d’une colonne dans une table, il faudra utiliser ALTER TABLE avec
l’instruction MODIFY COLUMN
$sql = "
ALTER TABLE Users
MODIFY COLUMN firstname VARCHAR(100)
";
$pdo->exec($sql);
echo 'Colonne modifier';
PARTIE 2
51
Connexion à une base de données MySQL
avec PHP PDO
Pour copier une table dans une autre, ceci peut être fait en MySQL en deux étapes. La première consiste à copier la
structure de la table et la deuxième consiste à remplir les données avec la table d’origine.
$table = 'users';
//Le nom de la nouvelle table.
$newTable = 'utilisateur';
//Copier la structure de la table
$pdo->exec("CREATE TABLE $newTable LIKE $table");
//Copier les données dans la nouvelle table
$pdo->exec("INSERT $newTable SELECT * FROM $table");
PARTIE 2
52
Connexion à une base de données MySQL
avec PHP PDO
Récapitulatif
Dans le contexte de PHP PDO (PHP Data Objects), "exec", "execute" et "query" sont trois méthodes utilisées pour
interagir avec les bases de données.
"exec" est une méthode utilisée pour exécuter une instruction SQL qui ne renvoie pas de données, telle qu'une
instruction INSERT, UPDATE ou DELETE. La méthode renvoie le nombre de lignes affectées par l'instruction exécutée.
"execute" est une méthode utilisée pour exécuter une instruction SQL qui peut ou non renvoyer des données, telle
qu'une instruction SELECT ou un appel de procédure stockée. La méthode prépare l'instruction pour l'exécution, lie
tous les paramètres, puis exécute l'instruction. La méthode renvoie un objet PDOStatement qui peut être utilisé pour
récupérer toutes les lignes résultantes.
"query" est une méthode utilisée pour exécuter une instruction SQL SELECT qui renvoie une ou plusieurs lignes de
données. La méthode prépare l'instruction pour l'exécution et l'exécute. La méthode renvoie un objet PDOStatement
PARTIE 2
En résumé, "exec" est utilisé pour les instructions SQL qui ne renvoient pas de données, "execute" est utilisé pour les
instructions SQL qui peuvent ou non renvoyer des données, et "query" est utilisé spécifiquement pour les instructions
SQL SELECT qui renvoient des données.
53
TP
Exercice 1
54
TP
Exercice 2
Créer uns classe compteBancaire comptes bancaires avec les attributs suivant:
devise, solde et titulaire.
Créez toutes les méthodes nécessaires (getter setter _toSting…) y compris un constructeurs avec paramètres
__construct($devise, $solde, $titulaire).
55
TP Exercice 3
Lors de l'inscription, aucun champ ne doit être laissé vide et les champs "mot de passe" et "confirmation de
mot de passe" doivent être identiques. Si tous les champs sont valides, on vérifie d'abord si le login n'existe
pas déjà dans la base de donnée. Si non alors les informations de l'utilisateur seront placées dans la table
"utilisateurs"
56
PARTIE 2
57