SlideShare une entreprise Scribd logo
1  sur  25
PHP avancé 
Abdoulaye DIENG Juin 2014
Sommaire 
1) Traitement d’un formulaire 
a) Données renseignées 
b) Fichier uploadé 
2) Gestion d’une session 
3) Extension PDO
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
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
Sommaire 
1) Traitement d’un formulaire 
2) Gestion d’une session 
3) Extension PDO
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.
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
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
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.
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
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.
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
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);
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
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()); 
}
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.
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
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).
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
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);
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);
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);
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.
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
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

Contenu connexe

Tendances

Cours d'introduction aux HTML5 & CSS3
Cours d'introduction aux HTML5 & CSS3Cours d'introduction aux HTML5 & CSS3
Cours d'introduction aux HTML5 & CSS3Abel LIFAEFI MBULA
 
Architectures orientés services (SOA)
Architectures orientés services (SOA)Architectures orientés services (SOA)
Architectures orientés services (SOA)Heithem Abbes
 
Internet et ses services
Internet et ses servicesInternet et ses services
Internet et ses servicesAbdoulaye Dieng
 
Architectures orientées services
Architectures orientées servicesArchitectures orientées services
Architectures orientées servicesDonia Hammami
 
Cahier des Charges Infrastructure Informatique
Cahier des Charges Infrastructure InformatiqueCahier des Charges Infrastructure Informatique
Cahier des Charges Infrastructure InformatiqueDATANYWARE.com
 
Cours php -partie 1.pdf
Cours php -partie 1.pdfCours php -partie 1.pdf
Cours php -partie 1.pdfssuserc46a93
 
Examen principal- php - correction
Examen principal- php - correctionExamen principal- php - correction
Examen principal- php - correctionInes Ouaz
 
Chp1 - Introduction aux méthodologies de Conception
Chp1 - Introduction aux méthodologies de ConceptionChp1 - Introduction aux méthodologies de Conception
Chp1 - Introduction aux méthodologies de ConceptionLilia Sfaxi
 
Introduction au Framework AngularJs
Introduction au Framework AngularJsIntroduction au Framework AngularJs
Introduction au Framework AngularJsRadhoueneRouached
 
Conception et réalisation d'une application web et mobile de e-commerce
Conception et réalisation d'une application web et mobile de e-commerceConception et réalisation d'une application web et mobile de e-commerce
Conception et réalisation d'une application web et mobile de e-commerceAHMEDBELGHITH4
 
Développement d'un forum de discussion
Développement d'un forum de discussionDéveloppement d'un forum de discussion
Développement d'un forum de discussionYoussef NIDABRAHIM
 
Méthode d'Agile: Scrum
Méthode d'Agile: ScrumMéthode d'Agile: Scrum
Méthode d'Agile: ScrumChaymaMghazli
 
Chp3 - Les Services Web
Chp3 - Les Services WebChp3 - Les Services Web
Chp3 - Les Services WebLilia Sfaxi
 
Jsf 110530152515-phpapp01
Jsf 110530152515-phpapp01Jsf 110530152515-phpapp01
Jsf 110530152515-phpapp01Eric Bourdet
 

Tendances (20)

Cours d'introduction aux HTML5 & CSS3
Cours d'introduction aux HTML5 & CSS3Cours d'introduction aux HTML5 & CSS3
Cours d'introduction aux HTML5 & CSS3
 
MongoDB.pptx
MongoDB.pptxMongoDB.pptx
MongoDB.pptx
 
Architectures orientés services (SOA)
Architectures orientés services (SOA)Architectures orientés services (SOA)
Architectures orientés services (SOA)
 
Support cours angular
Support cours angularSupport cours angular
Support cours angular
 
Internet et ses services
Internet et ses servicesInternet et ses services
Internet et ses services
 
Architectures orientées services
Architectures orientées servicesArchitectures orientées services
Architectures orientées services
 
Cahier des Charges Infrastructure Informatique
Cahier des Charges Infrastructure InformatiqueCahier des Charges Infrastructure Informatique
Cahier des Charges Infrastructure Informatique
 
Présentation Angular 2
Présentation Angular 2 Présentation Angular 2
Présentation Angular 2
 
Cours php -partie 1.pdf
Cours php -partie 1.pdfCours php -partie 1.pdf
Cours php -partie 1.pdf
 
Examen principal- php - correction
Examen principal- php - correctionExamen principal- php - correction
Examen principal- php - correction
 
Chp1 - Introduction aux méthodologies de Conception
Chp1 - Introduction aux méthodologies de ConceptionChp1 - Introduction aux méthodologies de Conception
Chp1 - Introduction aux méthodologies de Conception
 
Introduction au Framework AngularJs
Introduction au Framework AngularJsIntroduction au Framework AngularJs
Introduction au Framework AngularJs
 
Conception et réalisation d'une application web et mobile de e-commerce
Conception et réalisation d'une application web et mobile de e-commerceConception et réalisation d'une application web et mobile de e-commerce
Conception et réalisation d'une application web et mobile de e-commerce
 
Développement d'un forum de discussion
Développement d'un forum de discussionDéveloppement d'un forum de discussion
Développement d'un forum de discussion
 
Support developpement applications mobiles avec ionic v3 et v4
Support developpement applications mobiles avec ionic v3 et v4Support developpement applications mobiles avec ionic v3 et v4
Support developpement applications mobiles avec ionic v3 et v4
 
Méthode d'Agile: Scrum
Méthode d'Agile: ScrumMéthode d'Agile: Scrum
Méthode d'Agile: Scrum
 
Chp3 - Les Services Web
Chp3 - Les Services WebChp3 - Les Services Web
Chp3 - Les Services Web
 
Jsf 110530152515-phpapp01
Jsf 110530152515-phpapp01Jsf 110530152515-phpapp01
Jsf 110530152515-phpapp01
 
Servlets et JSP
Servlets et JSPServlets et JSP
Servlets et JSP
 
Angular Avancé
Angular AvancéAngular Avancé
Angular Avancé
 

En vedette

Csharp2 : classes et objets
Csharp2 : classes et objetsCsharp2 : classes et objets
Csharp2 : classes et objetsAbdoulaye Dieng
 
souvenirs 2007
souvenirs 2007souvenirs 2007
souvenirs 2007kivars
 
A favor-del-decrecimiento
A favor-del-decrecimientoA favor-del-decrecimiento
A favor-del-decrecimientogaluzby
 
echarpe de portage
echarpe de portageecharpe de portage
echarpe de portagejolilola
 
Gilbert RéVeillon Paris 2.0 23 Sept 09
Gilbert RéVeillon Paris 2.0 23 Sept 09Gilbert RéVeillon Paris 2.0 23 Sept 09
Gilbert RéVeillon Paris 2.0 23 Sept 09charafs
 
Preguntasdeemprendimiento
PreguntasdeemprendimientoPreguntasdeemprendimiento
Preguntasdeemprendimientoalejixx14
 
Implantation de villages de vacances et d'hôtels (annexes) 15.12.2010
Implantation de villages de vacances et d'hôtels (annexes) 15.12.2010Implantation de villages de vacances et d'hôtels (annexes) 15.12.2010
Implantation de villages de vacances et d'hôtels (annexes) 15.12.2010regiosuisse
 
Occlusion de l’auricule gauche par voie transcutanée : une alternative au tra...
Occlusion de l’auricule gauche par voie transcutanée : une alternative au tra...Occlusion de l’auricule gauche par voie transcutanée : une alternative au tra...
Occlusion de l’auricule gauche par voie transcutanée : une alternative au tra...Brussels Heart Center
 
PresentacióN GestióN Del Talento Y GestióN Del Conocimiento Jjaa
PresentacióN GestióN Del Talento Y GestióN Del Conocimiento JjaaPresentacióN GestióN Del Talento Y GestióN Del Conocimiento Jjaa
PresentacióN GestióN Del Talento Y GestióN Del Conocimiento JjaaJuan José Arias
 
Guideutilisateur
GuideutilisateurGuideutilisateur
GuideutilisateurCorporama
 
4 Paris 2
4 Paris 24 Paris 2
4 Paris 2charafs
 
Mettez les verbes suivants au présent iii groupe
Mettez les verbes suivants au présent  iii groupeMettez les verbes suivants au présent  iii groupe
Mettez les verbes suivants au présent iii groupeGrama Violeta
 

En vedette (20)

Csharp2 : classes et objets
Csharp2 : classes et objetsCsharp2 : classes et objets
Csharp2 : classes et objets
 
Introduction au Jquery
Introduction au JqueryIntroduction au Jquery
Introduction au Jquery
 
Introduction à ajax
Introduction à ajaxIntroduction à ajax
Introduction à ajax
 
introduction à MongoDB
introduction à MongoDBintroduction à MongoDB
introduction à MongoDB
 
souvenirs 2007
souvenirs 2007souvenirs 2007
souvenirs 2007
 
A favor-del-decrecimiento
A favor-del-decrecimientoA favor-del-decrecimiento
A favor-del-decrecimiento
 
echarpe de portage
echarpe de portageecharpe de portage
echarpe de portage
 
Gilbert RéVeillon Paris 2.0 23 Sept 09
Gilbert RéVeillon Paris 2.0 23 Sept 09Gilbert RéVeillon Paris 2.0 23 Sept 09
Gilbert RéVeillon Paris 2.0 23 Sept 09
 
La casita de chocolate
La casita de chocolateLa casita de chocolate
La casita de chocolate
 
Preguntasdeemprendimiento
PreguntasdeemprendimientoPreguntasdeemprendimiento
Preguntasdeemprendimiento
 
Fcd Bel H
Fcd Bel HFcd Bel H
Fcd Bel H
 
Slide show Tempotraxx
Slide show TempotraxxSlide show Tempotraxx
Slide show Tempotraxx
 
Implantation de villages de vacances et d'hôtels (annexes) 15.12.2010
Implantation de villages de vacances et d'hôtels (annexes) 15.12.2010Implantation de villages de vacances et d'hôtels (annexes) 15.12.2010
Implantation de villages de vacances et d'hôtels (annexes) 15.12.2010
 
Occlusion de l’auricule gauche par voie transcutanée : une alternative au tra...
Occlusion de l’auricule gauche par voie transcutanée : une alternative au tra...Occlusion de l’auricule gauche par voie transcutanée : une alternative au tra...
Occlusion de l’auricule gauche par voie transcutanée : une alternative au tra...
 
PresentacióN GestióN Del Talento Y GestióN Del Conocimiento Jjaa
PresentacióN GestióN Del Talento Y GestióN Del Conocimiento JjaaPresentacióN GestióN Del Talento Y GestióN Del Conocimiento Jjaa
PresentacióN GestióN Del Talento Y GestióN Del Conocimiento Jjaa
 
Plaquette Réseaux Sociaux
Plaquette Réseaux SociauxPlaquette Réseaux Sociaux
Plaquette Réseaux Sociaux
 
Guideutilisateur
GuideutilisateurGuideutilisateur
Guideutilisateur
 
4 Paris 2
4 Paris 24 Paris 2
4 Paris 2
 
R A M A D A N I A T E S 04
R A M A D A N I A T E S 04R A M A D A N I A T E S 04
R A M A D A N I A T E S 04
 
Mettez les verbes suivants au présent iii groupe
Mettez les verbes suivants au présent  iii groupeMettez les verbes suivants au présent  iii groupe
Mettez les verbes suivants au présent iii groupe
 

Similaire à php2 : formulaire-session-PDO

Soutenance Zend Framework vs Symfony
Soutenance Zend Framework vs SymfonySoutenance Zend Framework vs Symfony
Soutenance Zend Framework vs SymfonyVincent Composieux
 
Communications Réseaux et HTTP avec PHP
Communications Réseaux et HTTP avec PHPCommunications Réseaux et HTTP avec PHP
Communications Réseaux et HTTP avec PHPjulien pauli
 
SOLID : les principes à l’origine du succès de Symfony et de vos applications
SOLID : les principes à l’origine du succès de Symfony et de vos applicationsSOLID : les principes à l’origine du succès de Symfony et de vos applications
SOLID : les principes à l’origine du succès de Symfony et de vos applicationsVladyslav Riabchenko
 
Les Web Services en 60 diapos chrono !
Les Web Services en 60 diapos chrono !Les Web Services en 60 diapos chrono !
Les Web Services en 60 diapos chrono !Olivier Le Goaër
 
Atelier WordPress: Création d&rsquo;extension WordPress
Atelier WordPress: Création d&rsquo;extension WordPressAtelier WordPress: Création d&rsquo;extension WordPress
Atelier WordPress: Création d&rsquo;extension WordPressIZZA Samir
 
Drupal 8, symfony
Drupal 8, symfonyDrupal 8, symfony
Drupal 8, symfonyjeUXdiCode
 
Workshop spring session 2 - La persistance au sein des applications Java
Workshop spring   session 2 - La persistance au sein des applications JavaWorkshop spring   session 2 - La persistance au sein des applications Java
Workshop spring session 2 - La persistance au sein des applications JavaAntoine Rey
 
Mop export-dataloader-salesforce-en-ligne-commande
Mop export-dataloader-salesforce-en-ligne-commandeMop export-dataloader-salesforce-en-ligne-commande
Mop export-dataloader-salesforce-en-ligne-commandeCyrille Coeurjoly
 
PostgreSQL sous linux
PostgreSQL sous linuxPostgreSQL sous linux
PostgreSQL sous linuxKhalid ALLILI
 
Php 2 - Approfondissement MySQL, PDO et MVC
Php 2 - Approfondissement MySQL, PDO et MVCPhp 2 - Approfondissement MySQL, PDO et MVC
Php 2 - Approfondissement MySQL, PDO et MVCPierre Faure
 
Notions de base de JavaScript
Notions de base de JavaScriptNotions de base de JavaScript
Notions de base de JavaScriptKristen Le Liboux
 
Initiation à Express js
Initiation à Express jsInitiation à Express js
Initiation à Express jsAbdoulaye Dieng
 
Symfony2 - Un Framework PHP 5 Performant
Symfony2 - Un Framework PHP 5 PerformantSymfony2 - Un Framework PHP 5 Performant
Symfony2 - Un Framework PHP 5 PerformantHugo Hamon
 
Quoi de neuf dans Zend Framework 1.10 ?
Quoi de neuf dans Zend Framework 1.10 ?Quoi de neuf dans Zend Framework 1.10 ?
Quoi de neuf dans Zend Framework 1.10 ?Mickael Perraud
 

Similaire à php2 : formulaire-session-PDO (20)

Soutenance Zend Framework vs Symfony
Soutenance Zend Framework vs SymfonySoutenance Zend Framework vs Symfony
Soutenance Zend Framework vs Symfony
 
Communications Réseaux et HTTP avec PHP
Communications Réseaux et HTTP avec PHPCommunications Réseaux et HTTP avec PHP
Communications Réseaux et HTTP avec PHP
 
Introduction à Symfony
Introduction à SymfonyIntroduction à Symfony
Introduction à Symfony
 
Des tests modernes pour Drupal
Des tests modernes pour DrupalDes tests modernes pour Drupal
Des tests modernes pour Drupal
 
SOLID : les principes à l’origine du succès de Symfony et de vos applications
SOLID : les principes à l’origine du succès de Symfony et de vos applicationsSOLID : les principes à l’origine du succès de Symfony et de vos applications
SOLID : les principes à l’origine du succès de Symfony et de vos applications
 
Les Web Services en 60 diapos chrono !
Les Web Services en 60 diapos chrono !Les Web Services en 60 diapos chrono !
Les Web Services en 60 diapos chrono !
 
Atelier WordPress: Création d&rsquo;extension WordPress
Atelier WordPress: Création d&rsquo;extension WordPressAtelier WordPress: Création d&rsquo;extension WordPress
Atelier WordPress: Création d&rsquo;extension WordPress
 
Drupal 8, symfony
Drupal 8, symfonyDrupal 8, symfony
Drupal 8, symfony
 
Workshop spring session 2 - La persistance au sein des applications Java
Workshop spring   session 2 - La persistance au sein des applications JavaWorkshop spring   session 2 - La persistance au sein des applications Java
Workshop spring session 2 - La persistance au sein des applications Java
 
Mop export-dataloader-salesforce-en-ligne-commande
Mop export-dataloader-salesforce-en-ligne-commandeMop export-dataloader-salesforce-en-ligne-commande
Mop export-dataloader-salesforce-en-ligne-commande
 
PostgreSQL sous linux
PostgreSQL sous linuxPostgreSQL sous linux
PostgreSQL sous linux
 
Formation php pdo
Formation php pdoFormation php pdo
Formation php pdo
 
Php 2 - Approfondissement MySQL, PDO et MVC
Php 2 - Approfondissement MySQL, PDO et MVCPhp 2 - Approfondissement MySQL, PDO et MVC
Php 2 - Approfondissement MySQL, PDO et MVC
 
Notions de base de JavaScript
Notions de base de JavaScriptNotions de base de JavaScript
Notions de base de JavaScript
 
iTunes Stats
iTunes StatsiTunes Stats
iTunes Stats
 
Initiation à Express js
Initiation à Express jsInitiation à Express js
Initiation à Express js
 
Paris RailsCamp 2009
Paris RailsCamp 2009Paris RailsCamp 2009
Paris RailsCamp 2009
 
Symfony2 - Un Framework PHP 5 Performant
Symfony2 - Un Framework PHP 5 PerformantSymfony2 - Un Framework PHP 5 Performant
Symfony2 - Un Framework PHP 5 Performant
 
Introduction à Laravel
Introduction à LaravelIntroduction à Laravel
Introduction à Laravel
 
Quoi de neuf dans Zend Framework 1.10 ?
Quoi de neuf dans Zend Framework 1.10 ?Quoi de neuf dans Zend Framework 1.10 ?
Quoi de neuf dans Zend Framework 1.10 ?
 

Plus de Abdoulaye Dieng

Fondamentaux du Référencement naturel
Fondamentaux du Référencement naturelFondamentaux du Référencement naturel
Fondamentaux du Référencement naturelAbdoulaye Dieng
 
Panorama des Technologies mobiles
Panorama des Technologies mobilesPanorama des Technologies mobiles
Panorama des Technologies mobilesAbdoulaye Dieng
 
Prise en main de WordPress
Prise en main de WordPressPrise en main de WordPress
Prise en main de WordPressAbdoulaye Dieng
 
Fondamentaux d’une API REST
Fondamentaux d’une API RESTFondamentaux d’une API REST
Fondamentaux d’une API RESTAbdoulaye Dieng
 
Introduction à JavaScript
Introduction à JavaScriptIntroduction à JavaScript
Introduction à JavaScriptAbdoulaye Dieng
 
Introduction à l’orienté objet en Python
Introduction à l’orienté objet en PythonIntroduction à l’orienté objet en Python
Introduction à l’orienté objet en PythonAbdoulaye Dieng
 
Introduction à React JS
Introduction à React JSIntroduction à React JS
Introduction à React JSAbdoulaye Dieng
 
Initiation à l'algorithmique
Initiation à l'algorithmiqueInitiation à l'algorithmique
Initiation à l'algorithmiqueAbdoulaye Dieng
 
Requêtes HTTP synchrones et asynchrones
Requêtes HTTPsynchrones et asynchronesRequêtes HTTPsynchrones et asynchrones
Requêtes HTTP synchrones et asynchronesAbdoulaye Dieng
 
Introduction à JavaScript
Introduction à JavaScriptIntroduction à JavaScript
Introduction à JavaScriptAbdoulaye Dieng
 
Initiation à l'algorithmique
Initiation à l'algorithmiqueInitiation à l'algorithmique
Initiation à l'algorithmiqueAbdoulaye Dieng
 
Introduction à AngularJS
Introduction à AngularJSIntroduction à AngularJS
Introduction à AngularJSAbdoulaye Dieng
 

Plus de Abdoulaye Dieng (20)

Introduction à React
Introduction à ReactIntroduction à React
Introduction à React
 
Fondamentaux du Référencement naturel
Fondamentaux du Référencement naturelFondamentaux du Référencement naturel
Fondamentaux du Référencement naturel
 
Panorama des Technologies mobiles
Panorama des Technologies mobilesPanorama des Technologies mobiles
Panorama des Technologies mobiles
 
Prise en main de WordPress
Prise en main de WordPressPrise en main de WordPress
Prise en main de WordPress
 
Initiation à Bootstrap
Initiation à BootstrapInitiation à Bootstrap
Initiation à Bootstrap
 
Fondamentaux d’une API REST
Fondamentaux d’une API RESTFondamentaux d’une API REST
Fondamentaux d’une API REST
 
Introduction à Angular
Introduction à AngularIntroduction à Angular
Introduction à Angular
 
Introduction à JavaScript
Introduction à JavaScriptIntroduction à JavaScript
Introduction à JavaScript
 
Introduction à l’orienté objet en Python
Introduction à l’orienté objet en PythonIntroduction à l’orienté objet en Python
Introduction à l’orienté objet en Python
 
Introduction à Python
Introduction à PythonIntroduction à Python
Introduction à Python
 
Introduction à React JS
Introduction à React JSIntroduction à React JS
Introduction à React JS
 
Initiation à l'algorithmique
Initiation à l'algorithmiqueInitiation à l'algorithmique
Initiation à l'algorithmique
 
Introduction à Symfony
Introduction à SymfonyIntroduction à Symfony
Introduction à Symfony
 
Initiation à Bootstrap
Initiation à BootstrapInitiation à Bootstrap
Initiation à Bootstrap
 
Requêtes HTTP synchrones et asynchrones
Requêtes HTTPsynchrones et asynchronesRequêtes HTTPsynchrones et asynchrones
Requêtes HTTP synchrones et asynchrones
 
Introduction à jQuery
Introduction à jQueryIntroduction à jQuery
Introduction à jQuery
 
Introduction à JavaScript
Introduction à JavaScriptIntroduction à JavaScript
Introduction à JavaScript
 
Initiation à l'algorithmique
Initiation à l'algorithmiqueInitiation à l'algorithmique
Initiation à l'algorithmique
 
Introduction à HTML 5
Introduction à HTML 5Introduction à HTML 5
Introduction à HTML 5
 
Introduction à AngularJS
Introduction à AngularJSIntroduction à AngularJS
Introduction à AngularJS
 

php2 : formulaire-session-PDO

  • 1. PHP avancé Abdoulaye DIENG Juin 2014
  • 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
  • 5. Sommaire 1) Traitement d’un formulaire 2) Gestion d’une session 3) Extension PDO
  • 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

Notes de l'éditeur

  1. PHP M. DIENG
  2. PHP M. DIENG
  3. PHP M. DIENG
  4. PHP M. DIENG