2. Sommaire
1) Traitement d’un formulaire
a) Données renseignées
b) Fichier uploadé
2) Gestion d’une session
3) Extension PDO
3. Traitement d’un formulaire
données renseignées
Principaux attributs de l’élément form :
• action="adresse_script_cible"
script côté serveur qui traitera les données du formulaire.
• method="get|post"
méthode HTTP employée pour envoyer les données
Tout champ du formulaire doit avoir un nom
• Attribut name="nomChamp"
• Choix multiple : name="nomChamp[]"
Le script cible accède aux données transmises comme suit :
• $_GET['nomChamp'] si method="get"
• $_POST['nomChamp'] si method="post"
App1&2 • $_REQUEST['nomChamp'] dans tous les cas
4. Traitement d’un formulaire
fichier uploadé
Pour joindre un fichier à un formulaire :
• attribut enctype="multipart/form-data" de l’élément form
• méthode d’envoi : post
• champ input de type file muni de l’attr name="nomChamp"
Le script destinataire accède aux infos (nom, type, taille, … ) sur
un fichier joint par le biais du tableau super global
$_FILES['nomChamp'].
Tout fichier uploadé est placé dans un répertoire temporaire
move_uploaded_file($nom_temporaire,$nom_definitif)
déplace un fichier uploadé et retourne un booléen.
App3
6. Gestion d’une session
présentation
La gestion d’une session permet d'enregistrer (côté serveur) des
infos sur un internaute afin de les réutiliser durant toute sa visite.
Ces informations doivent être explicitement enregistrées dans le
tableau associatif $_SESSION.
Ce qui permet ainsi de suivre un internaute de page en page, de
sauvegarder un caddie, de sécuriser un site, etc.
Tout visiteur se voit assigner un "identifiant de session"
permettant de retrouver des informations sur lui.
Cet identifiant est stocké dans un cookie (chez le client) ou
propagé dans l'URL des pages visitées (méthode à risques).
Dans les versions récentes de PHP, réactiver la propagation par
l’URL en modifiant, dans le fichier php.ini, les directives :
• session.use_only_cookies = 0
• session.use_trans_sid = 1
Une session doit obligatoirement démarrer avant l’envoi de toute
information au navigateur.
7. Gestion d’une session
exemple
Stockage d’une information dans une variable
$total = 35000; // Montant d’une commande par exemple
Création ou prolongement d’une session
session_start();
Enregistrement de la variable ‘total’ dans la session
$_SESSION[‘total’] = $total ;
Test de l’enregistrement de la variable ‘total’ dans la session
if ( isset( ($_SESSION[‘total']) )
Affichage de l’information (dans une autre page)
echo $_SESSION[‘total’];
Suppression de la variable de session associée à ‘total’
unset($_SESSION[‘total']);
Destruction de toutes les variables de session
$_SESSION = array(); // Tableau vide
Destruction de la session
session_destroy();
App4
8. Sommaire
1) Traitement d’un formulaire
2) Gestion d’une session
3) Extension PDO
a) Présentation
b) Activation sous Windows
c) Connexion/Déconnexion
d) Gestion des erreurs
e) Requêtes d’écriture
f) Requête de lecture
g) Exploitation d’une requête de lecture
h) Requêtes préparées
i) Autres méthodes
9. L’extension PDO
présentation
• PDO (Php Data Object) est une classe PHP permettant à PHP
de communiquer avec un serveur de bases données.
• PDO est une couche d'abstraction : création d'un code
comportant des accès aux BDD en faisant abstraction du
moteur de SGBD (MySQL, Oracle, PostgreSQL, ...) utilisé.
• PDO facilite l’adaptation du code lors d’un changement de
SGBD
• PDO est fournit avec PHP 5.1
• PDO sera activé par défaut à partir de PHP 6
• L'utilisation de PDO en PHP utilise une approche de
programmation orienté objet.
10. L’extension PDO
activation sous Windows PHP 5.1.0 et plus
1. Editer le fichier de config de php : php.ini
2. Ajouter éventuellement (version<5.3) la ligne suivante pour
activer l’extension PDO :
extension=php_pdo.dll
3. Décommenter certaines des lignes suivantes pour charger les
pilotes spécifiques aux SGBDs utilisés:
extension=php_pdo_firebird.dll
extension=php_pdo_informix.dll
extension=php_pdo_mssql.dll
extension=php_pdo_mysql.dll
extension=php_pdo_oci.dll
extension=php_pdo_odbc.dll
extension=php_pdo_pgsql.dll
extension=php_pdo_sqlite.dll
11. L’extension PDO
Connexion/Déconnexion
• Connexion à l’aide du constructeur de la classe PDO qui reçoit :
(string $dsn, string $user, string $pass, array $options )
Seul le 1er paramètre est obligatoire pour tous les SGBD
• Retourne un objet PDO en cas de succès ou lève une
exception PDOException sinon.
• Syntaxe du DSN (nom de la source de données)
$dsn = "piloteSGBD:host=$nomHote;dbname=$nomBD";
• Exemples de pilote
mysql, oci, pgsql, sqlite.
• La déconnexion se fait soit automatiquement à la fin de
l'exécution du script (si la connexion n’est pas persistante), soit
explicitement en détruisant l'objet PDO.
12. L’extension PDO
Connexion/Déconnexion : exemple
//Définition des paramètres de connexion
define('USER','toto');
define('PASSWORD','secret');
define('DSN','mysql:host=localhost;dbname=maBase');
//connexion
try
{
$cnx = new PDO(DSN, USER, PASSWORD);
}
catch(PDOException $e)
{
echo 'Erreur de connexion : ' . $e->getMessage();
}
…
//déconnexion explicite
$cnx =NULL;
Pour une connexion persistante, ajouter
array(PDO::ATTR_PERSISTENT => true)
comme 4ème paramètre au constructeur
App5
13. L’extension PDO
Gestion des erreurs
• PDO admet trois comportements p/r aux erreurs :
1. PDO::ERRMODE_SILENT (par défaut): aucun message
d’erreur n’est affichée; il revient au développeur de vérifier les
valeurs de retour et de chercher la cause d’une erreur avec la
methode : array $objetPDO->errorInfo()
2. PDO::ERRMODE_WARNING : émission d’alertes qui
n’interrompent pas le script
3. PDO::ERRMODE_EXCEPTION : déclenchement d’une
exception PDOException avec la définition de ses propriétés afin
de représenter les informations relatives à l’erreur.
• Pour définir un comportement, modifier le paramètre
PDO::ATTR_ERRMODE pour une des valeurs ci-dessus par
l'intermédiaire de la méthode suivante :
boolean $objetPDO->setAttribute(int $attribute, mixed $value);
14. L’extension PDO
exécution des requêtes d’écriture
int $objetPDO->exec(string $sql)
• exec() exécute la requête (de type INSERT, UPDATE ou DELETE) reçue
et retourne le nombre de lignes affectées par la requête ou bien FALSE
en cas d’erreur.
• Exemple (insertion dans la table membres(id_mbre, nom, prenom) )
$cnx->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
try
{
$req="insert into membres values ('','Dia', 'Issa')";
$nbrDeLignesAffectees=$cnx->exec($req);
…
}
catch(PDOException $e)
{
die ('Erreur sur l’insertion : '.$e->getMessage());
}
Permet la
gestion des
exceptions
App6&7
15. L’extension PDO
exécution d’une requête de lecture
PDOStatement $objetPDO->query(string $sql);
• La méthode query() exécute la requête (de type SELECT) reçue et
retourne le jeu d'enregistrements retourné par la requête en tant
qu’objet PDOStatement ou FALSE si une erreur survient.
• Exemple (consultation sur la table membres(id_mbre, nom, prenom) )
$cnx->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
try
{
$req="select prenom, nom from membres ";
$rslt=$cnx->query($req);
…
}
catch(PDOException $e)
{
die ('Erreur sur la lecture : '.$e->getMessage());
}
16. L’extension PDO
Traitement d’un jeu d'enregistrements
• La méthode PDOStatement::fetch() récupère une ligne depuis un
jeu d'enregistrements
• Son 1er paramètre détermine le mode et peut valoir :
– PDO::FETCH_ASSOC : tableau indexé par le nom de la
colonne comme retourné dans le jeu d'enregistrements ;
– PDO::FETCH_NUM : tableau indexé par le n° de la colonne
comme retourné dans le jeu d'enregistrements ;
– PDO::FETCH_BOTH (défaut) : combine les deux précédents ;
– 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 d'enregistrements.
• Dans tous les cas, FALSE est retourné si une erreur survient.
17. L’extension PDO
exemple du traitement d’un jeu d'enregistrements
Exemple (consultation sur la table membres(id_mbre, nom, prenom) )
$cnx->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
try
{
$req="select prenom, nom from membres ";
$rslt=$cnx->query($req);
while($row=$rslt->fetch(PDO::FETCH_OBJ))
{
echo '<br />'.$row->prenom.' '. $row->nom;
}
}
catch(PDOException $e)
{
die ('Erreur sur la lecture : '.$e->getMessage());
}
App8
18. L’extension PDO
Requêtes préparées
• Une requête à exécuter de nombreuses fois dans un script,
sera à chaque fois, analysée, compilée, optimisée puis
exécutée.
• En utilisant une requête préparée, où seuls les paramètres
changent, la requête sera uniquement exécutée, à partir de la
seconde fois : ce qui peut être un gain important en terme de
performances et de sécurisation des entrées utilisateurs.
• En exécutant une seule fois une requête préparée, son temps
d'exécution sera plus long qu'une requête simple mais on y
gagne en sécurité (paramètres non interprétés).
19. L’extension PDO
étapes de création d’une requête préparée (1/6)
1. Inclusion des paramètres dans la syntaxe de la requête SQL
2. Préparation de la requête
3. Association des paramètres avec des valeurs ou des variables
4. Exécution de la requête préparée
20. L’extension PDO
étapes de création d’une requête préparée (2/6)
1. Inclusion des paramètres dans la syntaxe de la requête SQL
– Exemple avec des paramètres anonymes
$req="insert into personnes values (?,?,?,?)";
– Exemple avec des paramètres nommés
$req="insert into personnes values (:id,:pseudo,:age,:taille)";
2. Préparation de la requête
La méthode PDO::prepare() permet d’envoyer la requête au
serveur pour analyse, compilation et optimisation
Exemple :
$req_prepa=cnx->prepare($req);
21. L’extension PDO
étapes de création d’une requête préparée (3/6)
3. Association des paramètres avec des valeurs à l’aide d’un
tableau
– cas des paramètres anonymes
$req="insert into personnes values (?,?,?,?)";
$req_prepa=cnx->prepare($req);
$tab_des_val=array('','toto',25,1.85);
– cas des paramètres nommés
$req="insert into personnes values (:id,:pseudo,:age,:taille)";
$req_prepa=cnx->prepare($req);
$tab_des_val=array(':id'=>'', ':pseudo'=>'toto',
':age'=>25, ':taille'=>1.85);
22. L’extension PDO
étapes de création d’une requête préparée (4/6)
3. Association des paramètres avec des valeurs à l’aide de la
méthode PDOStatement::bindValue()
– cas des paramètres anonymes
$req="insert into personnes values (?,?,?,?)";
$req_prepa=cnx->prepare($req);
$req_prepa->bindValue(1,NULL,PDO::PARAM_NULL);
$req_prepa->bindValue(2,'toto');
$req_prepa->bindValue(3,25,PDO::PARAM_INT);
$req_prepa->bindValue(4,1.85);
– cas des paramètres nommés
$req="insert into personnes values (:id,:pseudo,:age,:taille)";
$req_prepa=cnx->prepare($req);
$req_prepa->bindValue(':id',NULL,PDO::PARAM_NULL);
$req_prepa->bindValue(':pseudo','toto',PDO::PARAM_STR);
23. L’extension PDO
étapes de création d’une requête préparée (5/6)
3. Association des paramètres avec des variables à l’aide de la
méthode PDOStatement::bindParam()
• bindParam() fonctionne de la même façon que bindValue()
sauf que le 2ème argument est une variable passée par
référence
• La variable est liée à la valeur à associer en tant que référence
et n’est évaluée qu'au moment de l‘exécution de la requête.
24. L’extension PDO
étapes de création d’une requête préparée (6/6)
4. Exécution de la requête préparée
• La requête préparée est exécutée par la méthode
bool PDOStatement::execute ([ array $input_parameters ] )
• Elle n’admet pas de paramètre si bindValue() ou bindParam()
est utilisée lors de l’association des paramètres avec des
variables.
• Exemples
– Sans argument : $req_prepa->execute();
– Avec argument : $req_prepa->execute($tab_des_val);
App9
25. L’extension PDO
Autres méthodes
• Connaître l’ID du dernier enregistrement
string PDO::lastInsertId ([ string $name = NULL ] )
Exemple
$req="insert into membres values ('','Dia', 'Issa')";
$nbrDeLignesAffectees=$cnx->exec($req);
echo 'ID du dernier membre : '. $cnx->lastInsertId();
• Connaître le nombre de lignes d’un jeu d'enregistrements
int PDOStatement::rowCount ()
Exemple
$req="select prenom, nom from membres";
$rslt=$cnx->query($req);
echo $rslt->rowCount().' membres sélectionnés';
• NB : Ces méthodes ne sont pas reconnues par tous les SGBD
App10