Le langage PHP (2) Walid Belkhir Université de Provence belkhir@cmi.univ-mrs.fr http://www.lif.univ-mrs.fr/ belkhir/ 1 / 54
1 La programmation orientée objet 2 Gestion de Connexions HTTP 3 Manipulation de fichiers 4 Transmission des données 5 PHP/MySQL 2 / 54
Plan 1 La programmation orientée objet 2 Gestion de Connexions HTTP 3 Manipulation de fichiers 4 Transmission des données 5 PHP/MySQL 3 / 54
Les objets Définition d une classe class Personne { //Attributs var $nom ; var $prenom, $age ; //Constructeur function Personne ($n, $p, $a) { $this->nom = $n ; $this->prenom = $p ; $this->age = $a ; } } // La construction d un objet (ou instanciation) $p = new Personne( Toto, Jean, 36) ; // Quel est son âge? echo L âge de $p->prenom $p->nom est $p->age ans ; 4 / 54
Les objets Déclaration de méthodes : class Personne { // définition des attributs var $nom, $prenom, $age, // définition du constructeur portant le nom de la classe function Personne ($n, $p, $a) { $this->nom = $n ; $this->prenom = $p ; $this->age = $a ; } // définition de méthodes function presentetoi() { echo Bonjour, je m appelle \n ; echo $this->prenom.. $this->nom. \n ; echo j ai actuellement. $this->age. ans\n ; } } 5 / 54
Les objets Création d objet : $toto = new Personne( TOTO, Titi, 99) ; Accès aux attributs et aux méthodes : echo $toto->age ; $toto->presentetoi() ; 6 / 54
Héritage (1/2) Déclaration de la classe héritée Employe <? // fichier Employe.php require( Personne.php ) ; class Employe extends Personne { // attributs supplémentaires // $competences doit être un tableau var $service ; var $competences ; function Employe($ser, $c, $n, $p, $a) { $this->service = $ser ; $this->competences = $c ; $this->personne($n, $p, $a) ; } function ajout competence($comp) { if (! empty($comp) ) $this->competences[] = $comp ; } 7 / 54
Héritage (2/2) function presentetoi() { // appel de la méthode de la super-classe parent : :presentetoi() ; echo Je travaille dans le service $this->service <BR> ; if (sizeof($this->competences)>0) { echo Voici la liste de mes compétences : <ul> ; foreach ($this->competences as $competence) echo <li>$competence</li> ; echo </ul> <p> ; } } } // fin classe Employe?> 8 / 54
Les objets Particularités de PHP Les attributs et les méthodes sont publics Il n y a pas de destructeurs : les objets sont libérés automatiquement quand ils ne sont plus utilisés. (?) La durée de vie d un objet n excède pas la durée d exécution du script qui le crée. 9 / 54
Linéarisation serialize() : fonction qui transforme les objets en une chaîne de caractères <?php $toto = new Personne( TOTO, titi,99) ; $toto Lineaire = serialize($toto) ; $toto de Depart = unserialize($toto Lineaire) ; $toto de Depart->decritToi() ;?> 10 / 54
Les fonctions magiques Supposant que les objets ont ouvert une connexion à une base de données et ne l ont pas encore fermée = il est préférable de s assurer que certaines opérations soit effectuées avant que l objet ne soit linéarisé C est le rôle de la fonction magique sleep(). Cette fonction, si elle existe dans l objet sera automatiquement appelée par la fonction serialize() et permettra de fermer toute vos connexions La fonction sleep() retourne obligatoirement un tableau contenant la liste des attributs à linéariser. La fonction magique wakeup() est, si elle existe, automatiquement appelée par la fonction unserialize(). Elle pourra alors reconnecter l objet à la base de données ou réinitialiser certains attributs. 11 / 54
Les fonction magiques : un exemple <?php class Personne {... function sleep() { $this->age = 0 ; return array( age ) ; } function wakeup() { $this->age = 100 ; } }?> 12 / 54
Plan 1 La programmation orientée objet 2 Gestion de Connexions HTTP 3 Manipulation de fichiers 4 Transmission des données 5 PHP/MySQL 13 / 54
Timeout par défaut, au bout de 30 secondes d exécution (directive max execution time), le script passe à l état TIMEOUT set time out(sec) : modifier la valeur de timeout connection timeout : retourne TRUE si le timeout est arrivé à échéance la fonction de terminaison pré-enregistrée avec register shutdown function(func) est appelé quand le timeout expire 14 / 54
Les sessions Une session PHP permet de stocker des informations de l utilisateur sur le serveur (son panier, ses identifiants de connection... ) Ceci offre un haut niveau de sécurité ( à l inverse des cookies qui stockent les informations directement sur la machine du client) Une session est temporaire et est effacé très rapidement du serveur. (Le temps moyen est de 30 minutes par défaut) 15 / 54
Gestion des session PHP permet de sauver des informations entre deux requêtes HTTP (valeur de variables) avec PHP3, il faut une bibliothèque complémentaire inclus dans PHP4 Principes (avec PHP4) chaque nouvel utilisateur se voit attribuer un identificateur de session (SID) par défaut, ce numéro est transmis à l aide d un cookie ; sinon (si l utilisateur n accepte pas les cookies) PHP propage directement le SID via l URL quand un utilisateur accède à la page, PHP4, vérifie si un identificateur de session est présent dans la requête HTTP 16 / 54
Les sessions Le démarrage d une session se fait dans les cas suivants : session.auto start=on dans php.ini lors de l appel de session start() ou de session register() dans le cas où le numéro de session est valide, tout l environnement de celle-ci est restauré dans $ SESSION session destroy pour détruire une session, session unregister() pour dé-enregistrer une variable Par des défaut, les variables de session sont stockées dans un fichier du serveur Le code de démarrage de session doit être inclus dans la page avant tout code HTML 17 / 54
Gestion de sessions : un exemple <?php // dans une fichier F1.php session start() ; session register( user ) ; // $user sera sauvegardé $user = toto ;?> <?php // dans un fichier F2.php session start() ; echo Vous êtes {$ SESSION[ user ]} ; //va afficher Vous êtes toto?> 18 / 54
Gestion des cookies setcookie() permet de mettre en place un cookie (envoie vers le client) La fonction setcookie doit être placé avant tout code HTML syntaxe : setcookie( name, value,expire, path, domain, secure) expire : est un time stamp UNIX secure : vaut 0 ou 1 print($ COOKIE) : affiche tous les cookies en provenance du client 19 / 54
Gestion des cookies Mise en place d un cookies : <?php // le cookie expire dans 3 heures setcookie( nb visite, 1,mktime()+3600*3,/ /MesPages, cmi.univ-mrs.fr ) ;?> <HTML>...</HTML> Effacement d un cookie setcookie( nb visite,mktime()-1) ; Lecture / modification d un cookie setcookie( nb visite, 100,mktime()+3600*3,/ /MesPages, cmi.univ-mrs.fr ) ; 20 / 54
Plan 1 La programmation orientée objet 2 Gestion de Connexions HTTP 3 Manipulation de fichiers 4 Transmission des données 5 PHP/MySQL 21 / 54
manipulation de fichiers/répertoire fopen() : ouverture d un fichier (il est possible de fournir une URL pour les ficheirs distants) fclose() : fermeture d un fichier fread()/fgets()/fwrite()/fputs() : lecture/écriture dans un fichier fgetss() : lire une ligne dans un fichier en supprimant les balises HTML rewind()/ fseek()/ ftell() : positionnement dans le fichier fpassthru() : lit la totalité du fichier et l affiche sur la sortie standard file exists : teste si le fichier existe copy()/rename() /unlink() : copie/ renomme / efface un fichier. 22 / 54
Manipulation de fichiers : exemples Affichage d une image : <?php if(! $fd = fopen( Mes images/image1.gif ) ) echo Problème d ouverture ; else fpassthru($fd) ; fclose($fd) ;?> Copie d un fichier <?php $fichier= image.gif ; if (file exists($fichier)) copy($fichier, /Library/.$fichier) ; else echo Le fichier $fichier n existe pas ;?> 23 / 54
Manipulation de répertoires chdir() : changement de répertoire courant opendir()/closedir() / mkdir() / rmdir() : ouverture, fermeture, création, suppression de répertoire rewind() : repositionnement au début de répertoire dir() : instanciation d un objet répertoire Exemple : lister le contenu d un répertoire (commande ls) <? $rep=dir( /home/dupond ) ; $rep->rewinddir() ; while($f = $rep->readdir()) echo $f \n ; $rep->closedir()?> 24 / 54
Téléchargement d un fichier Il est possible de recevoir des fichiers en provenance du client et d y associer un traitement réception par la méthode POST : une boite de dialogue permet à l utilisateur de sélectionner un fichier local <FORM ENCTYPE= mulipart/form-data ACTION=... METHOD= POST > <INPUT TYPE= hidden NAME= MAX FILE SIZE VALUE= 999 > Envoie ce fichier :<INPUT NAME= userfile TYPE= file > < TYPE= submit VALUE= Envoyer le fichier > </FORM> 25 / 54
Téléchargement de fichier le fichier téléchargé sera stocké temporairement dans un répertoire ($TMPDIR) sur le serveur is uploaded file() : vérifier si le fichier à été bien téléchargé 26 / 54
Téléchargement de fichiers Information reçus par PHP dans $ FILES le champ caché MAX FILE SIZE permet à PHP de faire des vérifications sur la taille du fichier téléchargé $ FILE[ userfile ][ name ] : nom original du fichier sur la machine client $ FILE[ userfile ][type ] : type MIME du fichier $ FILE[ userfile ][ size ] : taille du fichier en octets $ FILE[ userfile ][ tmp name ] : nom temporaire du fichier qui sera chargé sur la machine serveur $ FILE[ userfile ][ error ] : 0 en cas de réussite du téléchargement 27 / 54
Plan 1 La programmation orientée objet 2 Gestion de Connexions HTTP 3 Manipulation de fichiers 4 Transmission des données 5 PHP/MySQL 28 / 54
Transmission des données <form method= post action= cible.php > On insèrera ici les éléments de notre formulaire.... </form> Attribut method : 2 manières (2 méthodes) pour envoyer un formulaire : 1 get : les données transiteront par l URL (on les voie dans la barre d adresse) on pourra les récupérer grâce au tableau $ GET 2 post : données ne transiteront pas par l URL on pourra les récupérer grâce au tableau $ POST Attribut action : désigne la page (ex. cible.php ) qui recevra les données du formulaire et qui sera chargée de les traiter. 29 / 54
Transmission de données : petite zone de texte // fichier : formulaire.php <p> Cette page ne contient que du HTML.<br /> Veuillez taper votre prénom : </p> <form action= cible.php method= post > <p> <input type= text name= prenom /> <input type= submit value= Valider /> </p> </form> // fichier : cible.php Tu t appelles <?php echo $ POST[ prenom ] ;?>!<br> Si tu veux changer de prénom, <a href= formulaire.php >clique ici</a> pour revenir à formulaire.php 30 / 54
Transmission de données : grande zone de texte Code HTML : <textarea name= message rows= 8 cols= 45 > Votre message ici. </textarea> $ POST[ message ] : pour récupérer le contenu de la zone du texte 31 / 54
Transmission de données : liste déroulante Code HTML : <select name= choix > <option value= choix1 >Choix 1</option> <option value= choix2 >Choix 2</option> <option value= choix3 >Choix 3</option> <option value= choix4 >Choix 4</option> </select> = une variable $ POST[ choix ] sera créée, elle contiendra le choix qu a fait l utilisateur. S il a choisi Choix 3, la variable $ POST[ choix ] sera égale au value correspondant, c est-à-dire choix3. Liste à choix multiple? : $ POST[ choix ][$i] ; 32 / 54
Transmission de données : case à cocher Case à cocher : $ POST[ case name ] Si la case est cochée, alors $ POST[ case ] aura pour valeur on sinon, $ POST[ case name ] n existe pas ; (on peux faire un test avec isset ($ POST[ case name ])) 33 / 54
Transmission de données : boutons d option Les boutons d option Code HTML : Aimez-vous le Foot? <input type= radio name= Foot value= oui checked= checked > Oui <input type= radio name= Foot value= non > Non si on a choisit Oui alors $ POST[ Foot ] vaut oui 34 / 54
Plan 1 La programmation orientée objet 2 Gestion de Connexions HTTP 3 Manipulation de fichiers 4 Transmission des données 5 PHP/MySQL 35 / 54
PHP et MySQL PHP permet d accéder à de nombreuses SGBD (MySQL, Oracle,...) la plupart de ces SGBD sont accessible via le langage SQL (Structured Query Langage) qui permet de réaliser des requêtes à la base de données les fonctionnalités de bases de SQL : connexion au serveur de BD (machine, login, passwd) sélection du nom de la base à utiliser requête SQL vers la base exploitation du résultat de la requête (affichage,...) déconnexion 36 / 54
PHP et MySQL Exemples de commandes SQL : une table contenant 3 champs (Id, Nom, Prenom) CREATE DATABASE MaBase CREATE TABLE Personne (Id INT(2) NOT NULL, NOM VARCHAR(25), Prenom VARCHAR(25), PRIMARY KEY(Id)) INSERT INTO Personne VALUES ( 1, Dupond, Jack ) INSERT INTO Personne VALUES ( 2, Durant, Paul ) SELECT Nom, Prenom FROM PERSONNE DELETE FROM Personne WHERE NOM= Dupont PHP n est qu un intermédiaire entre le client et la base de données 37 / 54
PHP et MySQL Configuration de PHP/MySQL : voir php.ini Les fonctions les plus courantes, utilisées pour accéder à une base MySQL mysql connect() : ouvrir une connexion avec le serveur de BD mysql select db() : changer la base active sur la connexion en cours mysql list *() : lister les bases (dbs), les tables (tables), les champs d une table (field) disponibles sur le serveur de BD mysql query() : envoyer une requête SQL ; un identifiant est retourné pour pour pouvoir traiter le résultat mysql close() : fermer la connexion avec le serveur 38 / 54
PHP et MySQL Traitement du résultat d une requête SQL : mysql result() : extraire le contenu d un champ du résultat mysql fetch *() : transforme une ligne du résultat du résultat en tableau associatif (dont les clés sont les noms des champs ou l indice de la colonne) en objet (dont les propriétés sont les noms des champs) mysql field *() : obtenir des informations sur les champs présents dans le résultat (type, nom,...) mysql free result() : effacer le résultat de la mémoire mysql num fields() et mysql num rows() retournent respectivement le nombre de champs/lignes du résultat. 39 / 54
PHP et MySQL Connexions persistantes au serveur avec mysql pconnect() : la connexion reste ouverte entre l exécution de 2 scripts/requêtes différents la connexion n est plus fermée automatiquement à la fin du script PHP accélère les accès à la base de donnée quand ces derniers sont fréquents la connexion sera fermée automatiquement après un certain temps d inutilisation 40 / 54
PHP et MySQL Traitement des erreurs : 3 possibilité 1 $conn=mysl connect($host, $user, $passwd) ; : = si la fonction échoue, le programme continue 2 $conn=mysl connect($host, $user, $passwd) or die( Connexion impossible!! ) ; = si la fonction échoue, un message est affiché et le programme se termine ( die( message ) est un alias de la fontcion exit ) 3 if (! $conn=mysql connect($host, $user, $passwd)) {$msg = mysql error() ; echo( msg ) ; exit ;} = si la fonction échoue, le message d erreur est affiché et le programme se termine ($mysql error() permet de récupérer le diagnostique d échec correspondant au dernier accès au serveur ) 41 / 54
PHP et MySQL : exemple (1/2) <?php /* ajout personne.php : ajoute la personne ($nom,$prenom) dans la table Personne de la base MaBase (déja créées) et affiche la table complète */ /* connexion */ $host = localhost ; $user= toto, $passwd= titi ; $base= MaBase ; $table= Personne ; $conn=mysql connect($host,$user,$passwd) or die( connexion impossible ) ; mysql select db($base,$conn) or die ( sélection impossible ) ; /* Recherche de l Id suivant dans la table, on suppose que Id= numéro de la ligne*/ $query= SELECT * FROM $table ; $result=mysql query($query) or die( echecs de la requete 1 ) ; $next id =mysql num rows($result) + 1 ; mysql free result($result) ; /* Ajout de ($next id,$nom,$prenom) dans la table */ $query= INSERT INTO $table VALUES( $next id, $nom, $prenom ) ; mysql query($query) or die ( Echecs de la requete 2 ) ; 42 / 54
PHP et MySQL : exemple (2/2) /* Affichage complet de la table */ $query = SELECT Nom,Prenom, FROM $table ; $result = mysql query($query) or die ( Echec de la requete 3 ) ; echo <table>\n ; while($ligne= mysql fetch array($result,mysql ASSOC)){ echo <tr> ; foreach($ligne as $valeur champ){ echo <td>$valeur champ</td> ;} echo </tr> ; } echo </table> ; /* Liberation du résultat */ mysql free result($result) ; /* Fermeture de la connexion*/ mysql close($conn) ;?> 43 / 54
Quelques fonctions MySql ( /) bool mysql select db ( string $database name, resource $link identifier ) : sélectionne une base de données MySQL sur le serveur associé avec le paramètre $link identifier. Chaque appel à la fonction mysql query sera exécutée sur la base de données active. $database name le nom de la base de données à sélectionner. $link identifier : la connexion MySQL. 1 S il n est pas spécifié, la dernière connexion ouverte avec la fonction mysql connect sera utilisée. 2 Si une telle connexion n est pas trouvée, la fonction tentera d ouvrir une connexion, comme si la fonction mysql connect avait été appelée sans argument. 3 Si aucune connexion n est trouvée ou établie, une alerte E WARNING est générée. Cette fonction retourne TRUE en cas de succès, FALSE en cas d échec. 44 / 54
Quelques fonctions MySql int mysql affected rows ([ resource $link identifier ] ) : le nombre des lignes touchées par la dernière requête : INSERT, UDPATE, REPLACE et DELETE asssocié à $link identifier. Ex. mysql query( DELETE FROM mytable WHERE 0 ) ; printf( Nombre de lignes suprimés :, mysql affected rows()) ; bool mysql create db ( string $database name [, resource $link identifier ] ) : crée(?) une nouvelle base de donnée sur le serveur dont l identifiant est $link identifier. 45 / 54
Quelques fonction MySql array mysql fetch array ( resource $result [, int $result type = MYSQL BOTH ] ) : retourne une ligne de résultat MySQL sous la forme d un tableau associatif, d un tableau indexé, ou les deux $result La ressource de résultat qui vient d être évaluée. Ce résultat vient de l appel à la fonction mysql query(). $result type : Le type de tableau à récupérer. C est une constante qui peut prendre les valeurs suivantes : MYSQL ASSOC, MYSQL NUM, et la valeur par défaut est MYSQL BOTH. 46 / 54
Exemple : mysql fetch array avec MYSQL NUM <?php mysql connect( localhost, mysql user, mysql password ) or die( Impossible de se connecter :. mysql error()) ; mysql select db( mydb ) ; $result = mysql query( SELECT id, name FROM mytable ) ; while ($row = mysql fetch array($result, MYSQL NUM)) { printf( ID : Nom :, $row[0], $row[1]) ; } mysql free result($result) ;?> 47 / 54
Exemple : mysql fetch array avec MYSQL ASSOC <?php mysql connect( localhost, mysql user, mysql password ) or die( Impossible de se connecter :. mysql error()) ; mysql select db( mydb ) ; $result = mysql query( SELECT id, name FROM mytable ) ; while ($row = mysql fetch array($result, MYSQL NUM)) { printf( ID : Nom :, $row[ id ], $row[ name ]) ; } mysql free result($result) ;?> 48 / 54
Exemple : mysql fetch array avec MYSQL BOTH <?php mysql connect( localhost, mysql user, mysql password ) or die( Impossible de se connecter :. mysql error()) ; mysql select db( mydb ) ; $result = mysql query( SELECT id, name FROM mytable ) ; while ($row = mysql fetch array($result, MYSQL NUM)) { printf( ID : Nom :, $row[0], $row[ name ]) ; } mysql free result($result) ;?> 49 / 54
Quelques fonctions MySql array mysql fetch assoc ( resource $result ) : équivalent à mysql fetch array() avec MYSQL ASSOC comme 2 ième paramètre. array mysql fetch row ( resource $result ) : retourne un tableau indexé numériquement, qui correspond à la ligne du résultat MySQL $result int mysql field len ( resource $result, int $field offset ) : retourne la taille d un champ de résultat MySQL 50 / 54
Quelques fonctions MySql object mysql fetch field( resource $result, int $field offset) : retourne les données enregistrées dans une colonne MySQL sous forme d objet $result : la ressource de résultat qui vient d être évaluée. Ce résultat vient de l appel à la fonction mysql query. field offset : la position numérique du champ. Retourne un objet contenant les informations sur les champs. Les propriétés de l objet sont : 1 name - nom de la colonne 2 table - nom de la table de la colonne 3 def - valeur par défaut de la colonne 4 max length - taille maximale de la colonne 5 not null - 1 si la colonne ne peut pas être NULL 6 primary key - 1 si la colonne est une clé primaire 7 unique key - 1 si la colonne est une clé unique 8 multiple key - 1 si la colonne est une clé non unique 9 numeric - 1 si la colonne est numérique 10 type - le type de la colonne 11 unsigned - 1 si la colonne est non signée 12... 51 / 54
Quelques fonctions MySql bool mysql drop db ( string $database name] ) : supprimer une base de donnée string mysql error ([ resource $link identifier ] ) : retourne le message d erreur (sous forme de texte) de la dernière requête int mysql field len ( resource $result, int $field offset ) : retourne la longueur du champ spécifié (?) string mysql info ([ resource $link identifier ] ) : retourne des informations détaillées sur la dernière requête int mysql insert id ([ resource $link identifier ] ) : retourne l ID généré par la dernière requête (i.e. INSERT) 52 / 54
Quelques fonctions MySql resource mysql list dbs ([ resource $link identifier ] ) : la liste des bases de donnée présentes sur le serveur MySql resource mysql list fields ( string $database name, string $table name [, resource $link identifier ] ) : la liste des champs d une table resource mysql list processes ([ resource $link identifier ] ) : la liste des processus (?) resource mysql list tables ( string $database [, resource $link identifier ] ) : la liste des tables de la base de donnée int mysql num fields ( resource $result ) : le nombre de champs d une requête int mysql num rows ( resource $result ) : le nombre de lignes d une requête 53 / 54
Quelques fonctions MySql bool mysql ping ([ resource $link identifier ] ) : teste si le connexion avec le serveur est encore établie, sinon reconnexion. resource mysql query(string $query [,resource $link identifier ] ) : envoie une seule requête string mysql result(resource $result, int $row [, int $field=0]) : retourne le contenu d un champ de la requête (?) 54 / 54