apprendre php et mysql.pdf

Upload: el-ghazouany-med

Post on 08-Oct-2015

128 views

Category:

Documents


1 download

TRANSCRIPT

  • PHP et MySql, les outils ct serveurUn langage serveur et une base de donnes pour parfaire votre site web

    Vous n'avez besoin d'aucun logiciel payant pour crer votre siteDans ces pages vous apprendrez manier le code PHP et la base de donnes MySql, des outils gratuits pour parfaire votre si te web...

    Accueil Cration web Aviation amateur Ballades Zoom sur... Contactez-nous Votre avis

    Mon site web tape par tapeMon code PHP et ma base de donnes MySql

    Cette page s'affiche mal ? - cliquez ici

    Dans ces pages vous apprendrez manier le code PHP et la base de donnes MySql, des outils gratuits pour parfaire votre site web...

    Si des erreurs se sont glisses dans le texte n'hsitez pas me contacter...Les liens ci-dessous vous renverront au chapitre correspondant.

    TAPE 10 : Dynamiser mon site avec PHP

    10.1 Un serveur web sur votre machine personnelle

    10.1.1 Tlchargement de Wamp server 10.1.2 Dtails de votre installation

    10.2 Pour commencer

    10.2.1 quoi sert le PHP 10.2.2 Balises d'ouverture - fermeture 10.2.3 Commentaires 10.2.4 Le point virgule 10.2.5 Apostrophes et guillemets

    10.3 Variables et constantes

    10.3.1 Les $variables 10.3.2 Les CONSTANTES

    10.4 Quelques Gadgets pour se familiariser

    10.4.1 Afficher la date du jour 10.4.2 Validit dune date saisie 10.4.3 Temps dexcution dun script php 10.4.4 Rcuprer mon adresse IP

    10.5 Les oprateurs

    10.5.1 Les oprations 10.5.2 Le Modulo '$a % 2 ;' 10.5.3 Oprateurs d'incrmentation 10.5.4 Oprateurs de concatnation 10.5.5 Oprateurs de comparaison 10.5.6 Oprateurs logiques

    10.6 Les tableaux

    10.6.1 Les tableaux indexs 10.6.2 Les tableaux associatifs 10.6.3 Tableau de tableau, panier darticles 10.6.4 Matrices

    10.7 Tests de base

    Apprendre PHP et MySql http://www.gilbert-pernot.fr/apprendre_php.html

    1 sur 82 17/02/2015 14:22

  • 10.7.1 Linstruction if else elseif 10.7.2 Linstruction switch

    10.8 Les boucles

    10.8.1 La boucle WHILE 10.8.2 La boucle DO WHILE 10.8.3 La boucle FOR 10.8.4 La boucle FOREACH 10.8.5 Les instructions break et continue

    10.9 Les fonctions utilisateurs

    10.9.1 Dclaration dune fonction utilisateur 10.9.2 Le mot-cl return 10.9.3 Dclaration et appel dune fonction 10.9.4 Convertisseur en Euros 10.9.5 Passage des arguments (visibilit et porte des variables) 10.9.6 Passage des arguments par copie 10.9.7 Passage des arguments par rfrence

    10.10 Scurit des formulaires

    10.10.1 Caractres spciaux : urlencode, urldecode 10.10.2 Scurit des champs texte : htmlentities 10.10.3 Scurit des champs texte : failles d'injection de headers de mail

    10.11 Les formulaires

    10.11.1 Cration dun formulaire en HTML : 10.11.2 O vont les donnes : action 10.11.3 Transmission des donnes : methode GET 10.11.4 Transmission des donnes : methode POST 10.11.5 Comment entrer les donnes dans le formulaire : balise 10.11.6 Les boutons : input type="button" 10.11.7 Des boutons graphiques 10.11.8 Zone de saisie de texte : input type="text" 10.11.9 Champs pour mots de passe : input type="password" 10.11.10 Champs cachs : input type="hidden" 10.11.11 Taille de la saisie et du texte : size, maxlength, 10.11.12 Cases cocher : input type="checkbox" 10.11.13 Boutons radio : input type="radio" 10.11.14 Liste de slection droulante : 10.11.15 Envoi de fichiers et dimages : input type="file" 10.11.16 Une calculatrice

    10.12 Formulaires denvoi de mails

    10.12.1 Un envoi de mail tout simple 10.12.2 Un envoi de mail qui rcupre les donnes dun formulaire 10.12.3 Un envoi de mail complet qui teste la validit des champs

    10.13 Les fichiers

    10.13.1 Inclure les donnes dun fichier texte : include() ou include_once() 10.13.2 Lecture dun fichier texte : file_get_contents() ou file() 10.13.3 Lecture dun fichier de configuration : parse_ini_file() 10.13.4 Lecture dun fichier CSV issu dun tableur : fgetcsv() 10.13.5 Ecriture dans un fichier : file_put_contents() 10.13.6 Ouverture dun fichier : fopen() 10.13.7 Verrouillage dun fichier : flock() 10.13.8 Tronquer un fichier : ftruncate() 10.13.9 Fermer un fichier : fclose()

    Apprendre PHP et MySql http://www.gilbert-pernot.fr/apprendre_php.html

    2 sur 82 17/02/2015 14:22

  • 10.13.10 Lire un fichier : fread() 10.13.11 Ecrire dans un fichier : fwrite() 10.13.12 Taille dun fichier : filesize()

    10.14 Fichiers et gestion documentaire

    10.14.1 Le formulaire 10.14.2 La page de rcupration des donnes

    10.15 Les cookies

    10.15.1 Ecriture et lecture dun cookie : setcookie(), $_COOKIE[] 10.15.2 Suppression dun cookie : setcookie(), sans valeur 10.15.3 Enregistrer dans un cookie les donnes dun formulaire 10.15.4 Enregistrer dans un cookie le nombre de visites dun visiteur 10.15.5 Personnaliser linterface graphique de la page laide dun cookie

    10.16 Les sessions

    10.16.1 Comment marche une session 10.16.2 Lecture et criture de sessions 10.16.3 Suppression dune session : session destroy(); 10.16.4 Autres instructions (facultatives) 10.16.5 Quelques rgles de scurit

    10.17 Utiliser une base de donnes MySQL

    10.17.1 La structure d'une base de donnes 10.17.2 Les formats des donnes en MySQL 10.17.3 Les oprateurs de MySQL 10.17.4 PhpMyAdmin 10.17.5 Crer une base de donnes MySQL avec PhpMyAdmin 10.17.6 Crer des tables dans une base de donnes MySQL avec PhpMyAdmin 10.17.7 Les types de champs MySQL (PhpMyAdmin) 10.17.8 Insrer un enregistrement de donnes avec PhpMyAdmin 10.17.9 Ajouter un champ une table avec PhpMyAdmin

    10.18 Utiliser MySql depuis PHP

    10.18.1 Crer un utilisateur administrateur 10.18.2 Se connecter la base de donnes MySql depuis PHP 10.18.2 - 1) Connexion MySQL - mthode oriente objet (PDO) 10.18.2 - 2) Connexion MySQL - mthode procdurale (mysqli) 10.18.3 Afficher le contenu d'une table depuis PHP 10.18.3 - 1) Lire le contenu dune table MySQL - mthode oriente objet (PDO) 10.18.3 - 2) Lire le contenu dune table MySQL - mthode procdurale (mysqli) 10.18.4 Insrer des donnes partir d'un formulaire depuis PHP 10.18.4 - 1) Insrer des donnes dans une table MySQL - mthode oriente objet (PDO) 10.18.4 - 2) Insrer des donnes dans une table MySQL - mthode procdurale (mysqli) 10.18.5 Modifier un enregistrement depuis PHP 10.18.5 - 1) Modifier des donnes dans une table MySQL - mthode oriente objet (PDO) 10.18.5 - 2) Modifier des donnes dans une table MySQL - mthode procdurale (mysqli) 10.18.6 Supprimer un enregistrement depuis PHP 10.18.6 - 1) Supprimer un enregistrement dune table MySQL - mthode oriente objet (PDO) 10.18.6 - 2) Supprimer un enregistrement dune table MySQL - mthode procdurale (mysqli) 10.18.7 Trier une table depuis PHP 10.18.7 - 1) Trier par noms une table MySQL - mthode oriente objet (PDO) 10.18.8 Un script dadministration pour grer la table

    10.19 Crer un systme dauthentification scuris mthode oriente objet (PDO)

    10.19.1 le formulaire pour sidentifier : auth.php - mthode oriente objet (PDO) 10.19.2 le formulaire pour sinscrire : 53_auth_inscript.php - mthode oriente objet (PDO) 10.19.3 la validation du nom et du mot de passe : verif.php - mthode oriente objet (PDO)

    Apprendre PHP et MySql http://www.gilbert-pernot.fr/apprendre_php.html

    3 sur 82 17/02/2015 14:22

  • 10.19.4 le script de protection de la page : secure.php - mthode oriente objet (PDO)

    10.20 Crer un site marchand scuris mthode procdurale (mysqli)

    10.20.A Connexion et menu mthode procdurale (mysqli) 10.20.A1 le script de connexion - mthode procdurale (mysqli) 10.20.A2 le script dauthentification - mthode procdurale (mysqli) 10.20.A3 Modifier le mot de passe - mthode procdurale (mysqli) 10.20.A4 la page dadministration - mthode procdurale (mysqli) 10.20.A5 la Dconnexion - mthode procdurale (mysqli) 10.20.A6 la page du site web (ultra-simplifie) - mthode procdurale (mysqli) 10.20.B Grer lutilisateur mthode procdurale (mysqli) 10.20.B1 Affichage des utilisateurs - mthode procdurale (mysqli) 10.20.B2 Dtail dun utilisateur - mthode procdurale (mysqli) 10.20.B3 Ajouter un utilisateur - mthode procdurale (mysqli) 10.20.B4 Modifier un utilisateur - mthode procdurale (mysqli) 10.20.B5 Effacer un utilisateur - mthode procdurale (mysqli) 10.20.C Grer les articles du site mthode procdurale (mysqli) 10.20.C1 Affichage des articles - mthode procdurale (mysqli) 10.20.C2 Dtail dun article - mthode procdurale (mysqli) 10.20.C3 Ajouter un article - mthode procdurale (mysqli) 10.20.C4 Modifier un article - mthode procdurale (mysqli) 10.20.C5 Supprimer un article - mthode procdurale (mysqli) 10.20.C6a Statistiques sur les articles - mthode procdurale (mysqli) 10.20.C6b Statistiques sur les articles avec la bibliothque Artichow

    10.21 Conclusion

    TAPE 10 : Dynamiser mon site avec PHP

    Ce mmento sur PHP et MySQL est un simple aide-mmoire. Pour rester pratique, ce mmento est agrment de modles de code que jai tous tests, ceci afindviter dentrer dans la catgorie des scripts truffs derreurs que lon trouve habituellement sur internet. Pour plus de dtails, je vous renvoie cependant auxtutoriels que vous trouverez sur internet : http://php.net/manual/fr/index.php - http://www.phpfrance.com/ - http://www.siteduzero.com/ ainsi qu l'excellent livre"PHP 5 Avanc - 4e dition" de ric Daspet et Cyril Pierre de Geyer, chez Eyrolles.

    10.1 Un serveur web sur votre machine personnelleIl est extrmement utile, pour ne pas dire absolument indispensable, de commencer par installer un serveur web sur votre machine personnelle. Ceci vous

    permettra de reproduire le comportement de vos scripts pour les tester sur votre propre machine, ce qui est bien plus pratique et plus rapide que de les tlcharger chaque fois sur le serveur de votre hbergeur. Le but est de transformer votre machine en serveur web fictif pour simuler le comportement de vos scripts sur le vraiserveur web de votre hbergeur avant de les tlcharger.

    10.1.1 Tlchargement de Wamp serverRechercher Wamp server dans Google :

    Apprendre PHP et MySql http://www.gilbert-pernot.fr/apprendre_php.html

    4 sur 82 17/02/2015 14:22

  • Choisissez loption 1 "Tlchargez la dernire version de Wampserver 2" Inutile de remplir le formulaire, allez directement dans"TELECHARGER WampServer 2.0c"

    Attention, si vous utilisiez Wamp 5, dsinstallez cette version avantd'installer WampServer 2

    Puis cliquez sur "TELECHARGER WampServer 2Enregistrez

    Cliquez sur Yes si cest une premire installationPuis double-cliquez sur licne bleue Wamp server

    Puis sur Run pour lancer linstallation

    Fermez tous les programmes et cliquez sur Next Acceptez la licence gnrale GNU et cliquez sur Next

    Apprendre PHP et MySql http://www.gilbert-pernot.fr/apprendre_php.html

    5 sur 82 17/02/2015 14:22

  • Le rpertoire dinstallation devrait tre c:\wamp Mettez une icne de lancement rapide

    Continuez linstallation Et attendez ...

    Si un fichier php.ini existe dj, linstalleur vous proposera de le renommer

    Utilisez de prfrence Firefox comme navigateur par dfaut (avec FireBug : il sera utile pour ventuellement dbugger vos programmes PHP)

    Apprendre PHP et MySql http://www.gilbert-pernot.fr/apprendre_php.html

    6 sur 82 17/02/2015 14:22

  • Conservez localhost comme nom de serveur SMTP mais changez votreadresse e-mail

    Et cliquez sur Finish pour terminer linstallation

    Une petite icne de lancement rapide apparat en bas droite de votrecran :

    Cliquez sur l'icone W puis dmarrez tous les services

    Vous pourrez ainsi explorez votre rpertoire www, ou bien ouvrir les pages de localhost dans votre navigateur, ou encore lancer phpMyAdmin et bien dautres options !

    10.1.2 Dtails de votre installation : phpinfo()

    A ce stade nous supposons que vous avez termin avec succs linstallation du serveur web Wamp sur votre machine personnelle. Lorsquil est install, dmarrez leserveur Wamp, puis ouvrez votre navigateur (Firefox de prfrence). Et dans la barre d'adresses, entrez :http://localhost/01_phpinfo.php pour obtenir tous les dtails de votre installation PHP et pour vous assurer quelle fonctionne bien.

    Code du fichier 01_phpinfo.php :

    Apprendre PHP et MySql http://www.gilbert-pernot.fr/apprendre_php.html

    7 sur 82 17/02/2015 14:22

  • 10.2 Pour commencer

    10.2.1 quoi sert le PHP

    Le PHP sert dynamiser vos pages, il permet dinteragir avec vos visiteurs laide de formulaires, il peut gnrer dynamiquement du code html au milieu dunepage.Le code PHP est souvent inclus au milieu du code html : Dans ce cas le fichier qui contient du PHP doit avoir l'extension *.php

    10.2.2 Balises d'ouverture - fermeture

    Le code PHP souvre et se ferme comme ceci :

    10.2.3 Commentaires

    /*Commentaires sur plusieurs lignes(Recommand)bla bla bla*/ou bien// Sur une seule ligne

    10.2.4 Le point virgule

    Chaque instruction se termine par un ";"

    10.2.5 Apostrophes et guillemets

    Entre apostrophes on a des chaines de caractres (non interprtables)Entre guillemets on a des chaines et ventuellement des variables interprtables

    echo sert afficher dans la page html les chaines entre apostrophes ou guillemets, les variables ou les constantes

    10.3 Variables et constantes

    10.3.1 Les $variables

    Les variables commencent par un $ (05_variables.php)

    Visibilit des variables :Une variable est visible (accessible) l o elle a t dclare.Par exemple si on la dclare dans une fonction, elle ne sera pas accessible dans le script principal, et vice versa.

    Apprendre PHP et MySql http://www.gilbert-pernot.fr/apprendre_php.html

    8 sur 82 17/02/2015 14:22

  • 10.3.2 Les CONSTANTES

    Les constantes sont dclares par la fonction define (en MAJUSCULES mais pas de $ devant)

    10.4 Quelques Gadgets pour se familiariser

    10.4.1 Afficher la date du jour

    La fonction date(format, timestamp) : Pour afficher la date on utilise la fonction date()La fonction strtotime () : convertit une chaine date en tempsLa fonction mktime() : donne un timestamp partir d'une date

    (02.1_datejour.php)

    Bonjour nous sommes le :

  • $a == $b; //est vrai si $a gal $b $a === $b; //est vrai si $a gal $b et ont toutes deux le mme type $a != $b; //est vrai si $a diffrent de $b $a !== $b; //est vrai si $a diffrent de $b en valeur OU en type $a > $b; //est vrai si $a plus grand que $b $a < $b; //est vrai si $a plus petit que $b $a >= $b; //est vrai si $a plus grand ou gal $b $a

    10.5.3 Oprateurs d'incrmentation

    10.5.4 Oprateurs de concatnation

    10.5.5 Oprateurs de comparaison

    10.5.6 Oprateurs logiques

    10.6 Les tableaux

    10.6.1 Les tableaux indexs

    Les tableaux indexs ont des index commenant 0 (et non 1), on peut les remplir de diffrentes faons :(09_testtab.php)

    Apprendre PHP et MySql http://www.gilbert-pernot.fr/apprendre_php.html

    11 sur 82 17/02/2015 14:22

  • 'codpost'=>'91400','pays'=>'France','telport'=>'0611705146');

    echo "Votre contact {$tab['ville']} ({$tab['pays']}-{$tab['codpost']}) sera Monsieur ";echo $tab['prenom']." ".$tab['nom'];echo "Son tlphone est le ";echo $tab['telport'];?>

    Ce qui donne :Votre contact Orsay (France-91400) sera Monsieur Gilbert PernotSon tlphone est le 0611705146

    10.6.3 Tableau de tableau, panier darticles

    Objectif : Transformer un tableau $articles en tableau de tableau dans une variable $panier. Les valeurs de $panier sont des tableaux associatifs (prix, description) etles cls de $panier sont numriques. Afficher le panier.(13_x.tableau_panier.php)

    10.6.4 Matrices

    Un tableau peut avoir plusieurs dimensions (matrice) :

  • $matrice[0][1] = 4;$matrice[1][0] = 2;$matrice[1][1] = 3;$matrice[2][0] = 8;$matrice[2][1] = 2;$matrice[3][0] = 7;$matrice[3][1] = 9;$matrice[4][0] = 1;$matrice[4][1] = 6;?>

    Les index peuvent aussi tre remplacs par des noms (matrices associatives)

    10.7 Tests de base

    10.7.1 Linstruction if else elseif

    Changez la valeur de $age et testez!...(06_b_if else elseif.php)

    Autre exemple :La fonction mt_rand(1,6000) donne une valeur alatoire entre 1 et 6000 testez le code ci-dessous!...(06_testiftrous.php)

    Les accolades sont inutiles si une seule instruction suit la condition :

    10.7.2 Linstruction switch

    Elle permet de faire plusieurs tests sur la valeur dune variable $var (entre les parenthses du 'switch') en la comparant successivement chacun des 'case' :(15_switch.php)

    Apprendre PHP et MySql http://www.gilbert-pernot.fr/apprendre_php.html

    14 sur 82 17/02/2015 14:22

  • 10.8.2 La boucle DO WHILE

    Encore un type de boucle trs utile si on ne sait pas combien de fois itrer : 'While' veut dire 'tant que' la condition est vraie, les instructions sont excutes, puissarrtent ds que la condition est fausse.(17_do_while.php)

    10.8.3 La boucle FOR

    Un type de boucle adapt lorsquon sait combien de fois itrer : cette boucle intgre la valeur de dpart, la condition darrt et lincrmentation.(18_for.php)

    Apprendre PHP et MySql http://www.gilbert-pernot.fr/apprendre_php.html

    15 sur 82 17/02/2015 14:22

  • 10.8.4 La boucle FOREACH

    Un moyen simple de passer en revue tous les lments dun tableau.(18_foreach.php)Syntaxe : pour toutes les cases du tableau ayant une valeur...

    10.8.5 Les instructions break et continue

    Linstruction break permet de sortir dune boucle for, while, foreach ou dun test switch par exemple.Linstruction continue permet dignorer la fin de boucle et donc de sauter les instructions de litration en cours dune boucle pour excuter les instructions delitration suivante.Un argument numrique (optionnel), par exemple break (2) indique combien de structures emboites ont t interrompues, et par exemple continue (2) indiquecombien de structures emboites ont t ignores.

    10.9 Les fonctions utilisateurs

    Vous pouvez dclarer vous-mmes des fonctions utilisateurs ou les tirer de bibliothques. On peut assimiler ces fonctions utilisateurs des sous-programmes plus oumoins complexes que lon appelle depuis le programme principal. Elles vitent aussi de rpter plusieurs fois dans le programme principal un code qui sert souvent.

    10.9.1 Dclaration dune fonction utilisateur

    10.9.2 Le mot-cl return

    Le mot-cl return permet darrter la fonction et de retourner une valeur au programme qui a appel la fonction.(20_multiplier.php)

  • return $resultat ;}// Appel de la fonction multiplieecho multiplie (10,15) ;// Affiche 150?>

    10.9.3 Dclaration et appel dune fonction

    Les arguments ayant une valeur par dfaut sont optionnels, mais les autres sont obligatoires.(19_fonction.php)

    10.9.4 Convertisseur en Euros

    (23_convertisseur_euro.php)

    10.9.5 Passage des arguments (visibilit et porte des variables)

    Variable "local" : par dfaut, une variable est visible (accessible) l o elle a t dclare. Par exemple si on la dclare dans une fonction, elle ne sera pas accessibledans le script principal, et vice versa.Variable "static" : la variable locale la fonction existe pendant tout le temps dexcution du script et conserve sa dernire valeur chaque nouvel appel de lafonction.Variable "global" : la variable est visible partout, dans la fonction et dans le script principal.

  • 10.9.6 Passage des arguments par copie

    Passage des arguments par copie : Les arguments passs une fonction le sont normalement par copie. Si la fonction modifie la copie de cette variable cela nemodifiera donc pas la variable en dehors de la fonction.

    Si on veut que marche, il est prfrable dutiliser return pour rcuprer le rsultat comme ceci :(21_parcopie.php)

    10.9.7 Passage des arguments par rfrence

    Passage des arguments par rfrence : On peut toutefois passer des arguments une fonction par rfrence. Il suffit dajouter dans la dclaration un "&" devantlargument. Alors PHP utilisera la valeur dorigine de la variable et non plus une copie.

    10.10 Scurit des formulaires

    Le formulaire est la partie dynamique du PHP, il ouvre un espace interactif entre linternaute et le site web, permettant lutilisateur denvoyer des donnes vers leserveur, et au site web de rcuprer ces donnes pour ventuellement y rpondre.Cependant en offrant lutilisateur denvoyer des donnes vers le serveur, on lui offre aussi la possibilit denvoyer des virus !... Un certain nombre de prcautionssont donc ncessaires pour bien grer certains caractres spciaux accentus ou autres, les caractres spciaux du code html, pour empcher un utilisateur denvoyerdu code malveillant dans un champ texte, pour scuriser les failles d'injection de headers de mail, etc.

    10.10.1 Caractres spciaux : urlencode, urldecode

    Avant toutes choses il faut prciser que certains caractres spciaux accentus ou autres poseraient problme parce quils ne peuvent pas tre transmis par lurl(mthode get).urlencode prend en charge les caractres spciaux

    Ensuite, bien sr, il faudra dcoder ces caractres au moment de la rcupration des donnes :

    Apprendre PHP et MySql http://www.gilbert-pernot.fr/apprendre_php.html

    18 sur 82 17/02/2015 14:22

  • 10.10.2 Scurit des champs texte : htmlentities

    Si on envoyait tel quel dans un champ texte certains caractres spciaux du code html tels que les dlimiteurs de balises les &, etc., ils seraient interprts etnon pas affichs par le navigateur. De mme, pour empcher un utilisateur denvoyer du code malveillant dans un champ texte il faut le rendre inoprant grce lafonction htmlentities de PHP. On crit alors :

    10.10.3 Scurit des champs texte : failles d'injection de headers de mail

    Ds quon laisse lutilisateur la possibilit de remplir un champ texte quelconque, la fonction mail() peut tre dtourne par des spammeurs ou hackers des finsmalveillantes : pour envoyer par exemple un mail anonyme, ou pour une arnaque quelconque.Le problme se pose si l'utilisateur peut choisir le contenu du sujet du mail, son message, l'expditeur ou le destinataire. En introduisant des sauts de lignes ou desretours chariot il peut facilement ajouter des headers supplmentaires telles que Cc, Bcc, Content-Type contenant du code malveillant (html ou autre). De mme lesheaders To, Subject, peuvent tre dfinis deux fois dans le mme but. Le dtail est expos sur le site :http://www.phpsecure.info/v2/article/MailHeadersInject.phpPour scuriser ces failles d'injection de headers de mail, une ide parmi dautres serait d'ajouter, aprs la ligne :

    $nom=$_POST["nom"];

    le code suivant :

    if (preg_match("/\r/i",$nom) || preg_match("/\n/i",$nom)){die("Ni retour la ligne ni en dbut de ligne, champ nom : (");}

    Le script est stopp grce la fonction die() si $nom contient "\r" (le retour en dbut de ligne) ou "\n" (le saut de ligne ou "Carriage Return") ou la combinaison desdeux. Le filtre vrifie tout ceci car il n'y a aucune autre raison que le piratage pour quils soient utiliss.Note : nous utilisons preg_match() et non plus eregi(), en effet il ne faut plus utiliser la fonction eregi() qui est OBSOLETE depuis PHP 5.3.0.

    10.11 Les formulaires

    10.11.1 Cration dun formulaire en HTML :

    Un formulaire est dlimit par la balise ... La balise form doit contenir un certain nombre de paramtres :

    10.11.2 O vont les donnes : action

    - action indique vers quelle page iront les donnes entres par lutilisateur aprs action du bouton envoi.En principe on a gnralement deux pages :une pour le formulaire remplir et une autre qui rcupre les donnes envoyes par votre visiteur.

    10.11.3 Transmission des donnes : mthode GET

    - method indique comment les donnes entres par lutilisateur sont transmises.- method="GET" est la mthode la plus simple : les donnes sont transmises par l'URL avec une limite de 255 caractres et avec linconvnient de transmettre lesmots de passe en clair, donc pas terrible au point de vue scurit.

    1) Pour transmettre les donnes, on peut utiliser indiffremment soit un formulaire , comme ceci :

    2) soit crire directement toutes les variables dans un simple lien construit la main comme cela :Lien

    Dans les deux cas, les variables transmises seront rcupres exactement de la mme faon, dans la variable super-globale $_GET

    La page de formulaire denvoi :(24_url-get.php)

  • $prenom = urlencode("Gilbert");$email = urlencode ("[email protected]");/* urlencode prend en charge les caractres spciaux */?>Pour envoyer des variables avec la mthode GET vous pouvez utiliser un formulaire comme ci-dessous,Entrez votre nom, votre prnom et votre email :

  • On utilise la balise Exemple :

    Syntaxe gnrale :

    Tous les paramtres sont optionnels, mais les 3 premiers paramtres type, name et value, sont peu prs indispensables pour une bonne gestion du contrle.

    Tableau des paramtres :

    Paramtre Explication Exemple Visualisation

    GenreDeControle

    C'est un mot rserv qui dtermine s'il s'agit d'une case cocher, d'un bouton ou autre.button : Simple boutontext : Zone de saisie simplepassword : Zone de mot de passe (***)file : Zone de rcupration de fichiercheckbox : Case cocherradio : Bouton Radiosubmit : Envoi de formulairereset : Remise 0 de tous les contrles

    d'un formulaire

    NomDuControle

    Un nom parlant que l'on pourra rutiliser en JavaScript. On peut normaliser les noms des contrles de la manire suivante :Button : BDCNomBoutonDeCommandetext : TXTNomZoneDeTextepassword : PWDNomZoneMotDePasse

    (Password)file : FILNomZoneDeFichiercheckbox : CACNomCaseACocherradio : BTRNomBoutonRadiosubmit : SUBNomBoutonSubmitreset : RESNomBoutonReset

    ValeurDuControle

    Le contenu du contrle. En cas de case cocher ou de bouton radio, ce nom ne sera pas visible, par contre, pour les boutons ou les zones d'dition, ValeurDuControle apparait sur le contrle

    style

    Permet de dterminer la largeur et la hauteur du contrle, mais aussi d'autres choses, comme par exemple la couleur de fond ou des caractres. Les diffrents paramtres de style sont installs entre guillemets, chaque fois spars par un point-virgule.

    Exemple dun bouton de 74 pixels de large sur 33 de haut

    Autre exemple, un bouton dont le fond est jaune : Et avec une police de caractres extra-large :

    disabled

    Une autre proprit titre d'exemple :disabled dsactive le contrle.

    Dans l'exemple, value est place droite de disabled pour montrer que l'ordre des paramtres n'a pas d'importance.

    accesskey Une autre proprit qui permet cette fois d'accder au contrle avec ALT+ la lettre convenue

    Alt-t mettra le focus sur ce bouton

    10.11.6 Les boutons : input type="button"

    - type - Pour obtenir un bouton, il est ncessaire de prciser le type comme ceci : Voici le rsultat :

    - value - Pour crire quelque chose sur ce bouton, il faut prciser lattribut value : Voici le rsultat :

    Apprendre PHP et MySql http://www.gilbert-pernot.fr/apprendre_php.html

    21 sur 82 17/02/2015 14:22

  • - name - L'attribut name permet de donner un nom ce bouton :

    - style - L'attribut style permet de dimensionner le bouton : Le voici :

    10.11.7 Des boutons graphiques

    On peut tout fait remplacer les boutons standards par une image graphique.

    10.11.8 Zone de saisie de texte : input type="text"

    Le formulaire :(28_SaisieTexte)

    Remplissez les cases ci-dessous :

    Voici quoi ressemble ce formulaire :

    Page de rcupration des donnes :(28_script.php)

    Et voici le rsultat :

    10.11.9 Champs pour mots de passe : input type="password"

    Le mot de passe restera cach, mais attention, il ne faut pas utiliser de valeur par dfaut (value) ou faire transiter ce mot de passe par la mthode GET, sinon ilredeviendrait visible.

    10.11.10 Champs cachs : input type="hidden"

    Apprendre PHP et MySql http://www.gilbert-pernot.fr/apprendre_php.html

    22 sur 82 17/02/2015 14:22

  • Le champ cach sert envoyer une valeur linsu de lutilisateur, et sans quil puisse la modifier. Les champs cachs sont utiles pour stocker des donnes dans lesformulaires en plusieurs pages, ils permettent de neffectuer le traitement qu la toute dernire page, et ce, pour viter des donnes incompltes ou incohrentes.

    10.11.11 Taille de la saisie et du texte : size, maxlength,

    Taille dynamique de la zone de saisie : avec lattribut size

    Apprendre PHP et MySql http://www.gilbert-pernot.fr/apprendre_php.html

    23 sur 82 17/02/2015 14:22

  • Et voici le rsultat :

    10.11.12 Cases cocher : input type="checkbox"

    La case cocher permet de choisir 0, 1, 2 ou plusieurs options parmi une srie de propositions. A prsent cest vous-mmes qui dfinissez les rponses possibles. Leformulaire :(31_caseacocher.php)

    Slectionnez les quipements que vous possdez dj :Un ordinateur

    Une connexion internet ADSLUn moyen de paiement en ligne, CB, etc

    Voici quoi ressemble ce formulaire :

    Page de rcupration des donnes :(31_script.php)

    Suivant que la case est coche ou non, le champ qcm1 renvoie dans la variable $_POST la valeur de value JeSuisMembre ou rien du tout.

  • Et voici le rsultat :

    10.11.13 Boutons radio : input type="radio"

    Les boutons radio fonctionnent exactement de la mme manire que les cases cocher, la seule diffrence cest quils ne permettent quun seul choix (pour lesboutons radio ayant le mme nom).

    Le formulaire :(32_boutonsradio.php)

    Vous tes : Mari(e) Clibataire Divorc(e)

    Page de rcupration des donnes :(32_script.php)

    10.11.14 Liste de slection droulante :

    Elle permet de faire un choix dans une liste dlments affichs.

    Le formulaire :(33_listederoulante.php)

    Votre salaire mensuel : slectionnez et envoyez

    Moins de 1000 Entre 1000 et 2000

    Entre 2000 et 4000 Plus de 4000

    Apprendre PHP et MySql http://www.gilbert-pernot.fr/apprendre_php.html

    25 sur 82 17/02/2015 14:22

  • Voici quoi ressemble ce formulaire avec size="3":

    Si size nest pas prcise ou si size="1"nous naurons quune ligne de la liste affiche :

    Page de rcupration des donnes :(33_script.php)

    10.11.15 Envoi de fichiers et dimages : input type="file"

    Ladministrateur dun site de-commerce, par exemple, peut trs bien envoyer la nouvelle image dun produit ou un fichier PDF contenant sa description dtaille.On utilise pour cela la balise mais en plus, dans la balise lattribut enctype="multipart/form-data" nous permet de prciser que lesdonnes envoyes ne sont pas du texte.

    Le formulaire :(34_envoifichiers.php)

    Formulaire denvoi de fichiers et dimages : slectionnez et envoyez

    Apprendre PHP et MySql http://www.gilbert-pernot.fr/apprendre_php.html

    26 sur 82 17/02/2015 14:22

  • Page de rcupration des donnes :Pour rcuprer le fichier on utilise la super globale $_FILES[] de php. Cest un tableau associatif 2 dimensions : en premier on a le nom de champ du formulaire(name="fichier" dans notre cas) et en second des informations sur le fichier transmis.Dans la page de rcupration des donnes il faut aussi sauvegarder ce fichier, le traiter, le copier, le redimensionner, etc.move_uploaded_file() dplace le fichier depuis son emplacement temporaire sur le serveur jusqu sa destination finale.

    (34_script.php)

    10.11.16 Une calculatrice

    (36_calculatrice.php)

  • $ope = "-"; $sel2 = 'selected'; break; case "mult": $resultat=$nnb1*$nnb2;

    $ope = "*"; $sel3 = 'selected'; break; case "div":

    $ope = "/"; $resultat=$nnb1/$nnb2; $sel4 = 'selected'; break;}echo 'Rsultat : '.$nnb1.' '.$ope.' '.$nnb2.' = '.$resultat.'';echo 'Autre opration ?';/**/} else {// S'il y a des champs videsecho 'merci de remplir les champs nombres et de choisir un operateur';}}?>

    oprande

    +-*/oprateur2e oprande

    10.12 Formulaires denvoi de mails

    10.12.1 Un envoi de mail tout simple

    Je nai pas russi le faire fonctionner en local sur ma machine Windows, mais il marche trs bien quand je le mets sur le serveur de mon hbergeur.

    (35_form_mail1.php)

  • $tel = "";$mail = "";$subject = "";$message = "";$msg_nom = "";$msg_mail = "";if($_POST){

    //Rcupration des donnes du formulaire----------------------------$nom = $_POST["nom"];$prenom = $_POST["prenom"];$tel = $_POST["tel"];$mail = $_POST["mail"];$subject = $_POST["subject"];//------------------------------------------------------------------

    $destinataire = "[email protected]"; $expediteur = $mail;

    $message .= $_POST['nom']."\n"; $message .= $_POST['prenom']."\n"; $message .= $_POST['tel']."\n"; $message .= $_POST['mail']."\n"; $message .= $_POST['message']."\n";

    /* adresse de l'expditeur ci-dessous c'est dire le Site Web */ /* $headers ='From: "SiteWeb"'."\n"; */ $headers ='From: "SiteWeb"'."\n"; $headers .='Reply-To: [email protected]'."\n"; $headers .='Content-Type: text/plain; charset="iso-8859-1"'."\n"; $headers .='Content-Transfer-Encoding: 8bit';

    /* adresse du destinataire ci-dessous */ if(mail($destinataire, $subject, $message, $headers)) { echo 'Le message a bien t envoy'; } else { echo 'Le message n\'a pas pu tre envoy'; }}?>

    ( * : Champs obligatoires ) Nom * :

  • (35_form_mail3.php)

  • {$msg_message = 'Veuillez entrez votre message ici';

    $valide_form = FALSE;}

    }

    //------------------------------------------------------------------ if ( $_POST['verif'] && $valide_form === TRUE )

    {// Cration du message avec les donnes du formulaire

    $message = $_POST['nom']."\n";$message .= $_POST['prenom']."\n";$message .= $_POST['tel']."\n";$message .= $_POST['mail']."\n";$message .= $_POST["subject"];$message .= $_POST['message']."\n";

    // Cration des enttes/* adresse de l'expditeur ci-dessous c'est dire le Site Web*/$headers ='From: "SiteWeb"'."\n";$headers .='Reply-To: [email protected]'."\n";$headers .= 'MIME-Version: 1.0' . "\n";$headers .='Content-Type: text/plain; charset="iso-8859-1"'."\n";/* $headers .= 'Content-type: text/html; charset=iso-8859-1' . "\n"; */$headers .='Content-Transfer-Encoding: 8bit';/* adresse du destinataire ci-dessous*/$destinataire = "[email protected]";

    // envoi du mail $resultat = mail($destinataire, $subject, $message, $headers);

    if($resultat) {echo "Le message a bien t envoy";/* Redirige le client vers la page suivante *//* header("Location: 35_form_mail_suite2.php?nom=".$nom);Note : header ne marche que si les enttes nont pas t dj envoyes *//* Par contre , marche tous les coups : *//* echo "Cliquez ici pour revenir l'accueil";*//* Autre solution plus "lgante" ... */$nom = urlencode($nom);$prenom = urlencode($prenom);/* urlencode prend en charge les caractres spciaux */echo "";/* le 3 dtermine le nombre de secondes ou l'ancienne page doit rester affiche l'cran. Si ce nombre est gal 0,la redirection est instantane.*/exit();

    } else {echo "Le message n'a pas pu tre envoy";

    }/* Garantie que le code ci-dessous n'est jamais excut.exit(); */

    }else{$nom = $_POST['nom'];$prenom = $_POST['prenom'];$tel = $_POST['tel'];$mail = $_POST['mail'];$subject = $_POST["subject"];$message = $_POST["message"];

    echo "Le message n'a pas pu tre envoy";}//------------------------------------------------------------------

    }?>

    ( * : Champs obligatoires ) Nom * :

  • Email * :
  • ?>

    10.13.2 Lecture dun fichier texte : file_get_contents() ou file()

    file_get_contents() prend en argument le nom et ladresse du fichier et retourne son contenu sous forme dune chane de caractres. Syntaxe :

    file() prend en argument le nom et ladresse du fichier et retourne son contenu dans un tableau ligne ligne. Syntaxe :

    10.13.3 Lecture dun fichier de configuration : parse_ini_file()

    Le fichier de configuration :(40_test.ini); les commentaires commencent par un point virgule; Fichier test.ini [text]accept=*.gif,*.jpg,*.png,*.txt,*.log,*.mid,*.wav,*.zipignore=*.exe,*.com,*.bat,*.dll,*.ini,*.vbs,*.js,*.htm,*.html,*.phpnetwork=Undernetcommandchar=/linesep=-timestamp=[HH:nn]theme=mIRC Classic[dirs]logdir=logs\

    Lecture du fichier de configuration :(40_LectureFichierConfig) parse_ini_file() prend en argument le nom et ladresse dun fichier de configuration et retourne son contenu sous forme dun tableauassociatif. Syntaxe :

    10.13.4 Lecture dun fichier CSV issu dun tableur : fgetcsv()

    Pour lire un fichier CSV (Comma Separated Values) issu dun tableur (Excel ou Open Office), il faut dabord louvrir avec fopen(), puis fgetcsv() permet de lire uneligne du fichier.Arguments :fgetcsv(nom_fichier, nbmax_caract_ligne, " ;") ;

    Le fichier *.csv :(41_Fichierdetableur.csv)

    Titre;PagePour commencer;3Dtails de votre installation;3 quoi sert le PHP;3Balises d'ouverture - fermeture;3Commentaires;3Le point virgule;3Apostrophes et guillemets;3Variables et constantes;4Les $variables;4Les CONSTANTES;4

    Apprendre PHP et MySql http://www.gilbert-pernot.fr/apprendre_php.html

    33 sur 82 17/02/2015 14:22

  • Quelques Gadgets;4Afficher la date du jour;4Validit dune date saisie;5Temps dexcution dun script php;5Rcuprer mon adresse IP;6Les oprateurs;6Les oprations;6"Le Modulo '$a % 2 ;'";7Oprateurs d'incrmentation;7Oprateurs de concatnation;7Oprateurs de comparaison;7Oprateurs logiques :;7

    Le fichier de lecture dun fichier CSV :(41_LectureFichierCSV.php)

    10.13.5 Ecriture dans un fichier : file_put_contents()

    Arguments :file_put_contents ('nom_fichier.txt', "chane contenue dans le fichier $var", FILE_APPEND) ;

    La chane est alors crite dans le fichier en crasant ce qui prexistait.Loption FILE_APPEND permet dajouter ce contenu la fin.

    10.13.6 Ouverture dun fichier : fopen()

    fopen('nom_adresse_fichier.txt', 'mode') ; ouvre un fichier.

    Le paramtre mode spcifie le type d'accs'r' Ouvre en lecture seule, et place le pointeur de fichier au dbut du fichier.'r+' Ouvre en lecture et criture, et place le pointeur de fichier au dbut du fichier.'w' Ouvre en criture seule ; place le pointeur de fichier au dbut du fichier et rduit la taille du fichier 0. Si le fichier n'existe pas, on tente de le crer.'w+' Ouvre en lecture et criture ; place le pointeur de fichier au dbut du fichier et rduit la taille du fichier 0. Si le fichier n'existe pas, on tente de le crer.'a' Ouvre en criture seule ; place le pointeur de fichier la fin du fichier. Si le fichier n'existe pas, on tente de le crer.'a+' Ouvre en lecture et criture ; place le pointeur de fichier la fin du fichier. Si le fichier n'existe pas, on tente de le crer.'x' Cre et ouvre le fichier en lecture seule ; place le pointeur de fichier au dbut du fichier. Si le fichier existe dj, fopen() va chouer, en retournant FALSE et engnrant une erreur de niveau E_WARNING. Si le fichier n'existe pas, fopen() tente de le crer. Ce mode est l'quivalent des options O_EXCL|O_CREAT pourl'appel systme open(2) sous-jacent. Cette option est supporte partir de PHP 4.3.2 et fonctionne uniquement avec des fichiers locaux.'x+' Cre et ouvre le fichier pour lecture et criture; le comportement est le mme que pour 'x'.'c' Ouvre le fichier pour criture seulement. Si le fichier n'existe pas, il sera cre, s'il existe, il n'est pas tronqu (contrairement 'w') et l'appel la fonction n'chouepas (comme dans le cas de 'x'). Le pointeur du fichier est positionn au dbut. Ce mode peut tre utile pour obtenir un verrou (voyez flock()) avant de tenter demodifier le fichier, utiliser 'w' pourrait tronquer le fichier avant d'obtenir le verrou (vous pouvez toujours tronquer grce ftruncate()).'c+' Ouvre le fichier pour lecture et criture, le comportement est le mme que pour le mode 'c'.'b' lorsque vous travaillez avec des fichiers binaires, sinon vous pourriez rencontrer des problmes avec vos donnes, comme des images corrompues ou descaractres \r\n inopins.

    10.13.7 Verrouillage dun fichier : flock()

    flock Verrouille le fichier : un systme simple de verrous criture/lecture, qui peut tre utilis sur n'importe quelle plate-forme (Unix et Windows compris).

    Lopration peut prendre une des valeurs suivantes : LOCK_SH pour acqurir un verrou partag (lecture). LOCK_EX pour acqurir un verrou exclusif (criture).

    Apprendre PHP et MySql http://www.gilbert-pernot.fr/apprendre_php.html

    34 sur 82 17/02/2015 14:22

  • LOCK_UN pour librer un verrou (partag ou exclusif).Il est galement possible d'ajouter LOCK_NB comme masque d'une des oprations prcdentes si vous ne voulez pas que la fonction flock() bloque durant le verrouillage. (non support sousWindows)

    Exemple 1 :

    Exemple 2 : flock() en utilisant l'option LOCK_NB

    10.13.8 Tronquer un fichier : ftruncate()

    ftruncate Tronque un fichier bool ftruncate ( resource $handle , int $size )Prend le pointeur de fichier handle et le tronque la taille de size.

    Exemple :

    10.13.9 Fermer un fichier : fclose()

    Quand on a fini dutiliser un fichier, il faut le fermer pour librer les ressources systme.Arguments :

    fclose('monfichier.txt') ;

    10.13.10 Lire un fichier : fread()

    Arguments :

    fread('nom_adresse_fichier.txt', nboctets) ; lit un fichier entier et retourne une chane de caractres.

  • 10.13.12 Taille dun fichier : filesize()

    Arguments :

    filesize('nom_adresse_fichier.txt') ; retourne la taille en octets du fichier.

    10.14 Fichiers et gestion documentaire

    Voici un exemple dutilisation de fichiers dans le cadre dune gestion de documents partags par plusieurs utilisateurs. Chaque utilisateur doit pouvoir modifier ledocument, le script gre les numros de version et avertit si 2 personnes ont modifi la mme version. A ce stade il nest pas ncessaire dutiliser une base dedonnes.

    Dfinir :Linterface pour envoyer un fichier par formulaireLinterface pour rcuprer les initiales de la personne qui modifie le fichier

    Structure des noms de fichiers :nomDocument-VersionNo-initialesDernierAuteur.extension

    10.14.1 Le formulaire

    (43_GEDenvoifichiers.php)

  • echo "Page de rcupration des donnes :";/* remet le compteur zro et ajoute 30 secondes au temps dj coul */set_time_limit("30");/* si l'utilisateur arrte le tlchargement en cours, ou se dconnecte, le script php se terminera quand mme */ignore_user_abort();/* nom et adresse dorigine du fichier sur le disque utilisateur */$initialesAuteur = $_POST['initialesAuteur'];/* echo "initialesAuteur : $initialesAuteur"; */$nom_fichier = $_FILES['fichier'] ['name'];/* taille du fichier en octets */$taille = $_FILES['fichier'] ['size'];/* nom et adresse du fichier temporaire sur le serveur (fichier dtruit la fin du script) */$tmp = $_FILES['fichier'] ['tmp_name'];/* type mime du fichier */$type = $_FILES['fichier'] ['type'];/* code derreur associ au tlchargement */$erreur = $_FILES['fichier'] ['error'];// -----------------------------------------------------------------------------/* on ne garde que le nom du fichier, pas son chemin d'accs */$nom_fichier = basename($nom_fichier);/* on rcupre l'extension du fichier (aprs le dernier point de la chane) */$dernierPoint = strrpos($nom_fichier, '.');$extension = substr($nom_fichier, $dernierPoint);$nom_fichier = substr($nom_fichier, 0, $dernierPoint);/* on rcupre les initiales du prcdent auteur */$dernierTiret = strrpos($nom_fichier, '-') ;$ancienAuteur = substr($nom_fichier, $dernierTiret +1);$nom_fichier = substr($nom_fichier, 0, $dernierTiret);/* on rcupre le numro de l'ancienne version */$dernierTiret = strrpos($nom_fichier, '-');$ancienneVersion = substr($nom_fichier, $dernierTiret +1);$nom_fichier = substr($nom_fichier, 0, $dernierTiret);/* le reste est le nom du document */$document = $nom_fichier;// -----------------------------------------------------------------------------/* dans le rpertoire, voyons maintenant quelle est la dernire version de ce document */$versionActuelle = 0 ;foreach(glob($document.'-*-*'.$extension) as $fichier){$debut = strpos($fichier, '-' ) +1;$longueur = strrpos($fichier, '-' ) - $debut;$version = substr($fichier, $debut, $longueur );if($version > $versionActuelle)

    {$versionActuelle = $version;$fichierActuel = $fichier;}

    }// -----------------------------------------------------------------------------/* interprtation et envoi des rsultats ci-dessus l'utilisateur */session_start();if($versionActuelle > $ancienneVersion)

    {echo "Le document a t modifi depuis votre dernire visite. ";echo "Merci de rcuprer la dernire version ($fichier), ";echo "de la mettre jour et de la renvoyer.";}else{$fichier = $document

    .'-'.($ancienneVersion +1)

    .'-'.$initialesAuteur

    .$extension;}

    // -----------------------------------------------------------------------------/* l'adresse de destination = $fichier, c'est l o le fichier sera sauvegard sur le serveur *//* echo "Adresse de destination = $fichier"; */move_uploaded_file($_FILES['fichier']['tmp_name'], $fichier);/* dtection derreurs */if ($erreur = $_FILES['fichier'] ['error']){ echo "Une erreur sest produite" ; if ($erreur == UPLOAD_ERR_INI_SIZE)

    echo "Fichier plus gros que le maximum autoris par PHP" ; elseif ($erreur == UPLOAD_ERR_FORM_SIZE)

    echo "Fichier plus gros quindiqu dans le formulaire" ; elseif ($erreur == UPLOAD_ERR_PARTIAL)

    echo "Tlchargement interrompu avant la fin, merci de ressayer" ; elseif ($erreur == UPLOAD_ERR_NO_FILE)

    echo "Aucun fichier na t tlcharg" ;}else{

    echo "Fichier correctement mis jour vers $fichier" ;}?>

    Apprendre PHP et MySql http://www.gilbert-pernot.fr/apprendre_php.html

    37 sur 82 17/02/2015 14:22

  • 10.15 Les cookies

    Les cookies sont des petits fichiers texte (faisant au maximum 65 Ko) sauvegards par le navigateur sur la station utilisateur et qui permettent de conserver desinformations sur un utilisateur : se souvenir de son nom pour lui viter de le ressaisir la prochaine authentification, ou des fins statistiques, ou se souvenir desinformations dun formulaire pour lui viter de les ressaisir la prochaine fois, ou le pr remplir, se souvenir des sites visits, etc.Toutefois, les donnes sensibles et confidentielles ne doivent pas tre stockes dans des cookies, car ces derniers sont accessibles et modifiables par lutilisateur.

    10.15.1 Ecriture et lecture dun cookie : setcookie(), $_COOKIE[]

    Une seule fonction gre les cookies :

    setcookie (nomcookie, valeur, dureeDeVie) ; valeur est une chane dureeDeVie du cookie : 24 heures => time()+ 60*60*24On accde aux cookies laide du tableau $_COOKIE[]

    Exemple 1 :(45_cookies.php)

    Les cookies

    Exemple 2 :(45_cookie2.php)

    Un cookie envoy

    Un cookie a t envoyson nom est langageson contenu est PHP version 5

    Apprendre PHP et MySql http://www.gilbert-pernot.fr/apprendre_php.html

    38 sur 82 17/02/2015 14:22

  • Erreur cookie

    Erreur cookie

    10.15.2 Suppression dun cookie : setcookie(), sans valeur

    Pour effacer un cookie on envoie un cookie de mme nom, ou avec un temps de vie dpass.

    Exemple :(45_cookieSuppr.php)

  • {die("Ni retour la ligne ni retour dbut de ligne, champ prenom : (");}if (preg_match("/\r/i",$mail) || preg_match("/\n/i",$mail)){die("Ni retour la ligne ni en dbut de ligne, champ mail : (");}//------------------------------------------------------------------// Gestion des erreurs de saisie-------------------------------------

    /* Vrifier la validit des champs du formulaire */ $valide_form = TRUE;

    // le formulaire doit etre vrifiif ( !$_POST['nom']) //le nom n'est pas renseign{

    $msg_nom = 'Il manque votre nom ici'; $valide_form = FALSE;

    }if ( !$_POST['prenom']) //le prnom n'est pas renseign{

    $msg_prenom = 'Il manque votre prnom ici'; $valide_form = FALSE;

    }if ( !is_email($_POST['mail']) ) //le mail n'est pas correct{

    $msg_mail = 'Veuillez vrifier votre adresse mail ici'; $valide_form = FALSE;

    }//------------------------------------------------------------------

    // fonction nous permettant de faire des redirectionsfunction redirection($url){

    if (headers_sent()){print('');

    }else {

    header("Location:$url");}

    }/* on effectue une redirection vers la page d'accueilredirection ('45_cookieForm2.php'); */

    }/* else {

    echo 'La variable du formulaire n\'est pas dclare.';} */?>

    Formulaire du site

    Apprendre PHP et MySql http://www.gilbert-pernot.fr/apprendre_php.html

    40 sur 82 17/02/2015 14:22

  • Votre prnom (*)

  • 10.15.5 Personnaliser linterface graphique de la page laide dun cookie

    On cre un systme qui permet au visiteur de choisir pour un an la couleur de fond du site parmi une slection.

    Linterface graphique dune page :(47_interface.php)

    Cookie : Personnalisation d'interface

  • choix de la couleur de fond :rougebleuvertorangejauneblanc

    choix du titre :SalutBienvenueBonjourHelloWelcome

    Pour dtruire le cookie :(47_interface_kill.php)

    10.16 Les sessions

    Les donnes sensibles et confidentielles ne doivent pas tre stockes sur la machine utilisateur dans des cookies, car ces derniers sont accessibles et modifiables parlutilisateur. Les sessions sont mieux adaptes la sauvegarde de donnes confidentielles ou importantes telles que:- Lauthentification dun visiteur ;- Les donnes de lutilisateur tant quil reste connect lapplication ;- Le panier dachats du visiteur dun site marchand ;- Les formulaires en plusieurs parties, pour retenir les informations fournies par lutilisateur dans les pages prcdentes.Toutefois, les sessions ne sont pas faites pour durer : aprs la visite de linternaute, et ds la fermeture du navigateur, la session est perdue (comme un cookie sansdate dexpiration).

    10.16.1 Comment marche une session

    Contrairement aux cookies, PHP stocke les informations dune session sur le serveur (et non plus sur la machine utilisateur). Le visiteur se voit attribuer unidentifiant. Et chaque fois que le visiteur revient en annonant son identifiant, PHP restitue toutes les informations quil avait sauvegardes propos de ce visiteur.

    Processus simplifi :1) Le client (machine utilisateur) fait une premire demande de page ;2) Le serveur cre un identifiant de session, stocke les informations de sessions dans un fichier de sessions qui a pour nom cet identifiant, puis rpond en renvoyantla page et lidentifiant de session ;3) Ensuite le client peut refaire une 2e demande de page avec lidentifiant de session ;4) Lidentifiant de session permet au serveur de rcuprer les donnes dans le fichier de sessions qui a pour nom cet identifiant.5) Le serveur rpond en renvoyant la page et lidentifiant de session.

    10.16.2 Lecture et criture de sessions

    Pour crer une session il faut dabord initialiser la session avec :session_start();Note : Quand on fait session_start(); PHP cherche lidentifiant attribu lutilisateur dans un cookie nomm par dfaut PHPSESSID. Si ce cookie nexiste pas, unnouvel identifiant alatoire est cr puis envoy au navigateur dans un cookie sans date dexpiration (donc phmre).

    Linitialisation doit se faire dans tous les scripts PHP qui utilisent les sessions, pas seulement le premier. Quand ceci est fait, on peut lire et crire dans la variablesuper globale :$_SESSION['...']Cette variable super globale est un tableau dans lequel on peut ajouter, enlever ou modifier autant de variables (ou autres) que lon veut.

    Exemple : code placer avant lentte, et mettre dans toutes les pages scurises.(48_session.php)

  • echo 'langage existe dans la session et sa valeur est ';echo $_SESSION['langage'];} else {echo 'langage n\'existe pas dans la session donc je la cre';// Sinon on crit la variable 'langage' dans la session$_SESSION['langage'] = 'PHP5';// On peut stocker des tableaux, des nombres, du texte, des objets (sans avoir les srialiser)$tableau = array('un', 'deux', 'trois', 'quatre');$_SESSION['tab'] = $tableau;}echo 'identifiant cr : ', session_id(),'' ;?>

    10.16.3 Suppression dune session : session destroy();

    Normalement cest inutile puisque PHP efface automatiquement les fichiers sessions inutiliss depuis plus dune heure et demie.Cependant session_destroy(); efface le fichier de donnes, mais pas les variables contenues dans $_SESSION[], ni le cookie.

    Exemple :(49_session_destroy.php)

    10.16.4 Autres instructions (facultatives)echo 'L\'identifiant cr est : ', session_id(),'' ; // donne lid de sessionsession_regenerate_id() // rgnre lid chaque aller-retour ce qui scurise un peu plussession_name('client') // le nom de la session sera 'client'session_save_path() // donne ladresse du rpertoire temporaire de stockage des donnes sessionsession_save_path('/tmp') // le nom du rpertoire de stockage des sessions sera tmpsession_set_cookie_params(nomcookie, valeur, dureeDeVie) /* O le nomcookie et la valeur sont facultatifs(PHP leur donne le nom et lidentifiant de la session). Dure de vie du cookie : 24 heures => time()+ 60*60*24 */

    10.16.5 Quelques rgles de scurit

    1) Stocker les sessions dans un rpertoire priv : Dans le cas dun serveur partag, il ne faut laisser quiconque laccs aux sessions. Pour cela il faut dfinir, pourstocker les sessions, un rpertoire auquel vous seul avez accs :session.save_path = "/home/user/repertoire/personnel"

    2) Ne pas utiliser la fonction de rcriture des liens dans lURL. Dans un tel cas lidentifiant de session figurerait en clair dans la barre dadresses et serait tropfacile pirater.

    3) Les identifiants par dfaut crs par PHP suffisent : vitez de dfinir vous-mmes les identifiants de session mme si PHP vous le permet.

    4) Attaque par "fixation de session" : un attaquant peut fournir la victime, avant quelle sauthentifie, un numro de session connu. Il peut ainsi bnficier de sonauthentification ensuite. La parade consiste faire appel :- session_regenerate_id() chaque fois, avant dauthentifier le visiteur, ou avant de stocker pour la premire fois des informations trs confidentielles ;- session.use_only_cookie dans le fichier de configuration de PHP.

    5) Vrifier lidentit de lutilisateur : en plus de son nom, stockez dans la session son adresse IP, la version de son navigateur, etc. Ceci est insuffisant, maisajoute des difficults notre attaquant.

    6) Ne pas stocker le mot de passe dans la session : Stockez dans la session le nom du visiteur, mais pas le mot de passe lui-mme : vrifiez juste si le mot de passeest valide.

    10.17 Utiliser une base de donnes MySQL

    Apprendre PHP et MySql http://www.gilbert-pernot.fr/apprendre_php.html

    44 sur 82 17/02/2015 14:22

  • Table abonns Table clients

    nom-1 r-1

    nom-2 r-2

    nom-3 r-3

    Table abonns Table clients

    nom-1 r-1

    nom-2 r-2

    nom-3 r-3

    Table abonns Table clients

    10.17.1 La structure d'une base de donnes

    Une base de donnes contient une ou plusieurs table(s).

    Base de donnes

    Une table contient plusieurs enregistrements.

    Base de donnes

    Un enregistrement contient un ou plusieurs champs. Et un champ contient des donnes.

    Base de donnes

    10.17.2 Les formats des donnes en MySQL

    Les donnes numriques :Elles peuvent tre signes (signed) ou non signes (unsigned).

    Type de champ DescriptionTINYINT Trs petit entier. Compris entre -128 et 127 en signed et entre 0 et 256 en unsigned.SMALLINT Petit entier. Compris entre -32 768 et 32 0767 en signed et entre 0 et 65535 en unsigned.MEDIUMINT Entier moyen. Compris entre -8 388 608 et 8 388 607 en signed et entre 0 et 16 777 215 en unsigned.INT Entier. Compris entre 2 147 483 648 et 2 147 483 647 en signed et entre 0 et 4 294 967 295 en

    unsigned.BIGINT Grand entier. Compris entre -9 233 372 036 854 et 9 223 372 036 854 775 807 en signed et entre

    0 et 18 446 744 073 709 551 615 en unsigned.FLOAT Nombre virgule flottante en prcision simple. L'intervalle de validit va de -3.402823466E+38

    -1.175494351E-38 en signed et entre 0 et de 1.175494351E-38 3.402823466E+38 en unsigned.DOUBLE Nombre virgule flottante en prcision double. L'intervalle de validit va de

    -1.7976931348623157E+308 -2.2250738585072014E-308 en signed et de 2.2250738585072014E-308 1.7976931348623157E+308 en unsigned.

    DECIMAL Nombre virgule flottante sign. Les nombres sont enregistrs sous forme de chanes de caractres.

    Pour plus de prcisions, reportez-vous la documentation de MySQL.

    Les chanes de caractres :

    Type de champ DescriptionCHAR(x) Chane de caractres de longueur fixe o x (compris entre 1 et 256) est le nombre de caractres.VARCHAR(x) Chane de caractres de longueur variable o x (compris entre 1 et 256) est le nombre de caractres.TINYTEXT Chane de 256 caractres maximum.TEXT Chane de 65 585 caractres maximum.

    Apprendre PHP et MySql http://www.gilbert-pernot.fr/apprendre_php.html

    45 sur 82 17/02/2015 14:22

  • MEDIUMTEXT Chane de 16 777 215 caractres maximum.LONGTEXT Chane de 4 294 967 295 caractres maximum.

    Pour plus de prcisions, encore une fois, reportez-vous la documentation de MySQL.

    10.17.3 Les oprateurs de MySQL

    Les oprateurs arithmtiques :

    Oprateur Description + Addition - Soustraction * Multiplication / Division

    Les oprateurs de comparaison :

    Oprateur Description = Egal != Ingal < Infrieur Suprieur >= Suprieur ou gal

    Les oprateurs logiques :

    Oprateur Description NOT ou | NON logique OR ou || OU logique AND ou && ET logique

    10.17.4 PhpMyAdmin

    PhpMyAdmin se prsente comme un site Web (en local). Cest un ensemble de scripts PHP permettant de grer facilement et visuellement la base de donnesMySQL sans devoir passer par l'apprentissage du langage SQL.

    La page daccueil de PhpMyAdmin se prsente comme ceci :

    Apprendre PHP et MySql http://www.gilbert-pernot.fr/apprendre_php.html

    46 sur 82 17/02/2015 14:22

  • PhpMyAdmin peut ainsi :

    Crer et supprimer des bases de donnes. Crer, modifier et supprimer des tables. diter et ajouter des champs. Insrer des donnes. Grer de multiples utilisateurs avec des permissions diffrentes.

    10.17.5 Crer une base de donnes MySQL avec PhpMyAdminPour la suite de l'apprentissage de MySQL, nous aurons besoin d'une base de donnesque nous allons crer avec PhpMyAdmin.

    Pour ouvrir PhpMyAdmin : Il faut cliquer sur la petite icne verte en bas droite de votrecran.

    Un panneau (ci-contre droite) vous permet alors daccder peu prs tous les services,y compris PhpMyAdmin. Cliquez sur PhpMyAdmin.

    Crons sur le serveur MySQL une base de donnes nomme "base1", comme ceci :

    Et voici le rsultat :

    Apprendre PHP et MySql http://www.gilbert-pernot.fr/apprendre_php.html

    47 sur 82 17/02/2015 14:22

  • 10.17.6 Crer des tables dans une base de donnes MySQL avec PhpMyAdmin

    Dans cette base de donnes, nous allons crer la table liste. La table liste comportera 3 champs :

    un index id, un entier qui servira de cl primaire. un champ nom qui pourra contenir une chane de 50 caractres. un champ email qui pourra contenir une chane de 70 caractres.

    "Nombre de colonnes" correspond au nombre de champs, ici nous avons demand 3 champs, il y aura donc 3 colonnes.

    Cliquez sur Excuter.

    Sur lcran suivant, dfinissez les caractristiques de vos champs comme ceci :

    Quand cest fait, cliquez sur Sauvegarder en bas droite de la page.

    PhpMyAdmin vous demande beaucoup d'informations mais il n'est pas ncessaire de tout remplir. La plupart du temps, les informations les plus utiles seront :

    Champ : permet de dfinir le nom du champ (important !)

    Apprendre PHP et MySql http://www.gilbert-pernot.fr/apprendre_php.html

    48 sur 82 17/02/2015 14:22

  • Type : le type de donnes que va stocker le champ (nombre entier, texte, date...) Taille/Valeurs : permet d'indiquer la taille maximale du champ, utile pour le type VARCHAR notamment afin de limiter le nombre de caractres autoriss. Index : active l'indexation du champ. Ce mot barbare signifie dans les grandes lignes que votre champ sera adapt aux recherches. Le plus souvent, on utilisel'index PRIMARY sur les champs de type id. AUTO_INCREMENT : permet au champ de s'incrmenter tout seul chaque nouvelle entre. On l'utilise frquemment sur les champs de type "id".

    Remplissons donc le formulaire comme ci-dessus. Veillons bien cocher AUTO_INCREMENT et dfinir un index PRIMARY sur le champ id.Une fois que c'est fait, cliquez sur le bouton Sauvegarder en bas de la page. Votre table est cre !

    On obtient alors lcran ci-dessous :

    10.17.7 Les types de champs MySQL (PhpMyAdmin)

    Si vous droulez la liste des types de champs que vous propose MySQL, vous constaterez quilssont trs nombreux (voir ci-contre droite). En fait, phpMyAdmin a eu la bonne ide de proposerau tout dbut de cette liste les 4 types de donnes les plus courants :

    INT : nombre entier. VARCHAR : court texte (entre 1 et 255 caractres). TEXT : long texte (on peut y stocker un roman sans problme). DATE : date (jour, mois, anne).

    Nous n'aurons besoin de jongler qu'entre ces 4 types, donc ce sont eux qu'il faut retenir. Ilscouvriront 99% de nos besoins. Vous pouvez aussi garder en tte le type DOUBLE qui permet destocker des nombres dcimaux.

    Alors que PHP ne propose que quelques types de donnes comme int, string, bool..., MySQLpropose une quantit trs importante de types de donnes. Les types de donnes sont classs parcatgories :

    NUMERIC : ce sont les nombres. On y trouve des types ddis aux petits nombres entiers(TINYINT), aux gros nombres entiers (BIGINT), aux nombres dcimaux, etc. DATE and TIME : ce sont les dates et les heures. De nombreux types diffrents permettent destocker une date, une heure, ou les deux la fois.

    Apprendre PHP et MySql http://www.gilbert-pernot.fr/apprendre_php.html

    49 sur 82 17/02/2015 14:22

  • STRING : ce sont les chanes de caractres. L encore, il y a des types adapts toutes lestailles. SPATIAL : cela concerne les bases de donnes spatiales, utile pour ceux qui font de lacartographie. Ce ne sera pas notre cas, donc nous n'en parlerons pas ici.

    10.17.8 Insrer un enregistrement de donnes avec PhpMyAdmin

    Slectionnez longlet "Insrer", puis remplissez la case "valeur" pour chaque champ, comme ceci :

    Cliquez sur "Excuter" pour enregistrer cet lment de la base.

    Cliquez sur longlet "Afficher" pour visualiser les champs ainsi crs :

    10.17.9 Ajouter un champ une table avec PhpMyAdmin

    Slectionnez l'onglet "Structure" de la table, puis choisissez "Ajouter 1 colonne" en fin de table, comme ceci :

    Apprendre PHP et MySql http://www.gilbert-pernot.fr/apprendre_php.html

    50 sur 82 17/02/2015 14:22

  • Cliquez sur "Excuter" pour enregistrer ce nouveau champ de la base.

    10.18 Utiliser MySql depuis PHP

    10.18.1 Crer un utilisateur administrateur

    Il est essentiel de scuriser nos accs la base de donnes. User = admin01 Mot de passe = monmotdepasse Droits = tous les droitsOuvrez PhpMyAdmin, slectionnez la base de test (base1), et cliquez sur longlet "Privilges".

    Conservez lutilisateur "root" et "ajoutez un utilisateur" entrez le nom, le serveur, le mot de passe comme indiqu. Donnez tous les privilges sur la base dedonnes (base1), et quant aux privilges globaux, choisissez "Tout cocher", enfin, cliquez sur "excuter" en bas droite de lcran.

    Revenez sur base1 et cliquez sur longlet "Privilges" pour vrifier si vous trouvez maintenant deux utilisateurs, root, et admin1 que vous venez de crer.Assurez-vous que lutilisateur admin1 a bien "Grant" = oui et cest fini.

    10.18.2 Se connecter la base de donnes MySql depuis PHP

    Apprendre PHP et MySql http://www.gilbert-pernot.fr/apprendre_php.html

    51 sur 82 17/02/2015 14:22

  • La connexion MySQL s'effectue soit avec la mthode mysqli_ (appele disparatre plus ou moins longue chance) soit avec la mthode PDO (PHP DataObject). PDO est un socle commun standard toutes les SGBD, cette mthode est donc recommande car aussi, elle seule a de lavenir ! - A chaque exemple nousvous proposons des exemples tests avec les deux mthodes.

    PHP propose plusieurs moyens de se connecter une base de donnes MySQL : L'extension mysql_ : ce sont des fonctions obsoltes qui permettent d'accder une base de donnes MySQL et donc de communiqueravec MySQL. Leur nom commence toujours par mysql_. Toutefois, ces fonctions ont vieilli et on recommande de ne plus les utiliser aujourd'hui. L'extension mysqli_ : ce sont des fonctions amliores d'accs MySQL. Elles proposent plus de fonctionnalits et sont plus jour. L'extension PDO : c'est un outil complet qui permet d'accder n'importe quel type de base de donnes. On peut donc l'utiliser pour seconnecter aussi bien MySQL que PostgreSQL ou Oracle.

    10.18.2 - 1) Connexion MySQL - mthode oriente objet (PDO)

    Pour se connecter depuis une page PHP une base de donnes MySQL, on spcifie plusieurs paramtres : Lhte (le serveur sur lequel MySQL est install). Par dfaut, "localhost". Le nom de la base de donnes. Obligatoire Le login utilisateur ou Username. Par dfaut, "root". Le mot de passe. Par dfaut, "".Comme ceci :

    Script de connexion complet avec PDO :(52_mysql_connect.php)

    Bien entendu il serait utile dinclure ce code dans un fichier externe, que nous vous recommandons de nommer connexion.inc.php et qu'il suffirait d'appeler ensuite chaque script. Pour appeler cette librairie depuis nimporte quel script, il suffit dy ajouter : include("connexion.inc.php") ou dans notre exemple,include("52_mysql_connect.php")

    10.18.2 - 2) Connexion MySQL - mthode procdurale (mysqli)

    (51_connexion.inc.php)

  • }echo 'Vous tes bien connect au serveur et la base';?>

    La fonction retourne TRUE si la connexion est russie et FALSE sinon. Il est recommand de stocker le rsultat de l'excution de la fonction dans une variable etd'interrompre le processus en cas derreur.L'utilisation de la fonction die() en cas d'erreur d'excution. Si la fonction retourne la valeur 0 (c'est--dire s'il y a une erreur) la fonction die() [traduisez meurt]renvoie un message d'erreur. La fonction die() est quivalente la fonction exit().

    10.18.3 Afficher le contenu d'une table depuis PHP

    10.18.3 - 1) Lire le contenu dune table MySQL - mthode oriente objet (PDO)

    Pour afficher le contenu d'une table, on se connecte la base, puis on slectionne la table (liste). On effectue la requte de slection avec 'SELECT nom, emailFROM liste' ou 'SELECT * FROM liste'. Puis il faut stocker le rsultat de la requte (les enregistrements de la table) dans une variable, que l'on peut nommer$resultat et qui est donc un tableau associatif.

    $sql = "SELECT * FROM liste";$resultat = $dbh->query($sql);

    Toutefois, la variable $resultat contient l'ensemble des enregistrements demands dans un tableau et n'est donc pas exploitable telle quelle. On utilise donc lamthode (ou fonction) fetch() pour extraire les enregistrements du tableau :

    $row = $resultat->fetch(PDO::FETCH_BOTH);

    PDO::FETCH_OBJ => retourne un objet anonyme avec les noms de proprits correspondant aux noms de colonnes. PDO::FETCH_ASSOC => retourne un tableau associatif. PDO::FETCH_BOTH => retourne un tableau index par les noms ET les numros de colonnes. (valeur par dfaut)

    Note : fetchall() extrait dun seul coup lensemble des donnes et libre MySql, et fetch() extrait les donnes squentiellement.

    L'affichage s'effectue ensuite par une boucle while qui parcourt les lments du tableau associatif $row.

    while ($row = $resultat->fetch(PDO::FETCH_BOTH)) {echo $row['id'].' - '.$row['nom'].' - '.$row['email'].' - '.$row['age'].'';}

    Voici le script complet avec la mthode PDO(52_mysql_PDO_lire.php)

    Lecture de la table

    Ce script affiche toute la table liste qui contient quatre enregistrements :

    Apprendre PHP et MySql http://www.gilbert-pernot.fr/apprendre_php.html

    53 sur 82 17/02/2015 14:22

  • 10.18.3 - 2) Lire le contenu dune table MySQL - mthode procdurale (mysqli)

    Pour afficher le contenu d'une table, on se connecte dabord la base, puis on slectionne la table (liste). On effectue la requte de slection l'aide de la fonction :

    $mysqli->query("SELECT x, y, z FROM table LIMIT 10") ;

    Puis il faut stocker le rsultat de la requte (les enregistrements de la table) dans une variable, que l'on peut nommer $result, et qui est donc un tableau associatif :

    $result = $mysqli->query("SELECT id, nom, email FROM liste LIMIT 10") ;

    Toutefois, la variable $result contient l'ensemble des enregistrements demands dans un tableau et n'est donc pas exploitable telle quelle. On utilise donc une autrefonction pour extraire les enregistrements du tableau :

    $row = $result->fetch_array(MYSQLI_ASSOC) ;

    MYSQLI_NUM => tableaux numriques MYSQLI_ASSOC => tableaux associatifs MYSQLI_BOTH => tableaux associatifs ET numriques

    Ensuite on dcoupe les lignes de rsultat et on les met dans un tableau associatif dans l'ordre o elles arrivent avec mysqli_fetch_array($result, MYSQLI_ASSOC).L'affichage s'effectue par une boucle while qui va parcourir les lments du tableau. Enfin, $row est une variable de type tableau associatif.

    while ( $row = mysqli_fetch_array($result, MYSQLI_ASSOC)) { echo $row['id'].' - '.$row['nom'].' - '.$row['email'].''; }

    Le script complet avec la mthode mysqli devient :(52_MySQL_lire.php)

  • 10.18.4 Insrer des donnes partir d'un formulaire depuis PHP

    Dans un site dynamique, il est intressant de prvoir la possibilit d'insrer des donnes en ligne. La requte INSERT INTO permet d'ajouter une entre :

    INSERT INTO liste(ID, nom, possesseur, console, prix, nbre_joueurs_max, commentaires) VALUES('', 'Battlefield 1942', 'Patrick', 'PC', 45, 50,'2nde guerre mondiale')

    INSERT INTO = on veut insrer une entreliste = dans la table listeEntre parenthses = noms des champs dans lesquels vous souhaitez placer des informationsNote : on peut ne pas prciser les noms de champs, dans ce cas Il faut simplement lister les valeurs pour tous les champs sans exception (ID compris) dans le bonordre.VALUES = valeurs insrer, dans le mme ordre que les noms des champs indiqusLes nombres (tels que 45 et 50 ici) n'ont pas besoin d'tre entours d'apostrophes. Seules les chanes de caractres les ncessitent.

    10.18.4 - 1) Insrer des donnes dans une table MySQL - mthode oriente objet (PDO)

    (52_mysql_PDO_insert.php)

    Insertion d'un enregistrement

    Pour vous inscrire remplissez ces cases :

    Nom : Email : ge :

    Un petit dtour par PhpMyAdmin vous confirmera si l'enregistrement a bien t effectu.

    Apprendre PHP et MySql http://www.gilbert-pernot.fr/apprendre_php.html

    55 sur 82 17/02/2015 14:22

  • 10.18.4 - 2) Insrer des donnes dans une table MySQL - mthode procdurale (mysqli)

    (52_MySQL_insert.php)

  • while ($row = $resultat->fetch(PDO::FETCH_ASSOC)) {/*print_r($row);echo $row['id'].' - '.$row['nom'].' - '.$row['email'].' - '.$row['age'].' ans';*/If ($row['nom'] == $nom) /* Si vrai on excute ce qui se trouve entre les crochets */{$id = $row['id'];$nom = $row['nom'];$email = $row['email'];$age = $row['age'];}}/*echo "1) $nom $email $age";*/if ( isset( $_POST['email'] )) {if ( $_POST['email'] != '') {$email = $_POST['email'];// Avec une requte prpare$req = $dbh->prepare('UPDATE liste SET email = :email WHERE nom = :nom');$req->execute(array('nom' => $nom,'email' => $email));}}/* echo "2) $nom $email $age";*/if ( isset( $_POST['age'] )) {if ( $_POST['age'] != '') {$age = $_POST['age'];// Avec une requte prpare$req = $dbh->prepare('UPDATE liste SET age = :age WHERE nom = :nom');$req->execute(array('nom' => $nom,'age' => $age));}}/* echo "3) $nom $email $age";*/// Fermeture de la connexion$dbh = NULL;}else{$message = '
  • // on dcoupe les lignes de rsultat et on les met dans un tableau associatif dans l'ordre o elles arriventwhile ( $row = mysqli_fetch_array($result, MYSQLI_BOTH)) {If ($row['nom'] == $nom) /* Si vrai on excute ce qui se trouve entre les crochets */{$id = $row['id'];$nom = $row['nom'];$email = $row['email'];$age = $row['age'];echo "$id - $nom - $email - $age ans";} }// modification de l'emailif ( isset( $_POST['email'])) {if ( $_POST['email'] != '') {$oldemail = $email;$email = $_POST['email'];if ( $oldemail != $email) {$sql = "UPDATE liste SET email = "."'$email'"." WHERE nom ="."'$nom'" ;echo $sql."";//envoi de la requete au serveur MySQL$result=mysqli_query($link, $sql);/*test si la requete est execute */if (mysqli_affected_rows($link) === 1) { $msg = 'email modifi :)';} else { $msg = 'Erreur de Modification email !'; $msg .= mysqli_error($link); $msg .= '';}}}}// modification de l'geif ( isset( $_POST['age']) ) {if ( $_POST['age'] != '') {$oldage = $age;$age = $_POST['age'];if ( $oldage != $age) {$sql = "UPDATE liste SET age = "."'$age'"." WHERE nom ="."'$nom'" ;//envoi de la requete au serveur MySQL$result=mysqli_query($link, $sql);/*test si la requete est execute */if (mysqli_affected_rows($link) === 1) { $msg .= 'ge modifi :)';} else { $msg = 'Erreur de Modification ge !'; $msg .= mysqli_error($link); $msg .= '';}}}};echo $msg;}?>

    Modification

    Pour modifier votre mail ou votre ge entrez d'abord votre nom puis votre email ou votre ge :

    Entrez d'abord votre nom ici puis 'Envoyer' (vous modifierez aprs) :Nom :

    Modifiez votre mail puis cliquez sur 'Modifier' :Email:

  • $nom = '';$message = '';if ( isset( $_POST['nom'] )) {/* Connexion la base de donnes avec PDO */include("52_MySQL_PDO_connect.php");$nom = $_POST['nom'];// On ajoute une entre dans la table liste laide dune requte prpare$req = $dbh->prepare('DELETE FROM liste WHERE nom = :nom');$req->execute(array('nom' => $nom));

    echo ' Le visiteur '. $nom .' a bien t supprim !';/* Fermeture de la connexion$dbh = NULL;*/} else {$message = '

  • Entrez ici le nom supprimer puis cliquez sur 'Supprimer' :Nom :

    10.18.7 Trier une table depuis PHP

    Trions la table par noms dutilisateurs en ordre ascendant. ORDER BY vous permet de choisir un ordre pour laffichage, en prcisant ASC vous aurez une sortie enordre croissant, et avec DESC en ordre dcroissant.

    10.18.7 - 1) Trier par noms une table MySQL - mthode oriente objet (PDO)

    (52_MySQL_PDO_tri_nom.php)

  • 10.19 Crer un systme dauthentification scuris mthode oriente objet (PDO)

    On veut crer un extranet administrable distance par une interface en PHP. Ce site doit tre hautement scuris et accessible uniquement aux utilisateurs identifis(figurant dans une liste). Les sessions PHP permettront de garder trace de lidentification donne par les visiteurs et valide par lapplication. Il y a deux solutions :1) Utiliser les contrles daccs du serveur web : ceci ncessite de pouvoir modifier la configuration dApache via un fichier .htaccess2) Utiliser une authentification gre par lapplication PHP dans le cadre dune session. Nous prfrons la seconde solution.

    Larchitecture du systme comprend trois fichiers :auth.php : est le formulaire pour sidentifierverif.php : valide les donnes soumises et lensemble nom/mot de passe qui identifient le visiteursecure.php : est plac en haut de chaque page scuriser. Il vrifie si le visiteur bien accs la ressource demande.

    Avec PhpMyAdmin, crez d'abord une base de donnes "site_sur" et dans cette base, crez une table "users" contenant les champs login, nom, prenom, pass,email.

    Voici la structure de la base :

    Apprendre PHP et MySql http://www.gilbert-pernot.fr/apprendre_php.html

    61 sur 82 17/02/2015 14:22

  • Voici la liste des personnes enregistres dans la base :

    10.19.1 Le formulaire pour sidentifier : auth.php - mthode oriente objet (PDO)

    Si lon faisait simple, le formulaire didentification naurait besoin que de 2 champs, le nom (pseudonyme) et le mot de passe. Ici nous avons prvu les champs login,nom, prenom, pass, email.

    Exemple :

    (53_auth.php)

    Identification

    Identifiez-vous pour accder ce site scuris

    Login : Saisissez ici votre pseudonyme

    Nom : Saisissez ici votre Nom

    Prnom : Saisissez ici votre Prnom

    Mot de passe : Saisissez ici votre mot de passe

    E-Mail : Saisissez ici votre adresse email

    E-Mail : Confirmez la saisie de votre email ici

    Apprendre PHP et MySql http://www.gilbert-pernot.fr/apprendre_php.html

    62 sur 82 17/02/2015 14:22

  • 10.19.2 le formulaire pour sinscrire : 53_auth_inscript.php - mthode oriente objet (PDO)

    Ce script vrifie si lensemble nom + mot de passe correspond bien un utilisateur identifi (figurant dans la table MySql)

    (53_auth_inscript.php)

    Inscription

    Identifiez-vous pour accder ce site scuris

    Login : Saisissez ici votre pseudonyme

    Nom : Saisissez ici votre Nom

    Prnom : Saisissez ici votre Prnom

    Mot de passe : Saisissez ici votre mot de passe

    E-Mail : Saisissez ici votre adresse email

    E-Mail : Confirmez la saisie de votre email ici

    10.19.3 la validation du nom et du mot de passe : verif.php - mthode oriente objet (PDO)

    Apprendre PHP et MySql http://www.gilbert-pernot.fr/apprendre_php.html

    63 sur 82 17/02/2015 14:22

  • Ce script vrifie si lensemble nom + mot de passe correspond bien un utilisateur identifi (figurant dans une liste). La fonction verifpass($nom,$pass) compare lenom et le mot de passe aux donnes dune base mysql. On peut aussi, comme recommand plus haut, rcuprer ladresse IP du visiteur :

    echo 'Votre adresse IP est : ' . $_SERVER['REMOTE_ADDR'] ;

    Exemple :

    (53_verif.php)

  • 10.19.4 le script de protection de la page : secure.php - mthode oriente objet (PDO)

    Ce script vrifie si le visiteur bien accs la ressource demande. On ajoute en haut de chaque page scuriser : include('secure.php') ; qui y fait appel.

    (secure.php)

  • $message = '';$nb_result = 0;

    if ( isset( $_POST['email'] )) {if ($_POST['email']) { require_once('55_connexion.inc.php'); $email = $_POST['email'];

    /* hashage du mot de passe $mypwd = md5($_POST['mypwd']); */ $mypwd = $_POST['mypwd']; $rqt = "SELECT nom, prenom FROM users WHERE email = '$email' AND pass = '$mypwd'";/* @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ */if ($result = mysqli_query($link, $rqt)) {

    /* Dtermine le nombre de lignes du jeu de rsultats */ $nb_result = mysqli_num_rows($result); printf("Le jeu de rsultats a %d lignes.\n", $nb_result);}/* @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ */ if ($nb_result = 1) {

    /* Si le nombre d'enregistrements === 1 alors authentification OK */ session_start(); $_SESSION['valide'] = 1; while ($row = $result->fetch_assoc()) {

    printf ("%s (%s)\n", $row["nom"], $row["prenom"]); $_SESSION['nom'] = $row['nom']; $_SESSION['prenom'] = $row['prenom']; } header('Location: http://localhost/55_menu.php'); exit(); } else {

    /* Authentification pas OK */ $message = 'Mauvais login ou mot de passe'; }

    /* Ferme le jeu de rsultats */ mysqli_free_result($result);}}?>

    Authentification

    Authentification

    EMail :

  • echo 'Ancien password correct !';// Vrification que les nouveaux mots de passe sont bons

    if ($_POST['new_pwd'] == $_POST['new_pwd2']) {echo 'Nouveaux passwords corrects !';

    $rqt = 'UPDATE users SET pass = \''.$_POST['new_pwd'].'\' WHERE login = \''.$_POST['login'].'\''; mysqli_query($link,$rqt); if (mysqli_affected_rows($link) == 1) { $message = 'OK : mot de passe mis jour.'; unset($_POST); } else {

    $message = 'Echec mise jour, erreur inconnue !';}

    } else { $message = 'Les nouveaux mots de passe ne correspondent pas !'; }

    } else { $message = 'Ancien mot de passe erron !'; } } else { $message = 'Ce login n\'existe pas !'; unset($_POST['login']); }}?>

    Modification du mot de passe

    login :

  • 10.20.A5 la Dconnexion - mthode procdurale (mysqli)

    (55_logout.php)

    10.20.A6 la page du site web (ultra-simplifie) - mthode procdurale (mysqli)

    (55_site.php)

  • /*Si le nombre d'enregistrements != 0 alors liste utilisateurs OK */echo $_GET['msg'],'';/* Compteur pour l'affichage avec couleurs alternes */$i = 0;echo 'LISTE DES UTILISATEURS';echo '';echo 'DETAIL UTILISATEUREFFACERMODIFIER';while ($row = $result->fetch_assoc()) {/* Gestion de l'affichage avec couleurs alternes */

    if ($i % 2) $bgcolor='white'; else $bgcolor='#d3daed'; $i++; $login = $row['login']; echo "".$row['email'].""; echo "effacer"; echo "modifier"; echo "";

    }echo '';

    } else {/* Liste utilisateurs pas OK */

    $message = 'Aucun enregistrement dans la base';}?>

    Affichage utilisateurs

    Retour Menu principal

    10.20.B2 Dtail dun utilisateur - mthode procdurale (mysqli)

    (55_detail_utilisateur.php)

  • (55_ajout_utilisateur.php)

  • (55_modif_utilisateur.php)

    (*) donnes obligatoires

    Retour Menu principal

    Apprendre PHP et MySql http://www.gilbert-pernot.fr/apprendre_php.html

    71 sur 82 17/02/2015 14:22

  • 10.20.B5 Effacer un utilisateur - mthode procdurale (mysqli)

    (55_efface_utilisateur.php)

  • echo "";}echo '';

    } else {/* liste utilisateurs pas OK */

    $message = 'Aucun article dans la base';}/* while ( $row = mysqli_fetch_assoc($result) ) { echo 'modle: '; echo ''.$row['modele'].''; echo '| |effacer'; echo '| |modif'; echo '';} */?>

    Affichage des articles de la base

    Retour Menu principal

    10.20.C2 Dtail dun article - mthode procdurale (mysqli)

    (55_detail_ article.php)

  • if ( !$_POST['NomCategorie']) { // le Nom de Catgorie n'est pas renseign $msg_NomCategorie = 'Entrez ici le Nom de Catgorie SVP'; $valide_form = FALSE; } if ( !$_POST['DescripCategorie']) { // le Descriptif de Catgorie n'est pas renseign $msg_DescripCategorie = 'Entrez ici le Descriptif de Catgorie SVP'; $valide_form = FALSE; } if ( !$_POST['ImageArticle']) { // l'image correspondant l'article n'est pas prcise $msg_ImageArticle = 'Entrez ici le nom d\'image correspondant l\'article SVP'; $valide_form = FALSE; } if ( !$_POST['Wpict']) { // la Largeur de l'image petit format n'est pas renseigne $msg_Wpict = 'Entrez ici la Largeur de l\'image petit format SVP'; $valide_form = FALSE; } if ( !$_POST['Hpict']) { // la Hauteur de l'image petit format n'est pas renseigne $msg_Hpict = 'Entrez ici la Hauteur de l\'image petit format SVP'; $valide_form = FALSE; } if ( !$_POST['NomArticle']) { // le Nom de l'Article n'est pas renseign $msg_NomArticle = 'Entrez ici le Nom de l\'Article SVP'; $valide_form = FALSE; } if ( !$_POST['DescripArticle']) { // le Descriptif de l'Article n'est pas renseign $msg_DescripArticle = 'Entrez ici le Descriptif de l\'Article SVP'; $valide_form = FALSE; } if ( !$_POST['PrixVenteCentimesdEuros']) { // le Prix de Vente en Centimes d'Euros n'est pas renseign $msg_PrixVenteCentimesdEuros = 'Entrez ici le Prix de Vente en Centimes d\'Euros SVP'; $valide_form = FALSE; } if ( !$_POST['PrixVente']) { // le Prix de Vente en Euros n'est pas renseign $msg_PrixVente = 'Entrez ici le Prix de Vente en Euros SVP'; $valide_form = FALSE; } if ( !$_POST['EnStock']) { // le Nombre d'articles en Stock n'est pas renseign $msg_EnStock = 'Entrez ici un Nombre d\'articles en Stock (non nul) SVP'; $valide_form = FALSE; } if ( !$_POST['SousCategorie']) { // le N de la Sous Catgorie n'est pas renseign $msg_SousCategorie = 'Entrez ici le N de la Sous Catgorie SVP'; $valide_form = FALSE; } if ( !$_POST['MotCle']) { // le Mot Cl n'est pas renseign $msg_MotCle = 'Entrez ici le Mot Cl caractrisant au mieux l\'Article SVP'; $valide_form = FALSE; } if ( !$_POST['CategorieLienTableau']) { // la Catgorie du Lien dans son Tableau n'est pas renseign $msg_CategorieLienTableau = 'Entrez ici la Catgorie du Lien dans son Tableau SVP'; $valide_form = FALSE; } if ( !$_POST['NomSousCategorie']) { // le Nom de la sous Catgorie n'est pas renseign $msg_NomSousCategorie = 'Entrez ici le Nom de la sous Catgorie SVP'; $valide_form = FALSE; } if ( !$_POST['DescripSousCategorie']) { // le Descriptif de la sous Catgorie n'est pas renseign $msg_DescripSousCategorie = 'Entrez ici le Descriptif de la sous Catgorie SVP'; $valide_form = FALSE; } if ( !$_POST['NomFichierPageHtml']) { // le Nom du Fichier de la Page Html n'est pas renseign $msg_NomFichierPageHtml = 'Entrez ici le Nom du Fichier de la Page Html SVP'; $valide_form = FALSE; }/* @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ */ if ( $valide_form === TRUE ) { require_once('55_connexion.inc.php');$sql = "INSERT INTO articles (

    RefArticle,NoCategorie,NomCategorie,DescripCategorie,ImageArticle,Wpict,Hpict,NomArticle,DescripArticle,PrixVenteCentimesdEuros,PrixVente,EnStock,SousCategorie,MotCle,CategorieLienTableau,NomSousCategorie,

    Apprendre PHP et MySql http://www.gilbert-pernot.fr/apprendre_php.html

    75 sur 82 17/02/2015 14:22

  • DescripSousCategorie,NomFichierPageHtml

    ) VALUES ('$RefArticle','$NoCategorie','$NomCategorie','$DescripCategorie','$ImageArticle','$Wpict','$Hpict','$NomArticle','$DescripArticle','$PrixVenteCentimesdEuros','$PrixVente','$EnStock','$SousCategorie','$MotCle','$CategorieLienTableau','$NomSousCategorie','$DescripSousCategorie','$NomFichierPageHtml'

    )";/* @@@@