▼
Scroll to page 2
of
1195
Manuel PHP Stig Sæther Bakken Alexander Aulbach Egon Schmid Jim Winstead Lars Torben Wilson Rasmus Lerdorf Zeev Suraski Andrei Zmievski Jouni Ahto Publié par Damien Seguy 16-08-2001 Copyright © 1997, 1998, 1999, 2000, 2001 par PHP Documentation Group Copyright Ce manuel est © Copyright 1997, 1998, 1999, 2000, 2001 par PHP Documentation Group. Les membres de ce groupe sont listés sur la première page de ce manuel. Ce manuel peut être redistribué sous licence GNU General Public License, comme stipulé par la Free Software Foundation; soit la version 2 de la Licence, soit (à votre choix), une version ultérieure. Manuel PHP par Stig Sæther Bakken, Alexander Aulbach, Egon Schmid, Jim Winstead, Lars Torben Wilson, Rasmus Lerdorf, Zeev Suraski, Andrei Zmievski, et Jouni Ahto par Publié par Damien Seguy Publié 16-08-2001 Copyright © 1997, 1998, 1999, 2000, 2001 par PHP Documentation Group Copyright Ce manuel est © Copyright 1997, 1998, 1999, 2000, 2001 par PHP Documentation Group. Les membres de ce groupe sont listés sur la première page de ce manuel. Ce manuel peut être redistribué sous licence GNU General Public License, comme stipulé par la Free Software Foundation; soit la version 2 de la Licence, soit (à votre choix), une version ultérieure. Table des matières Préface ......................................................................................................................................................................................i A propos de ce manuel.....................................................................................................................................................i I. Comment Commencer........................................................................................................................................................1 1. Introduction.................................................................................................................................................................1 Qu’est ce que PHP?...............................................................................................................................................2 Que peut faire PHP? ..............................................................................................................................................2 La génèse du PHP .................................................................................................................................................2 2. Installation...................................................................................................................................................................4 Télécharger la dernière version .............................................................................................................................5 Installation sous UNIX..........................................................................................................................................5 Référence Module Apache ..........................................................................................................................5 Compilation .................................................................................................................................................6 Installation sous Linux ..........................................................................................................................................6 Utilisation des packages ..............................................................................................................................6 Installation sous HP-UX........................................................................................................................................6 Installation sous Solaris.........................................................................................................................................7 Logiciels nécessaires ...................................................................................................................................7 Utilisation des packages ..............................................................................................................................7 Installations Unix/OpenBSD.................................................................................................................................7 Utilisation des ports .....................................................................................................................................7 Utilisation des Packages ..............................................................................................................................8 Installation sous Mac OS X...................................................................................................................................8 Utilisation des packages ..............................................................................................................................8 Compilation pour serveur OS X ..................................................................................................................8 Compilation pour MacOS X client ..............................................................................................................9 Liste complète des options de configuration .......................................................................................................10 Base de données.........................................................................................................................................10 E-commerce...............................................................................................................................................14 Images........................................................................................................................................................15 Divers.........................................................................................................................................................16 Réseau........................................................................................................................................................22 Comportement PHP ...................................................................................................................................23 Serveur .......................................................................................................................................................23 Texte et langue ...........................................................................................................................................25 XML ..........................................................................................................................................................25 Installation sous Windows 9x/ME/NT/2000 .......................................................................................................26 InstallShield sous Windows.......................................................................................................................26 Instructions Générales d’installation .........................................................................................................26 Compilation des sources ............................................................................................................................27 Préparation .......................................................................................................................................28 Mettre tout ensemble........................................................................................................................28 Compilation......................................................................................................................................29 Installation des extensions sous Windows .................................................................................................29 Installation du serveur Apache ............................................................................................................................31 Détails pour l’installation de PHP sous Apache sous Unix.......................................................................31 Détails sur l’installation de PHP sous Windows avec Apache 1.3.x .........................................................32 CGI/ Installation pour exécution en ligne de commande ....................................................................................33 Tests ...........................................................................................................................................................33 Performances .............................................................................................................................................33 Installation avec les serveurs fhttpd ....................................................................................................................33 Installation sur serveur Caudium.........................................................................................................................33 Installation avec les serveurs IIS/PWS................................................................................................................34 Windows et PWS/IIS 3 ..............................................................................................................................34 Windows et PWS 4 ou plus récent.............................................................................................................35 Windows NT/2000 et IIS 4 ou plus récent.................................................................................................35 Installation sous Netscape et iPlanet Enterprise Serveur ....................................................................................36 Installation OmniHTTPd.....................................................................................................................................38 iii OmniHTTPd 2.0b1 et plus récent pour Windows .....................................................................................38 Installation Oreilly Website Pro Server...............................................................................................................38 Oreilly Website Pro 2.5 et plus récent pour Windows...............................................................................38 Installation Xitami...............................................................................................................................................39 Xitami pour Windows................................................................................................................................39 Autres serveurs web ............................................................................................................................................39 Des problèmes? ...................................................................................................................................................39 Lisez la FAQ ..............................................................................................................................................39 Rapports de Bug ........................................................................................................................................39 Autres problèmes .......................................................................................................................................39 3. Configuration ............................................................................................................................................................41 Le fichier de configuration ..................................................................................................................................42 Directives de configuration générale .........................................................................................................42 Configuration des directives concernant le mail........................................................................................45 Directives de configuration du "Safe Mode" .............................................................................................45 Directives de configuration de débbugage. ................................................................................................46 Directives de chargement des extensions ..................................................................................................46 MySQL Configuration Directives..............................................................................................................46 Directives de configuration mSQL ............................................................................................................46 Directives de configuration Postgres .........................................................................................................47 Directives de configuration SESAM..........................................................................................................47 Directives de configuration Sybase............................................................................................................47 Sybase-CT Configuration Directives .........................................................................................................48 Directives de configuration Informix.........................................................................................................48 Directives de configuration pour les calculs mathématiques.....................................................................49 Directives de configuration du navigateur. ................................................................................................49 Directives de configuration du driver ODBC unifié ..................................................................................49 4. Sécurité .....................................................................................................................................................................51 Binaires CGI........................................................................................................................................................52 Faiblesses connues.....................................................................................................................................52 Cas 1: Tous les fichiers sont publics ..........................................................................................................52 Cas 2: Utilisation de la directive de compilation --enable-force-cgi-redirect ...........................................53 Cas 3: Utilisation du "doc_root" ou du "user_dir" ....................................................................................53 Cas 4: L’exécutable PHP à l’extérieur de l’arborescence du serveur ........................................................53 Module Apache ...................................................................................................................................................54 Sécurité des fichiers.............................................................................................................................................54 Rapport d’erreur ..................................................................................................................................................55 Données transmises par les internautes ...............................................................................................................56 Considérations générales.....................................................................................................................................56 Etre à jour ............................................................................................................................................................57 II. Référence ..........................................................................................................................................................................58 5. La syntaxe de base ....................................................................................................................................................58 Le passage du HTML au PHP.............................................................................................................................59 Le séparateur d’instruction..................................................................................................................................59 Commentaires......................................................................................................................................................60 6. Les types ...................................................................................................................................................................61 Introduction .........................................................................................................................................................62 Booléens ..............................................................................................................................................................62 Conversion en booléen...............................................................................................................................63 Entiers..................................................................................................................................................................63 Dépassement de capacité des entiers .........................................................................................................63 Conversion en entiers.................................................................................................................................64 Depuis un booléen............................................................................................................................64 Depuis un nombre à virgule flottante ...............................................................................................64 From strings .....................................................................................................................................64 Conversion d’autres types ................................................................................................................65 Les nombres à virgule flottante ...........................................................................................................................65 Les chaînes de caractères ....................................................................................................................................65 Syntax ........................................................................................................................................................65 iv guillemets simples............................................................................................................................65 Guillemets doubles...........................................................................................................................66 Syntaxe Heredoc ..............................................................................................................................66 Traitement des variables dans les chaînes........................................................................................67 Syntaxe simple........................................................................................................................67 Syntaxe complexe...................................................................................................................68 Accès aux caractères d’une chaîne...................................................................................................69 Fonctions et opérateurs pratiques ..............................................................................................................69 Conversion de type ....................................................................................................................................69 Les tableaux.........................................................................................................................................................70 Syntaxe ......................................................................................................................................................70 Créer un tableau array() ..................................................................................................................70 Omettre des clés .....................................................................................................................70 La syntaxe à crochets .......................................................................................................................70 Fonctions pratiques ....................................................................................................................................71 Exemples....................................................................................................................................................71 Attention aux tableaux...............................................................................................................................73 Pourquoi est ce que $foo[bar] est invalide? .................................................................................74 Alors, pourquoi est-ce mal?....................................................................................................74 Les objets.............................................................................................................................................................74 Initialisation d’un objet..............................................................................................................................75 Ressources ...........................................................................................................................................................75 Libérer des ressources................................................................................................................................75 La valeur NULL ..................................................................................................................................................75 Syntaxe ......................................................................................................................................................75 Définition du type................................................................................................................................................75 Transtypage................................................................................................................................................76 7. Les variables .............................................................................................................................................................79 Essentiel ..............................................................................................................................................................80 Variables prédéfinies ...........................................................................................................................................80 Variables Apache .......................................................................................................................................81 Variables d’environnement ........................................................................................................................82 Variables PHP ............................................................................................................................................82 Portée des variables .............................................................................................................................................83 Les variables dynamiques ...................................................................................................................................85 Variables externes à PHP.....................................................................................................................................86 Formulaires HTML (GET et POST)..........................................................................................................86 Bouton "submit" sous forme d’image ..............................................................................................86 HTTP Cookies ...........................................................................................................................................87 Variables d’environnement ........................................................................................................................87 Cas des points dans les noms de variables.................................................................................................87 Détermination du type des variables..........................................................................................................88 8. Les constantes ...........................................................................................................................................................89 Syntaxe ................................................................................................................................................................90 Constantes prédéfinies.........................................................................................................................................90 9. Les expressions .........................................................................................................................................................93 10. Les opérateurs .........................................................................................................................................................96 Les opérateurs arithmétiques...............................................................................................................................97 Les opérateurs d’assignation ...............................................................................................................................97 Opérateurs sur les bits .........................................................................................................................................97 Opérateurs de comparaison .................................................................................................................................98 Opérateur de contrôle d’erreur ............................................................................................................................98 Opérateur d’exécutions........................................................................................................................................99 Opérateurs d’incrémentation/Décrémentation ....................................................................................................99 Les opérateurs logiques .....................................................................................................................................100 La précédence des opérateurs............................................................................................................................100 Opérateurs de chaînes........................................................................................................................................101 11. Les structures de contrôle .....................................................................................................................................102 if.......................................................................................................................................................................103 else ..................................................................................................................................................................103 v elseif ..............................................................................................................................................................104 Syntaxe alternative ............................................................................................................................................104 while ................................................................................................................................................................105 do..while .......................................................................................................................................................105 for ....................................................................................................................................................................106 foreach ............................................................................................................................................................107 break ................................................................................................................................................................109 continue ..........................................................................................................................................................109 switch ..............................................................................................................................................................110 declare ............................................................................................................................................................112 Ticks.........................................................................................................................................................112 require()............................................................................................................................................................113 include()............................................................................................................................................................113 require_once() ..................................................................................................................................................115 include_once() ..................................................................................................................................................117 12. Les fonctions.........................................................................................................................................................118 Les fonctions utilisateur ....................................................................................................................................119 Les arguments de fonction ................................................................................................................................119 Passage d’arguments par référence..........................................................................................................119 Valeur par défaut des arguments..............................................................................................................120 Nombre d’arguments variable .................................................................................................................121 Les valeurs de retour .........................................................................................................................................121 old_function .................................................................................................................................................121 Fonctions-variable .............................................................................................................................................122 13. Les classes et les objets.........................................................................................................................................123 Les classes : class ...........................................................................................................................................124 extends : héritage............................................................................................................................................125 Constructor : constructeur ............................................................................................................................126 Opérateur ::......................................................................................................................................................127 parent ..............................................................................................................................................................128 Sauvegarde d’objets - cas des sessions..............................................................................................................129 Les fonctions magiques __sleep et __wakeup ...............................................................................................130 Références dans un constructeur .......................................................................................................................130 14. Les références .......................................................................................................................................................133 Qu’est ce qu’une référence? ..............................................................................................................................134 Que font les références ? ...................................................................................................................................134 Ce que les références ne sont pas ......................................................................................................................134 Passage par référence ........................................................................................................................................135 Retourner des références ...................................................................................................................................135 Détruire une référence .......................................................................................................................................136 Repérer une référence........................................................................................................................................136 Références globales .................................................................................................................................136 $this.......................................................................................................................................................136 III. Caractéristiques ...........................................................................................................................................................138 15. Gestion des erreurs................................................................................................................................................138 16. Création d’images .................................................................................................................................................142 17. Authentification HTTP avec PHP .........................................................................................................................144 18. Cookies .................................................................................................................................................................147 19. Gestion des chargements de fichier.......................................................................................................................149 Chargements de fichiers par méthode POST.....................................................................................................150 Erreurs classiques ..............................................................................................................................................151 Chargement multiples de fichiers ......................................................................................................................151 Chargement par méthode PUT ..........................................................................................................................152 20. Utilisation des fichiers à distance..........................................................................................................................154 21. Gestion des connexions.........................................................................................................................................156 22. Connexions persistantes aux bases de données ....................................................................................................158 23. Safe mode..............................................................................................................................................................160 vi IV. Index des fonctions.......................................................................................................................................................162 I. Apache .....................................................................................................................................................................162 ascii2ebcdic .......................................................................................................................................................163 ebcdic2ascii .......................................................................................................................................................163 apache_lookup_uri ............................................................................................................................................163 apache_note .......................................................................................................................................................163 getallheaders......................................................................................................................................................164 virtual ................................................................................................................................................................164 II. Tableaux .................................................................................................................................................................165 array...................................................................................................................................................................166 array_count_values............................................................................................................................................167 array_diff ...........................................................................................................................................................167 array_filter .........................................................................................................................................................168 array_flip ...........................................................................................................................................................168 array_intersect ...................................................................................................................................................169 array_keys .........................................................................................................................................................169 array_map..........................................................................................................................................................170 array_merge.......................................................................................................................................................172 array_merge_recursive ......................................................................................................................................173 array_multisort ..................................................................................................................................................173 array_pad ...........................................................................................................................................................174 array_pop...........................................................................................................................................................175 array_push .........................................................................................................................................................175 array_reverse .....................................................................................................................................................176 array_reduce ......................................................................................................................................................176 array_rand..........................................................................................................................................................177 array_shift..........................................................................................................................................................177 array_slice .........................................................................................................................................................178 array_splice .......................................................................................................................................................178 array_sum ..........................................................................................................................................................180 array_unique......................................................................................................................................................180 array_unshift......................................................................................................................................................181 array_values.......................................................................................................................................................181 array_walk .........................................................................................................................................................182 arsort..................................................................................................................................................................183 asort ...................................................................................................................................................................183 compact .............................................................................................................................................................184 count ..................................................................................................................................................................184 current................................................................................................................................................................185 each....................................................................................................................................................................185 end .....................................................................................................................................................................186 extract ................................................................................................................................................................186 in_array..............................................................................................................................................................187 array_search ......................................................................................................................................................188 key .....................................................................................................................................................................188 krsort..................................................................................................................................................................189 ksort ...................................................................................................................................................................189 list ......................................................................................................................................................................189 natsort ................................................................................................................................................................190 natcasesort .........................................................................................................................................................191 next ....................................................................................................................................................................191 pos .....................................................................................................................................................................192 prev....................................................................................................................................................................192 range ..................................................................................................................................................................192 reset ...................................................................................................................................................................192 rsort....................................................................................................................................................................192 shuffle ................................................................................................................................................................193 sizeof .................................................................................................................................................................193 sort .....................................................................................................................................................................193 vii uasort .................................................................................................................................................................194 uksort .................................................................................................................................................................194 usort ...................................................................................................................................................................195 III. Aspell ....................................................................................................................................................................196 aspell_new .........................................................................................................................................................197 aspell_check ......................................................................................................................................................197 aspell_check_raw ..............................................................................................................................................197 aspell_suggest....................................................................................................................................................198 IV. Nombres de grande taille ......................................................................................................................................199 bcadd .................................................................................................................................................................200 bccomp ..............................................................................................................................................................200 bcdiv ..................................................................................................................................................................200 bcmod ................................................................................................................................................................200 bcmul .................................................................................................................................................................200 bcpow ................................................................................................................................................................201 bcscale ...............................................................................................................................................................201 bcsqrt .................................................................................................................................................................201 bcsub..................................................................................................................................................................201 V. Compression Bzip2 ................................................................................................................................................202 bzclose ...............................................................................................................................................................203 bzcompress ........................................................................................................................................................203 bzdecompress ....................................................................................................................................................203 bzerrno...............................................................................................................................................................204 bzerror ...............................................................................................................................................................204 bzerrstr...............................................................................................................................................................204 bzflush ...............................................................................................................................................................204 bzopen ...............................................................................................................................................................205 bzread ................................................................................................................................................................205 bzwrite ...............................................................................................................................................................205 VI. Calendrier .............................................................................................................................................................207 JDToGregorian ..................................................................................................................................................208 GregorianToJD ..................................................................................................................................................208 JDToJulian.........................................................................................................................................................208 JulianToJD.........................................................................................................................................................208 JDToJewish........................................................................................................................................................209 JewishToJD........................................................................................................................................................209 JDToFrench .......................................................................................................................................................209 FrenchToJD .......................................................................................................................................................209 JDMonthName ..................................................................................................................................................209 JDDayOfWeek...................................................................................................................................................210 easter_date .........................................................................................................................................................210 easter_days ........................................................................................................................................................211 unixtojd..............................................................................................................................................................211 jdtounix..............................................................................................................................................................211 VII. Paiement CCVS...................................................................................................................................................213 .................................................................................................................................................................214 VIII. Support COM pour Windows ............................................................................................................................215 com_load ...........................................................................................................................................................216 com_invoke .......................................................................................................................................................216 com_propget......................................................................................................................................................216 com_get .............................................................................................................................................................216 com_propput......................................................................................................................................................216 com_propset ......................................................................................................................................................216 com_set..............................................................................................................................................................217 IX. Objets....................................................................................................................................................................218 call_user_method ..............................................................................................................................................220 call_user_method_array ....................................................................................................................................220 class_exists ........................................................................................................................................................220 get_class ............................................................................................................................................................220 get_class_methods.............................................................................................................................................221 viii get_class_vars....................................................................................................................................................222 get_declared_classes .........................................................................................................................................222 get_object_vars..................................................................................................................................................222 get_parent_class ................................................................................................................................................223 is_subclass_of....................................................................................................................................................223 method_exists....................................................................................................................................................224 X. ClibPDF .................................................................................................................................................................225 cpdf_global_set_document_limits ....................................................................................................................228 cpdf_set_creator ................................................................................................................................................228 cpdf_set_title .....................................................................................................................................................228 cpdf_set_subject ................................................................................................................................................228 cpdf_set_keywords ............................................................................................................................................228 cpdf_open ..........................................................................................................................................................228 cpdf_close..........................................................................................................................................................229 cpdf_page_init ...................................................................................................................................................229 cpdf_finalize_page ............................................................................................................................................229 cpdf_finalize ......................................................................................................................................................230 cpdf_output_buffer ............................................................................................................................................230 cpdf_save_to_file...............................................................................................................................................230 cpdf_set_current_page ......................................................................................................................................230 cpdf_begin_text .................................................................................................................................................230 cpdf_end_text ....................................................................................................................................................231 cpdf_show .........................................................................................................................................................231 cpdf_show_xy ...................................................................................................................................................231 cpdf_text............................................................................................................................................................232 cpdf_set_font .....................................................................................................................................................232 cpdf_set_leading................................................................................................................................................232 cpdf_set_text_rendering ....................................................................................................................................233 cpdf_set_horiz_scaling......................................................................................................................................233 cpdf_set_text_rise..............................................................................................................................................233 cpdf_set_text_matrix .........................................................................................................................................233 cpdf_set_text_pos..............................................................................................................................................233 cpdf_set_char_spacing ......................................................................................................................................233 cpdf_set_word_spacing .....................................................................................................................................234 cpdf_continue_text ............................................................................................................................................234 cpdf_stringwidth................................................................................................................................................234 cpdf_save...........................................................................................................................................................234 cpdf_restore .......................................................................................................................................................234 cpdf_translate ....................................................................................................................................................235 cpdf_scale..........................................................................................................................................................235 cpdf_rotate.........................................................................................................................................................235 cpdf_setflat ........................................................................................................................................................235 cpdf_setlinejoin .................................................................................................................................................236 cpdf_setlinecap..................................................................................................................................................236 cpdf_setmiterlimit .............................................................................................................................................236 cpdf_setlinewidth ..............................................................................................................................................236 cpdf_setdash ......................................................................................................................................................236 cpdf_newpath ....................................................................................................................................................237 cpdf_moveto ......................................................................................................................................................237 cpdf_rmoveto.....................................................................................................................................................237 cpdf_curveto......................................................................................................................................................237 cpdf_lineto.........................................................................................................................................................237 cpdf_rlineto .......................................................................................................................................................238 cpdf_circle .........................................................................................................................................................238 cpdf_arc .............................................................................................................................................................238 cpdf_rect............................................................................................................................................................238 cpdf_closepath...................................................................................................................................................239 cpdf_stroke ........................................................................................................................................................239 cpdf_closepath_stroke .......................................................................................................................................239 cpdf_fill .............................................................................................................................................................239 ix cpdf_fill_stroke..................................................................................................................................................239 cpdf_closepath_fill_stroke.................................................................................................................................240 cpdf_clip............................................................................................................................................................240 cpdf_setgray_fill................................................................................................................................................240 cpdf_setgray_stroke...........................................................................................................................................240 cpdf_setgray ......................................................................................................................................................240 cpdf_setrgbcolor_fill .........................................................................................................................................241 cpdf_setrgbcolor_stroke ....................................................................................................................................241 cpdf_setrgbcolor................................................................................................................................................241 cpdf_add_outline ...............................................................................................................................................241 cpdf_set_page_animation..................................................................................................................................242 cpdf_import_jpeg ..............................................................................................................................................242 cpdf_place_inline_image ..................................................................................................................................242 cpdf_add_annotation .........................................................................................................................................243 XI. CURL....................................................................................................................................................................244 curl_init .............................................................................................................................................................245 curl_init .............................................................................................................................................................245 curl_exec ...........................................................................................................................................................247 curl_close ..........................................................................................................................................................247 curl_version .......................................................................................................................................................247 XII. Paiement Cybercash ............................................................................................................................................248 cybercash_encr ..................................................................................................................................................249 cybercash_decr ..................................................................................................................................................249 cybercash_base64_encode.................................................................................................................................249 cybercash_base64_decode.................................................................................................................................249 XIII. CyberMUT : Crédit Mutuel ...............................................................................................................................250 cybermut_creerformulairecm ............................................................................................................................251 cybermut_testmac..............................................................................................................................................251 cybermut_creerreponsecm.................................................................................................................................252 XIV. Caractères...........................................................................................................................................................253 ctype_alnum ......................................................................................................................................................254 ctype_alpha........................................................................................................................................................254 ctype_cntrl .........................................................................................................................................................254 ctype_digit .........................................................................................................................................................254 ctype_lower .......................................................................................................................................................255 ctype_graph .......................................................................................................................................................255 ctype_print.........................................................................................................................................................255 ctype_punct .......................................................................................................................................................255 ctype_space .......................................................................................................................................................255 ctype_upper .......................................................................................................................................................256 ctype_xdigit .......................................................................................................................................................256 XV. DBA ....................................................................................................................................................................257 dba_close ...........................................................................................................................................................259 dba_delete..........................................................................................................................................................259 dba_exists ..........................................................................................................................................................259 dba_fetch ...........................................................................................................................................................259 dba_firstkey .......................................................................................................................................................260 dba_insert ..........................................................................................................................................................260 dba_nextkey.......................................................................................................................................................260 dba_popen .........................................................................................................................................................260 dba_open ...........................................................................................................................................................261 dba_optimize .....................................................................................................................................................261 dba_replace........................................................................................................................................................261 dba_sync............................................................................................................................................................261 XVI. Dates et heures ...................................................................................................................................................263 checkdate ...........................................................................................................................................................264 date ....................................................................................................................................................................264 getdate ...............................................................................................................................................................266 gettimeofday......................................................................................................................................................266 gmdate ...............................................................................................................................................................266 x gmmktime..........................................................................................................................................................267 gmstrftime .........................................................................................................................................................267 localtime ............................................................................................................................................................267 microtime ..........................................................................................................................................................268 mktime...............................................................................................................................................................268 strftime ..............................................................................................................................................................269 time....................................................................................................................................................................271 strtotime.............................................................................................................................................................271 XVII. dBase ................................................................................................................................................................272 dbase_create ......................................................................................................................................................273 dbase_open ........................................................................................................................................................273 dbase_close........................................................................................................................................................274 dbase_pack ........................................................................................................................................................274 dbase_add_record..............................................................................................................................................274 dbase_replace_record ........................................................................................................................................274 dbase_delete_record ..........................................................................................................................................274 dbase_get_record...............................................................................................................................................275 dbase_get_record_with_names .........................................................................................................................275 dbase_numfields ................................................................................................................................................275 dbase_numrecords .............................................................................................................................................275 XVIII. DBM................................................................................................................................................................277 dbmopen ............................................................................................................................................................278 dbmclose............................................................................................................................................................278 dbmexists...........................................................................................................................................................278 dbmfetch............................................................................................................................................................278 dbminsert ...........................................................................................................................................................278 dbmreplace ........................................................................................................................................................279 dbmdelete ..........................................................................................................................................................279 dbmfirstkey........................................................................................................................................................279 dbmnextkey .......................................................................................................................................................279 dblist ..................................................................................................................................................................279 XIX. dbx .....................................................................................................................................................................281 dbx_close...........................................................................................................................................................282 dbx_connect ......................................................................................................................................................282 dbx_error ...........................................................................................................................................................283 dbx_query..........................................................................................................................................................284 dbx_sort .............................................................................................................................................................285 dbx_cmp_asc .....................................................................................................................................................286 dbx_cmp_desc ...................................................................................................................................................287 XX. DB++ functions...................................................................................................................................................288 dbplus_add ........................................................................................................................................................289 dbplus_aql .........................................................................................................................................................289 dbplus_chdir ......................................................................................................................................................289 dbplus_close ......................................................................................................................................................289 dbplus_curr........................................................................................................................................................289 dbplus_errcode ..................................................................................................................................................290 dbplus_first ........................................................................................................................................................290 dbplus_flush ......................................................................................................................................................290 dbplus_freealllocks............................................................................................................................................290 dbplus_freerlocks ..............................................................................................................................................291 dbplus_info........................................................................................................................................................291 dbplus_last.........................................................................................................................................................291 dbplus_lockrel ...................................................................................................................................................291 dbplus_next .......................................................................................................................................................292 dbplus_open ......................................................................................................................................................292 dbplus_prev .......................................................................................................................................................292 dbplus_restorepos..............................................................................................................................................293 dbplus_ropen .....................................................................................................................................................293 dbplus_runlink...................................................................................................................................................293 dbplus_rzap .......................................................................................................................................................293 xi dbplus_savepos..................................................................................................................................................294 dbplus_setindex .................................................................................................................................................294 dbplus_setindexbynumber.................................................................................................................................294 dbplus_sql..........................................................................................................................................................294 dbplus_tremove .................................................................................................................................................295 dbplus_undo ......................................................................................................................................................295 dbplus_undoprepare ..........................................................................................................................................295 dbplus_unlockrel ...............................................................................................................................................295 dbplus_unselect .................................................................................................................................................296 dbplus_update....................................................................................................................................................296 dbplus_xlockrel .................................................................................................................................................296 dbplus_xunlockrel .............................................................................................................................................296 dbplus_change ...................................................................................................................................................297 dbplus_find ........................................................................................................................................................297 dbplus_freelock .................................................................................................................................................297 dbplus_getlock ..................................................................................................................................................297 dbplus_getunique ..............................................................................................................................................298 dbplus_rchperm .................................................................................................................................................298 dbplus_rcreate ...................................................................................................................................................298 dbplus_rcrtexact ................................................................................................................................................298 dbplus_rcrtlike...................................................................................................................................................299 dbplus_resolve...................................................................................................................................................299 dbplus_rkeys......................................................................................................................................................299 dbplus_rquery....................................................................................................................................................299 dbplus_rrename .................................................................................................................................................300 dbplus_rsecindex ...............................................................................................................................................300 dbplus_tcl ..........................................................................................................................................................300 XXI. Accès aux dossiers .............................................................................................................................................301 chroot.................................................................................................................................................................302 chdir...................................................................................................................................................................302 dir ......................................................................................................................................................................302 closedir ..............................................................................................................................................................302 getcwd ...............................................................................................................................................................303 opendir...............................................................................................................................................................303 readdir................................................................................................................................................................303 rewinddir ...........................................................................................................................................................304 XXII. DOM XML.......................................................................................................................................................305 xmldoc ...............................................................................................................................................................307 xmldocfile..........................................................................................................................................................307 xmltree...............................................................................................................................................................307 domxml_root .....................................................................................................................................................307 domxml_add_root .............................................................................................................................................308 domxml_dumpmem ..........................................................................................................................................308 domxml_attributes.............................................................................................................................................308 domxml_get_attribute .......................................................................................................................................309 domxml_set_attribute........................................................................................................................................309 domxml_children ..............................................................................................................................................309 domxml_new_child ...........................................................................................................................................310 domxml_new_xmldoc .......................................................................................................................................310 xpath_new_context............................................................................................................................................310 xpath_eval..........................................................................................................................................................310 XXIII. Gestion des erreurs..........................................................................................................................................311 error_log ............................................................................................................................................................312 error_reporting ..................................................................................................................................................312 restore_error_handler ........................................................................................................................................313 set_error_handler...............................................................................................................................................314 trigger_error ......................................................................................................................................................316 user_error ..........................................................................................................................................................316 XXIV. FrontBase ........................................................................................................................................................317 fbsql_affected_rows ..........................................................................................................................................318 xii fbsql_autocommit..............................................................................................................................................318 fbsql_change_user .............................................................................................................................................318 fbsql_close.........................................................................................................................................................318 fbsql_connect ....................................................................................................................................................319 fbsql_create_db .................................................................................................................................................319 fbsql_data_seek .................................................................................................................................................320 fbsql_db_query..................................................................................................................................................320 fbsql_drop_db....................................................................................................................................................321 fbsql_errno ........................................................................................................................................................321 fbsql_error .........................................................................................................................................................321 fbsql_fetch_array...............................................................................................................................................322 fbsql_fetch_assoc ..............................................................................................................................................322 fbsql_fetch_field................................................................................................................................................323 fbsql_fetch_lengths ...........................................................................................................................................324 fbsql_fetch_object .............................................................................................................................................324 fbsql_fetch_row.................................................................................................................................................325 fbsql_field_flags ................................................................................................................................................325 fbsql_field_name ...............................................................................................................................................325 fbsql_field_len ...................................................................................................................................................326 fbsql_field_seek.................................................................................................................................................326 fbsql_field_table ................................................................................................................................................326 fbsql_field_type .................................................................................................................................................326 fbsql_free_result................................................................................................................................................327 fbsql_insert_id ...................................................................................................................................................327 fbsql_list_dbs ....................................................................................................................................................328 fbsql_list_fields .................................................................................................................................................328 fbsql_list_tables.................................................................................................................................................329 fbsql_next_result ...............................................................................................................................................329 fbsql_num_fields ...............................................................................................................................................330 fbsql_num_rows ................................................................................................................................................330 fbsql_pconnect ..................................................................................................................................................330 fbsql_query........................................................................................................................................................330 fbsql_result ........................................................................................................................................................331 fbsql_select_db..................................................................................................................................................332 fbsql_tablename ................................................................................................................................................332 fbsql_warnings ..................................................................................................................................................332 XXV. FilePro ..............................................................................................................................................................334 filepro ................................................................................................................................................................335 filepro_fieldname...............................................................................................................................................335 filepro_fieldtype ................................................................................................................................................335 filepro_fieldwidth ..............................................................................................................................................335 filepro_retrieve ..................................................................................................................................................335 filepro_fieldcount ..............................................................................................................................................335 filepro_rowcount ...............................................................................................................................................336 XXVI. Système de fichiers .........................................................................................................................................337 basename ...........................................................................................................................................................338 chgrp..................................................................................................................................................................338 chmod ................................................................................................................................................................338 chown ................................................................................................................................................................339 clearstatcache ....................................................................................................................................................339 copy ...................................................................................................................................................................339 delete .................................................................................................................................................................340 dirname..............................................................................................................................................................340 diskfreespace .....................................................................................................................................................340 disk_total_space ................................................................................................................................................341 fclose .................................................................................................................................................................341 feof ....................................................................................................................................................................341 fflush..................................................................................................................................................................341 fgetc ...................................................................................................................................................................342 fgetcsv ...............................................................................................................................................................342 xiii fgets ...................................................................................................................................................................342 fgetss..................................................................................................................................................................343 file......................................................................................................................................................................343 file_exists...........................................................................................................................................................344 fileatime .............................................................................................................................................................344 filectime .............................................................................................................................................................344 filegroup.............................................................................................................................................................345 fileinode .............................................................................................................................................................345 filemtime............................................................................................................................................................345 fileowner............................................................................................................................................................345 fileperms ............................................................................................................................................................346 filesize................................................................................................................................................................346 filetype ...............................................................................................................................................................346 flock ...................................................................................................................................................................346 fopen..................................................................................................................................................................347 fpassthru ............................................................................................................................................................348 fputs ...................................................................................................................................................................348 fread...................................................................................................................................................................349 fscanf .................................................................................................................................................................349 fseek ..................................................................................................................................................................350 fstat ....................................................................................................................................................................350 ftell ....................................................................................................................................................................351 ftruncate.............................................................................................................................................................351 fwrite .................................................................................................................................................................351 set_file_buffer....................................................................................................................................................352 is_dir..................................................................................................................................................................352 is_executable .....................................................................................................................................................352 is_file .................................................................................................................................................................353 is_link ................................................................................................................................................................353 is_readable.........................................................................................................................................................353 is_writable .........................................................................................................................................................353 is_writeable .......................................................................................................................................................354 is_uploaded_file ................................................................................................................................................354 link.....................................................................................................................................................................354 linkinfo ..............................................................................................................................................................354 mkdir .................................................................................................................................................................355 move_uploaded_file ..........................................................................................................................................355 pathinfo..............................................................................................................................................................355 pclose.................................................................................................................................................................356 popen .................................................................................................................................................................356 readfile ...............................................................................................................................................................357 readlink..............................................................................................................................................................357 rename ...............................................................................................................................................................357 rewind................................................................................................................................................................357 rmdir ..................................................................................................................................................................358 stat .....................................................................................................................................................................358 lstat ....................................................................................................................................................................359 realpath ..............................................................................................................................................................359 symlink ..............................................................................................................................................................359 tempnam ............................................................................................................................................................360 tmpfile................................................................................................................................................................360 touch ..................................................................................................................................................................360 umask ................................................................................................................................................................361 unlink.................................................................................................................................................................361 XXVII. Forms Data Format ........................................................................................................................................362 fdf_open ............................................................................................................................................................363 fdf_close ............................................................................................................................................................363 fdf_create...........................................................................................................................................................363 fdf_save .............................................................................................................................................................364 fdf_get_value.....................................................................................................................................................364 xiv fdf_set_value .....................................................................................................................................................364 fdf_next_field_name..........................................................................................................................................364 fdf_set_ap ..........................................................................................................................................................364 fdf_set_status.....................................................................................................................................................365 fdf_get_status ....................................................................................................................................................365 fdf_set_file.........................................................................................................................................................365 fdf_get_file ........................................................................................................................................................365 fdf_set_flags ......................................................................................................................................................365 fdf_set_opt.........................................................................................................................................................366 fdf_set_submit_form_action .............................................................................................................................366 fdf_set_javascript_action...................................................................................................................................366 fdf_set_encoding ...............................................................................................................................................366 XXVIII. FTP ...............................................................................................................................................................368 ftp_connect ........................................................................................................................................................369 ftp_login ............................................................................................................................................................369 ftp_pwd..............................................................................................................................................................369 ftp_cdup.............................................................................................................................................................369 ftp_chdir ............................................................................................................................................................369 ftp_mkdir ...........................................................................................................................................................369 ftp_rmdir............................................................................................................................................................370 ftp_nlist..............................................................................................................................................................370 ftp_rawlist..........................................................................................................................................................370 ftp_systype ........................................................................................................................................................370 ftp_pasv .............................................................................................................................................................370 ftp_get................................................................................................................................................................371 ftp_fget ..............................................................................................................................................................371 ftp_put ...............................................................................................................................................................371 ftp_fput ..............................................................................................................................................................371 ftp_size ..............................................................................................................................................................372 ftp_mdtm ...........................................................................................................................................................372 ftp_rename.........................................................................................................................................................372 ftp_delete ...........................................................................................................................................................372 ftp_site ...............................................................................................................................................................372 ftp_quit ..............................................................................................................................................................373 XXIX. Fonctions.........................................................................................................................................................374 call_user_func_array .........................................................................................................................................375 call_user_func ...................................................................................................................................................375 create_function ..................................................................................................................................................375 func_get_arg......................................................................................................................................................377 func_get_args ....................................................................................................................................................378 func_num_args ..................................................................................................................................................378 function_exists...................................................................................................................................................379 get_defined_functions .......................................................................................................................................379 register_shutdown_function ..............................................................................................................................380 register_tick_function........................................................................................................................................380 unregister_tick_function....................................................................................................................................380 XXX. GNU Gettext ....................................................................................................................................................382 bindtextdomain..................................................................................................................................................383 dcgettext ............................................................................................................................................................383 dgettext ..............................................................................................................................................................383 gettext ................................................................................................................................................................383 textdomain .........................................................................................................................................................383 XXXI. GMP................................................................................................................................................................385 gmp_init ............................................................................................................................................................386 gmp_intval.........................................................................................................................................................386 gmp_strval .........................................................................................................................................................386 gmp_add ............................................................................................................................................................387 gmp_sub ............................................................................................................................................................387 gmp_mul............................................................................................................................................................387 gmp_div_q.........................................................................................................................................................387 xv gmp_div_r .........................................................................................................................................................387 gmp_div_qr .......................................................................................................................................................388 gmp_div.............................................................................................................................................................388 gmp_mod...........................................................................................................................................................388 gmp_divexact ....................................................................................................................................................388 gmp_cmp ...........................................................................................................................................................389 gmp_neg ............................................................................................................................................................389 gmp_abs ............................................................................................................................................................389 gmp_sign ...........................................................................................................................................................389 gmp_fact............................................................................................................................................................389 gmp_sqrt............................................................................................................................................................390 gmp_sqrtrm .......................................................................................................................................................390 gmp_perfect_square ..........................................................................................................................................390 gmp_pow ...........................................................................................................................................................390 gmp_powm........................................................................................................................................................390 gmp_prob_prime ...............................................................................................................................................390 gmp_gcd ............................................................................................................................................................391 gmp_gcdext .......................................................................................................................................................391 gmp_invert.........................................................................................................................................................391 gmp_legendre ....................................................................................................................................................391 gmp_jacobi ........................................................................................................................................................391 gmp_random......................................................................................................................................................392 gmp_and ............................................................................................................................................................392 gmp_or ..............................................................................................................................................................392 gmp_xor ............................................................................................................................................................392 gmp_setbit .........................................................................................................................................................392 gmp_clrbit .........................................................................................................................................................393 gmp_scan0.........................................................................................................................................................393 gmp_scan1.........................................................................................................................................................393 gmp_popcount ...................................................................................................................................................393 gmp_hamdist .....................................................................................................................................................393 XXXII. HTTP .............................................................................................................................................................394 header ................................................................................................................................................................395 headers_sent ......................................................................................................................................................396 setcookie............................................................................................................................................................396 XXXIII. Hyperwave....................................................................................................................................................398 hw_Array2Objrec..............................................................................................................................................401 hw_Children ......................................................................................................................................................401 hw_ChildrenObj ................................................................................................................................................401 hw_Close ...........................................................................................................................................................401 hw_Connect.......................................................................................................................................................401 hw_Cp ...............................................................................................................................................................402 hw_Deleteobject................................................................................................................................................402 hw_DocByAnchor.............................................................................................................................................402 hw_DocByAnchorObj.......................................................................................................................................402 hw_DocumentAttributes ...................................................................................................................................402 hw_DocumentBodyTag.....................................................................................................................................403 hw_DocumentContent.......................................................................................................................................403 hw_DocumentSetContent..................................................................................................................................403 hw_DocumentSize ............................................................................................................................................403 hw_ErrorMsg ....................................................................................................................................................403 hw_EditText ......................................................................................................................................................404 hw_Error............................................................................................................................................................404 hw_Free_Document ..........................................................................................................................................404 hw_GetParents...................................................................................................................................................404 hw_GetParentsObj.............................................................................................................................................404 hw_GetChildColl ..............................................................................................................................................405 hw_GetChildCollObj ........................................................................................................................................405 hw_GetRemote..................................................................................................................................................405 hw_GetRemoteChildren....................................................................................................................................405 xvi hw_GetSrcByDestObj .......................................................................................................................................406 hw_GetObject....................................................................................................................................................406 hw_GetAndLock ...............................................................................................................................................407 hw_GetText .......................................................................................................................................................407 hw_GetObjectByQuery .....................................................................................................................................407 hw_GetObjectByQueryObj ...............................................................................................................................408 hw_GetObjectByQueryColl ..............................................................................................................................408 hw_GetObjectByQueryCollObj ........................................................................................................................408 hw_GetChildDocColl........................................................................................................................................408 hw_GetChildDocCollObj..................................................................................................................................408 hw_GetAnchors.................................................................................................................................................409 hw_GetAnchorsObj...........................................................................................................................................409 hw_Mv ..............................................................................................................................................................409 hw_Identify .......................................................................................................................................................409 hw_InCollections ..............................................................................................................................................410 hw_Info .............................................................................................................................................................410 hw_InsColl ........................................................................................................................................................410 hw_InsDoc ........................................................................................................................................................410 hw_InsertDocument ..........................................................................................................................................410 hw_InsertObject ................................................................................................................................................411 hw_mapid ..........................................................................................................................................................411 hw_Modifyobject ..............................................................................................................................................411 hw_New_Document..........................................................................................................................................413 hw_Objrec2Array..............................................................................................................................................413 hw_OutputDocument ........................................................................................................................................414 hw_pConnect.....................................................................................................................................................414 hw_PipeDocument ............................................................................................................................................414 hw_Root ............................................................................................................................................................414 hw_Unlock ........................................................................................................................................................414 hw_Who ............................................................................................................................................................415 hw_Username....................................................................................................................................................415 XXXIV. ICAP.............................................................................................................................................................416 icap_open ..........................................................................................................................................................417 icap_close ..........................................................................................................................................................417 icap_fetch_event................................................................................................................................................417 icap_list_events .................................................................................................................................................417 icap_store_event ................................................................................................................................................418 icap_delete_event ..............................................................................................................................................419 icap_snooze .......................................................................................................................................................419 icap_list_alarms.................................................................................................................................................419 XXXV. Iconv ..............................................................................................................................................................420 iconv ..................................................................................................................................................................421 iconv_get_encoding...........................................................................................................................................421 iconv_set_encoding ...........................................................................................................................................421 ob_iconv_handler ..............................................................................................................................................421 XXXVI. Images ..........................................................................................................................................................423 getimagesize ......................................................................................................................................................424 ImageAlphaBlending ........................................................................................................................................425 ImageArc ...........................................................................................................................................................425 imagefilledarc ....................................................................................................................................................425 ImageEllipse......................................................................................................................................................426 ImageFilledEllipse ............................................................................................................................................426 ImageChar .........................................................................................................................................................426 ImageCharUp ....................................................................................................................................................426 ImageColorAllocate ..........................................................................................................................................426 ImageColorDeAllocate......................................................................................................................................427 ImageColorAt....................................................................................................................................................427 ImageColorClosestAlpha ..................................................................................................................................427 ImageColorClosest ............................................................................................................................................428 ImageColorExact...............................................................................................................................................428 xvii ImageColorExactAlpha .....................................................................................................................................428 ImageColorResolve ...........................................................................................................................................428 ImageColorResolveAlpha .................................................................................................................................428 ImageGammaCorrect ........................................................................................................................................429 ImageColorSet...................................................................................................................................................429 ImageColorsForIndex........................................................................................................................................429 ImageColorsTotal ..............................................................................................................................................429 ImageColorTransparent.....................................................................................................................................430 ImageCopy ........................................................................................................................................................430 ImageCopyMerge ..............................................................................................................................................430 ImageCopyMergeGray ......................................................................................................................................430 ImageCopyResized............................................................................................................................................431 ImageCopyResampled.......................................................................................................................................431 ImageCreate ......................................................................................................................................................431 imagecreatefromgif ...........................................................................................................................................431 ImageCreateTrueColor ......................................................................................................................................432 ImageTrueColorToPalette .................................................................................................................................432 ImageCreateFromJPEG.....................................................................................................................................433 ImageCreateFromPNG......................................................................................................................................433 ImageCreateFromWBMP..................................................................................................................................434 ImageCreateFromString ....................................................................................................................................434 ImageDashedLine..............................................................................................................................................434 ImageDestroy ....................................................................................................................................................435 ImageFill ...........................................................................................................................................................435 ImageFilledPolygon ..........................................................................................................................................435 ImageFilledRectangle........................................................................................................................................435 ImageFillToBorder ............................................................................................................................................435 ImageFontHeight...............................................................................................................................................436 ImageFontWidth................................................................................................................................................436 ImageGif............................................................................................................................................................436 ImagePNG .........................................................................................................................................................437 ImageJPEG........................................................................................................................................................438 ImageWBMP.....................................................................................................................................................438 ImageInterlace ...................................................................................................................................................438 ImageLine..........................................................................................................................................................438 ImageLoadFont .................................................................................................................................................439 ImagePolygon....................................................................................................................................................439 ImagePSBBox ...................................................................................................................................................439 ImagePSEncodeFont .........................................................................................................................................440 ImagePSFreeFont ..............................................................................................................................................440 ImagePSLoadFont .............................................................................................................................................440 ImagePsExtendFont...........................................................................................................................................441 ImagePsSlantFont..............................................................................................................................................441 ImagePSText .....................................................................................................................................................441 ImageRectangle .................................................................................................................................................442 ImageSetPixel....................................................................................................................................................442 imagesetbrush....................................................................................................................................................442 ImageSetTile .....................................................................................................................................................443 ImageSetThickness............................................................................................................................................443 ImageString .......................................................................................................................................................443 ImageStringUp ..................................................................................................................................................444 ImageSX............................................................................................................................................................444 ImageSY............................................................................................................................................................444 ImageTTFBBox ................................................................................................................................................444 ImageTTFText...................................................................................................................................................445 ImageTypes .......................................................................................................................................................446 read_exif_data ...................................................................................................................................................446 XXXVII. IMAP ..........................................................................................................................................................448 imap_8bit...........................................................................................................................................................449 imap_alerts ........................................................................................................................................................449 xviii imap_append .....................................................................................................................................................449 imap_base64......................................................................................................................................................449 imap_binary.......................................................................................................................................................450 imap_body .........................................................................................................................................................450 imap_check........................................................................................................................................................450 imap_clearflag_full............................................................................................................................................451 imap_close.........................................................................................................................................................451 imap_createmailbox ..........................................................................................................................................451 imap_delete .......................................................................................................................................................452 imap_deletemailbox ..........................................................................................................................................453 imap_errors........................................................................................................................................................453 imap_expunge ...................................................................................................................................................453 imap_fetch_overview ........................................................................................................................................453 imap_fetchbody .................................................................................................................................................454 imap_fetchheader ..............................................................................................................................................454 imap_fetchstructure ...........................................................................................................................................455 imap_get_quota .................................................................................................................................................456 imap_getmailboxes............................................................................................................................................457 imap_getsubscribed ...........................................................................................................................................458 imap_header ......................................................................................................................................................458 imap_headerinfo................................................................................................................................................458 imap_headers.....................................................................................................................................................459 imap_last_error..................................................................................................................................................460 imap_listmailbox...............................................................................................................................................460 imap_listsubscribed ...........................................................................................................................................460 imap_mail..........................................................................................................................................................460 imap_mail_compose..........................................................................................................................................461 imap_mail_copy ................................................................................................................................................461 imap_mail_move ...............................................................................................................................................462 imap_mailboxmsginfo.......................................................................................................................................462 imap_mime_header_decode..............................................................................................................................463 imap_msgno ......................................................................................................................................................463 imap_num_msg .................................................................................................................................................463 imap_num_recent ..............................................................................................................................................464 imap_open .........................................................................................................................................................464 imap_ping..........................................................................................................................................................465 imap_qprint .......................................................................................................................................................465 imap_renamemailbox ........................................................................................................................................466 imap_reopen ......................................................................................................................................................466 imap_rfc822_parse_adrlist ................................................................................................................................466 imap_rfc822_parse_headers..............................................................................................................................467 imap_rfc822_write_address ..............................................................................................................................467 imap_scanmailbox.............................................................................................................................................467 imap_search.......................................................................................................................................................468 imap_set_quota..................................................................................................................................................468 imap_setflag_full ...............................................................................................................................................469 imap_sort ...........................................................................................................................................................470 imap_status........................................................................................................................................................470 imap_subscribe..................................................................................................................................................471 imap_uid............................................................................................................................................................471 imap_undelete ...................................................................................................................................................471 imap_unsubscribe..............................................................................................................................................471 imap_utf7_decode .............................................................................................................................................472 imap_utf7_encode .............................................................................................................................................472 imap_utf8 ..........................................................................................................................................................472 XXXVIII. Informix.....................................................................................................................................................473 ifx_connect ........................................................................................................................................................475 ifx_pconnect ......................................................................................................................................................475 ifx_close ............................................................................................................................................................475 ifx_query ...........................................................................................................................................................476 xix ifx_prepare ........................................................................................................................................................477 ifx_do ................................................................................................................................................................477 ifx_error.............................................................................................................................................................478 ifx_errormsg ......................................................................................................................................................478 ifx_affected_rows ..............................................................................................................................................478 ifx_getsqlca .......................................................................................................................................................479 ifx_fetch_row ....................................................................................................................................................479 ifx_htmltbl_result ..............................................................................................................................................480 ifx_fieldtypes .....................................................................................................................................................481 ifx_fieldproperties .............................................................................................................................................481 ifx_num_fields...................................................................................................................................................482 ifx_num_rows....................................................................................................................................................482 ifx_free_result ...................................................................................................................................................482 ifx_create_char ..................................................................................................................................................482 ifx_free_char .....................................................................................................................................................482 ifx_update_char .................................................................................................................................................483 ifx_get_char.......................................................................................................................................................483 ifx_create_blob..................................................................................................................................................483 ifx_copy_blob....................................................................................................................................................483 ifx_free_blob .....................................................................................................................................................483 ifx_get_blob ......................................................................................................................................................484 ifx_update_blob.................................................................................................................................................484 ifx_blobinfile_mode ..........................................................................................................................................484 ifx_textasvarchar ...............................................................................................................................................484 ifx_byteasvarchar ..............................................................................................................................................484 ifx_nullformat....................................................................................................................................................485 ifxus_create_slob...............................................................................................................................................485 ifx_free_slob......................................................................................................................................................485 ifxus_close_slob ................................................................................................................................................485 ifxus_open_slob ................................................................................................................................................485 ifxus_tell_slob ...................................................................................................................................................486 ifxus_seek_slob .................................................................................................................................................486 ifxus_read_slob .................................................................................................................................................486 ifxus_write_slob ................................................................................................................................................486 XXXIX. InterBase ......................................................................................................................................................487 ibase_connect ....................................................................................................................................................488 ibase_pconnect ..................................................................................................................................................488 ibase_close ........................................................................................................................................................489 ibase_query........................................................................................................................................................489 ibase_fetch_row.................................................................................................................................................489 ibase_fetch_object .............................................................................................................................................489 ibase_field_info .................................................................................................................................................490 ibase_free_result................................................................................................................................................490 ibase_prepare.....................................................................................................................................................490 ibase_execute.....................................................................................................................................................490 ibase_trans .........................................................................................................................................................491 ibase_commit ....................................................................................................................................................491 ibase_rollback....................................................................................................................................................491 ibase_free_query ...............................................................................................................................................491 ibase_timefmt ....................................................................................................................................................492 ibase_num_fields ...............................................................................................................................................492 ibase_errmsg......................................................................................................................................................493 XL. Ingres II................................................................................................................................................................494 ingres_connect...................................................................................................................................................495 ingres_pconnect.................................................................................................................................................495 ingres_close .......................................................................................................................................................495 ingres_query ......................................................................................................................................................496 ingres_num_rows ..............................................................................................................................................497 ingres_num_fields .............................................................................................................................................497 ingres_field_name .............................................................................................................................................497 xx ingres_field_type ...............................................................................................................................................497 ingres_field_nullable .........................................................................................................................................498 ingres_field_length ............................................................................................................................................498 ingres_field_precision .......................................................................................................................................498 ingres_field_scale ..............................................................................................................................................498 ingres_fetch_array .............................................................................................................................................499 ingres_fetch_row ...............................................................................................................................................499 ingres_fetch_object ...........................................................................................................................................500 ingres_rollback ..................................................................................................................................................500 ingres_commit ...................................................................................................................................................501 ingres_autocommit ............................................................................................................................................501 XLI. IRC .....................................................................................................................................................................502 ircg_pconnect ....................................................................................................................................................503 ircg_set_current .................................................................................................................................................503 ircg_join ............................................................................................................................................................503 ircg_part ............................................................................................................................................................503 ircg_msg ............................................................................................................................................................504 ircg_notice .........................................................................................................................................................504 ircg_nick............................................................................................................................................................504 ircg_topic...........................................................................................................................................................504 ircg_channel_mode ...........................................................................................................................................504 ircg_html_encode ..............................................................................................................................................505 ircg_whois .........................................................................................................................................................505 ircg_kick............................................................................................................................................................505 ircg_ignore_add.................................................................................................................................................505 ircg_ignore_del..................................................................................................................................................505 ircg_disconnect..................................................................................................................................................506 ircg_is_conn_alive.............................................................................................................................................506 ircg_lookup_format_messages..........................................................................................................................506 ircg_register_format_messages .........................................................................................................................506 XLII. Java....................................................................................................................................................................508 java_last_exception_clear..................................................................................................................................510 java_last_exception_get ....................................................................................................................................510 XLIII. LDAP...............................................................................................................................................................511 ldap_add ............................................................................................................................................................513 ldap_bind ...........................................................................................................................................................513 ldap_close..........................................................................................................................................................513 ldap_compare ....................................................................................................................................................514 ldap_connect......................................................................................................................................................514 ldap_count_entries ............................................................................................................................................515 ldap_delete ........................................................................................................................................................515 ldap_dn2ufn.......................................................................................................................................................515 ldap_err2str........................................................................................................................................................515 ldap_errno..........................................................................................................................................................516 ldap_error ..........................................................................................................................................................516 ldap_explode_dn ...............................................................................................................................................517 ldap_first_attribute.............................................................................................................................................517 ldap_first_entry..................................................................................................................................................517 ldap_free_result .................................................................................................................................................517 ldap_get_attributes ............................................................................................................................................518 ldap_get_dn .......................................................................................................................................................518 ldap_get_entries ................................................................................................................................................518 ldap_get_option .................................................................................................................................................519 ldap_get_values .................................................................................................................................................519 ldap_get_values_len ..........................................................................................................................................520 ldap_list .............................................................................................................................................................520 ldap_modify ......................................................................................................................................................521 ldap_mod_add ...................................................................................................................................................521 ldap_mod_del ....................................................................................................................................................521 ldap_mod_replace .............................................................................................................................................522 xxi ldap_next_attribute ............................................................................................................................................522 ldap_next_entry .................................................................................................................................................522 ldap_read ...........................................................................................................................................................522 ldap_rename ......................................................................................................................................................523 ldap_search........................................................................................................................................................523 ldap_set_option .................................................................................................................................................524 ldap_unbind .......................................................................................................................................................525 XLIV. Email ...............................................................................................................................................................526 mail....................................................................................................................................................................527 ezmlm_hash.......................................................................................................................................................528 XLV. Mathématiques ..................................................................................................................................................529 Abs ....................................................................................................................................................................530 Acos...................................................................................................................................................................530 Asin ...................................................................................................................................................................530 Atan ...................................................................................................................................................................530 Atan2 .................................................................................................................................................................530 base_convert ......................................................................................................................................................530 BinDec...............................................................................................................................................................531 Ceil ....................................................................................................................................................................531 Cos.....................................................................................................................................................................531 DecBin...............................................................................................................................................................532 DecHex..............................................................................................................................................................532 DecOct...............................................................................................................................................................532 deg2rad ..............................................................................................................................................................532 Exp ....................................................................................................................................................................532 Floor ..................................................................................................................................................................533 getrandmax ........................................................................................................................................................533 hexdec................................................................................................................................................................533 lcg_value ...........................................................................................................................................................534 Log ....................................................................................................................................................................534 Log10 ................................................................................................................................................................534 max ....................................................................................................................................................................534 min.....................................................................................................................................................................534 mt_rand..............................................................................................................................................................535 mt_srand ............................................................................................................................................................535 mt_getrandmax..................................................................................................................................................535 number_format ..................................................................................................................................................536 OctDec...............................................................................................................................................................536 pi........................................................................................................................................................................537 pow ....................................................................................................................................................................537 rad2deg ..............................................................................................................................................................537 rand....................................................................................................................................................................537 round..................................................................................................................................................................538 Sin......................................................................................................................................................................538 Sqrt ....................................................................................................................................................................538 srand ..................................................................................................................................................................539 Tan .....................................................................................................................................................................539 XLVI. Chaînes de caractères multi-octets...................................................................................................................540 mb_internal_encoding .......................................................................................................................................542 mb_http_input ...................................................................................................................................................542 mb_http_output .................................................................................................................................................542 mb_detect_order................................................................................................................................................542 mb_substitute_character....................................................................................................................................543 mb_output_handler............................................................................................................................................544 mb_preferred_mime_name ...............................................................................................................................544 mb_strlen ...........................................................................................................................................................545 mb_strpos ..........................................................................................................................................................545 mb_strrpos .........................................................................................................................................................545 mb_substr ..........................................................................................................................................................546 mb_strcut ...........................................................................................................................................................546 xxii mb_strwidth.......................................................................................................................................................546 mb_strimwidth ..................................................................................................................................................546 mb_convert_encoding .......................................................................................................................................547 mb_detect_encoding..........................................................................................................................................547 mb_convert_kana ..............................................................................................................................................548 mb_encode_mimeheader...................................................................................................................................549 mb_decode_mimeheader...................................................................................................................................549 mb_convert_variables........................................................................................................................................550 mb_encode_numericentity ................................................................................................................................550 mb_decode_numericentity ................................................................................................................................551 mb_send_mail ...................................................................................................................................................551 XLVII. MCAL ............................................................................................................................................................553 mcal_open .........................................................................................................................................................555 mcal_popen .......................................................................................................................................................555 mcal_reopen ......................................................................................................................................................555 mcal_close .........................................................................................................................................................555 mcal_create_calendar ........................................................................................................................................555 mcal_rename_calendar......................................................................................................................................555 mcal_delete_calendar ........................................................................................................................................556 mcal_fetch_event...............................................................................................................................................556 mcal_list_events ................................................................................................................................................557 mcal_append_event ...........................................................................................................................................557 mcal_store_event...............................................................................................................................................557 mcal_delete_event .............................................................................................................................................557 mcal_snooze ......................................................................................................................................................557 mcal_list_alarms................................................................................................................................................558 mcal_event_init .................................................................................................................................................558 mcal_event_set_category ..................................................................................................................................558 mcal_event_set_title ..........................................................................................................................................558 mcal_event_set_description ..............................................................................................................................558 mcal_event_set_start .........................................................................................................................................559 mcal_event_set_end ..........................................................................................................................................559 mcal_event_set_alarm .......................................................................................................................................559 mcal_event_set_class ........................................................................................................................................559 mcal_is_leap_year .............................................................................................................................................559 mcal_days_in_month ........................................................................................................................................560 mcal_date_valid.................................................................................................................................................560 mcal_time_valid ................................................................................................................................................560 mcal_day_of_week............................................................................................................................................560 mcal_day_of_year .............................................................................................................................................560 mcal_date_compare...........................................................................................................................................561 mcal_next_recurrence .......................................................................................................................................561 mcal_event_set_recur_none ..............................................................................................................................561 mcal_event_set_recur_daily ..............................................................................................................................561 mcal_event_set_recur_weekly ..........................................................................................................................561 mcal_event_set_recur_monthly_mday..............................................................................................................562 mcal_event_set_recur_monthly_wday ..............................................................................................................562 mcal_event_set_recur_yearly ............................................................................................................................562 mcal_fetch_current_stream_event.....................................................................................................................562 mcal_event_add_attribute..................................................................................................................................563 mcal_expunge....................................................................................................................................................563 XLVIII. Cryptage ........................................................................................................................................................564 mcrypt_get_cipher_name ..................................................................................................................................567 mcrypt_get_block_size......................................................................................................................................567 mcrypt_get_key_size.........................................................................................................................................567 mcrypt_create_iv ...............................................................................................................................................567 mcrypt_cbc ........................................................................................................................................................568 mcrypt_cfb ........................................................................................................................................................568 mcrypt_ecb ........................................................................................................................................................569 mcrypt_ofb ........................................................................................................................................................569 xxiii mcrypt_list_algorithms......................................................................................................................................570 mcrypt_list_modes ............................................................................................................................................570 mcrypt_get_iv_size ...........................................................................................................................................570 mcrypt_encrypt..................................................................................................................................................571 mcrypt_decrypt..................................................................................................................................................571 mcrypt_module_open........................................................................................................................................571 mcrypt_generic_init ..........................................................................................................................................572 mcrypt_generic..................................................................................................................................................572 mdecrypt_generic ..............................................................................................................................................572 mcrypt_generic_end ..........................................................................................................................................573 mcrypt_enc_self_test.........................................................................................................................................573 mcrypt_enc_is_block_algorithm_mode ............................................................................................................573 mcrypt_enc_is_block_algorithm .......................................................................................................................574 mcrypt_enc_is_block_mode..............................................................................................................................574 mcrypt_enc_get_block_size ..............................................................................................................................574 mcrypt_enc_get_key_size .................................................................................................................................574 mcrypt_enc_get_supported_key_sizes..............................................................................................................574 mcrypt_enc_get_iv_size....................................................................................................................................574 mcrypt_enc_get_algorithms_name ...................................................................................................................575 mcrypt_enc_get_modes_name ..........................................................................................................................575 mcrypt_module_self_test ..................................................................................................................................575 mcrypt_module_is_block_algorithm_mode......................................................................................................575 mcrypt_module_is_block_algorithm ................................................................................................................575 mcrypt_module_is_block_mode .......................................................................................................................576 mcrypt_module_get_algo_block_size...............................................................................................................576 mcrypt_module_get_algo_key_size..................................................................................................................576 mcrypt_module_get_algo_supported_key_sizes...............................................................................................576 XLIX. Hash.................................................................................................................................................................577 mhash_get_hash_name......................................................................................................................................578 mhash_get_block_size ......................................................................................................................................578 mhash_count......................................................................................................................................................578 mhash ................................................................................................................................................................578 mhash_keygen_s2k ...........................................................................................................................................579 L. Microsoft SQL Server ............................................................................................................................................580 mssql_close .......................................................................................................................................................581 mssql_connect ...................................................................................................................................................581 mssql_data_seek................................................................................................................................................581 mssql_fetch_array .............................................................................................................................................581 mssql_fetch_field ..............................................................................................................................................582 mssql_fetch_object............................................................................................................................................582 mssql_fetch_row ...............................................................................................................................................582 mssql_field_length ............................................................................................................................................583 mssql_field_name..............................................................................................................................................583 mssql_field_seek ...............................................................................................................................................583 mssql_field_type................................................................................................................................................583 mssql_free_result ..............................................................................................................................................583 mssql_get_last_message....................................................................................................................................583 mssql_min_error_severity .................................................................................................................................584 mssql_min_message_severity ...........................................................................................................................584 mssql_num_fields..............................................................................................................................................584 mssql_num_rows...............................................................................................................................................584 mssql_pconnect .................................................................................................................................................584 mssql_query ......................................................................................................................................................585 mssql_result.......................................................................................................................................................585 mssql_select_db ................................................................................................................................................585 LI. Ming pour Flash ....................................................................................................................................................586 SWFMovie ........................................................................................................................................................588 SWFMovie->output ..........................................................................................................................................588 SWFMovie->save..............................................................................................................................................588 SWFMovie->add ...............................................................................................................................................588 xxiv SWFMovie->remove.........................................................................................................................................589 SWFMovie->setbackground .............................................................................................................................589 SWFMovie->setrate ..........................................................................................................................................589 SWFMovie->setdimension................................................................................................................................589 SWFMovie->setframes .....................................................................................................................................589 SWFMovie->nextframe.....................................................................................................................................590 SWFMovie->streammp3 ...................................................................................................................................590 SWFDisplayItem ...............................................................................................................................................590 SWFDisplayItem->moveTo ..............................................................................................................................591 SWFDisplayItem->move...................................................................................................................................591 SWFDisplayItem->scaleTo ...............................................................................................................................591 SWFDisplayItem->scale ...................................................................................................................................591 SWFDisplayItem->rotateTo ..............................................................................................................................592 SWFDisplayItem->Rotate.................................................................................................................................593 SWFDisplayItem->skewXTo ............................................................................................................................593 SWFDisplayItem->skewX ................................................................................................................................594 SWFDisplayItem->skewYTo ............................................................................................................................594 SWFDisplayItem->skewY ................................................................................................................................594 SWFDisplayItem->setDepth .............................................................................................................................594 SWFDisplayItem->remove ...............................................................................................................................595 SWFDisplayItem->setName .............................................................................................................................595 SWFDisplayItem->setRatio ..............................................................................................................................595 SWFDisplayItem->addColor ............................................................................................................................596 SWFDisplayItem->multColor...........................................................................................................................596 SWFShape .........................................................................................................................................................597 SWFShape->setLine..........................................................................................................................................598 SWFShape->addFill ..........................................................................................................................................599 SWFShape->setLeftFill.....................................................................................................................................600 SWFShape->setRightFill ..................................................................................................................................601 SWFShape->movePenTo ..................................................................................................................................601 SWFShape->movePen.......................................................................................................................................601 SWFShape->drawLineTo ..................................................................................................................................602 SWFShape->drawLine ......................................................................................................................................602 SWFShape->drawCurveTo................................................................................................................................602 SWFShape->drawCurve....................................................................................................................................602 SWFGradient.....................................................................................................................................................602 SWFGradient->addEntry ..................................................................................................................................603 SWFBitmap.......................................................................................................................................................604 SWFBitmap->getWidth.....................................................................................................................................605 SWFBitmap->getHeight....................................................................................................................................605 SWFFill .............................................................................................................................................................606 SWFFill->moveTo.............................................................................................................................................606 SWFFill->scaleTo .............................................................................................................................................606 SWFFill->rotateTo ............................................................................................................................................606 SWFFill->skewXTo ..........................................................................................................................................606 SWFFill->skewYTo ..........................................................................................................................................607 SWFMorph........................................................................................................................................................607 SWFMorph->getshape1 ....................................................................................................................................608 SWFMorph->getshape2 ....................................................................................................................................608 SWFText............................................................................................................................................................608 SWFText->setFont ............................................................................................................................................609 SWFText->setHeight.........................................................................................................................................609 SWFText->setSpacing.......................................................................................................................................609 SWFText->setColor...........................................................................................................................................609 SWFText->moveTo ...........................................................................................................................................610 SWFText->addString.........................................................................................................................................610 SWFText->getWidth .........................................................................................................................................610 SWFFont ...........................................................................................................................................................610 swffont->getwidth .............................................................................................................................................611 SWFTextField ...................................................................................................................................................611 xxv SWFTextField->setFont ....................................................................................................................................611 SWFTextField->setbounds................................................................................................................................612 SWFTextField->align........................................................................................................................................612 SWFTextField->setHeight.................................................................................................................................612 SWFTextField->setLeftMargin .........................................................................................................................612 SWFTextField->setrightMargin ........................................................................................................................612 SWFTextField->setMargins ..............................................................................................................................613 SWFTextField->setindentation .........................................................................................................................613 SWFTextField->setLineSpacing .......................................................................................................................613 SWFTextField->setcolor ...................................................................................................................................613 SWFTextField->setname...................................................................................................................................613 SWFTextField->addstring .................................................................................................................................614 SWFSprite .........................................................................................................................................................614 SWFSprite->add................................................................................................................................................615 SWFSprite->remove..........................................................................................................................................615 SWFSprite->setframes ......................................................................................................................................615 SWFSprite->nextframe .....................................................................................................................................615 SWFbutton.........................................................................................................................................................615 SWFbutton->addShape .....................................................................................................................................618 SWFbutton->setUp............................................................................................................................................618 SWFbutton->setOver.........................................................................................................................................618 SWFbutton->setDown.......................................................................................................................................618 SWFbutton->setHit ...........................................................................................................................................618 SWFbutton->addAction ....................................................................................................................................619 SWFbutton->setAction......................................................................................................................................619 SWFAction ........................................................................................................................................................619 LII. Fonctions diverses................................................................................................................................................628 connection_aborted ...........................................................................................................................................629 connection_status ..............................................................................................................................................629 connection_timeout ...........................................................................................................................................629 define .................................................................................................................................................................629 constant..............................................................................................................................................................630 defined ...............................................................................................................................................................630 die ......................................................................................................................................................................630 eval ....................................................................................................................................................................631 exit .....................................................................................................................................................................631 get_browser .......................................................................................................................................................631 highlight_file .....................................................................................................................................................632 highlight_string .................................................................................................................................................633 ignore_user_abort..............................................................................................................................................634 iptcparse ............................................................................................................................................................634 leak ....................................................................................................................................................................634 pack ...................................................................................................................................................................634 show_source ......................................................................................................................................................635 sleep...................................................................................................................................................................636 uniqid.................................................................................................................................................................636 unpack ...............................................................................................................................................................636 usleep.................................................................................................................................................................637 LIII. mnoGoSearch .....................................................................................................................................................638 udm_add_search_limit ......................................................................................................................................639 udm_cat_path ....................................................................................................................................................639 udm_cat_list ......................................................................................................................................................640 Udm_Alloc_Agent ............................................................................................................................................641 udm_api_version ...............................................................................................................................................641 udm_clear_search_limits...................................................................................................................................642 Udm_Errno........................................................................................................................................................642 Udm_Error ........................................................................................................................................................642 Udm_Find..........................................................................................................................................................642 Udm_Free_Agent ..............................................................................................................................................643 udm_free_ispell_data ........................................................................................................................................643 xxvi Udm_Free_Res..................................................................................................................................................643 udm_get_doc_count ..........................................................................................................................................643 Udm_Get_Res_Field .........................................................................................................................................644 Udm_Get_Res_Param .......................................................................................................................................644 udm_load_ispell_data........................................................................................................................................645 udm_set_agent_param.......................................................................................................................................646 LIV. mSQL .................................................................................................................................................................649 msql ...................................................................................................................................................................650 msql_affected_rows...........................................................................................................................................650 msql_close .........................................................................................................................................................650 msql_connect.....................................................................................................................................................650 msql_create_db..................................................................................................................................................651 msql_createdb....................................................................................................................................................651 msql_data_seek .................................................................................................................................................651 msql_dbname ....................................................................................................................................................651 msql_drop_db....................................................................................................................................................651 msql_dropdb......................................................................................................................................................652 msql_error .........................................................................................................................................................652 msql_fetch_array ...............................................................................................................................................652 msql_fetch_field ................................................................................................................................................652 msql_fetch_object .............................................................................................................................................653 msql_fetch_row .................................................................................................................................................653 msql_fieldname .................................................................................................................................................653 msql_field_seek .................................................................................................................................................653 msql_fieldtable ..................................................................................................................................................654 msql_fieldtype ...................................................................................................................................................654 msql_fieldflags ..................................................................................................................................................654 msql_fieldlen .....................................................................................................................................................654 msql_free_result ................................................................................................................................................654 msql_freeresult ..................................................................................................................................................655 msql_list_fields..................................................................................................................................................655 msql_listfields....................................................................................................................................................655 msql_list_dbs.....................................................................................................................................................655 msql_listdbs.......................................................................................................................................................655 msql_list_tables.................................................................................................................................................655 msql_listtables...................................................................................................................................................656 msql_num_fields ...............................................................................................................................................656 msql_num_rows ................................................................................................................................................656 msql_numfields .................................................................................................................................................656 msql_numrows ..................................................................................................................................................656 msql_pconnect...................................................................................................................................................657 msql_query ........................................................................................................................................................657 msql_regcase .....................................................................................................................................................657 msql_result ........................................................................................................................................................657 msql_select_db ..................................................................................................................................................658 msql_selectdb ....................................................................................................................................................658 msql_tablename.................................................................................................................................................658 LV. MySQL ................................................................................................................................................................659 mysql_affected_rows.........................................................................................................................................660 mysql_change_user ...........................................................................................................................................660 mysql_close .......................................................................................................................................................660 mysql_connect...................................................................................................................................................661 mysql_create_db................................................................................................................................................661 mysql_data_seek ...............................................................................................................................................662 mysql_db_name ................................................................................................................................................662 mysql_db_query ................................................................................................................................................663 mysql_drop_db..................................................................................................................................................663 mysql_errno.......................................................................................................................................................663 mysql_error .......................................................................................................................................................664 mysql_fetch_array .............................................................................................................................................664 xxvii mysql_fetch_assoc ............................................................................................................................................665 mysql_fetch_field ..............................................................................................................................................665 mysql_fetch_lengths..........................................................................................................................................666 mysql_fetch_object ...........................................................................................................................................666 mysql_fetch_row ...............................................................................................................................................667 mysql_field_flags ..............................................................................................................................................667 mysql_field_name .............................................................................................................................................667 mysql_field_len .................................................................................................................................................668 mysql_field_seek ...............................................................................................................................................668 mysql_field_table ..............................................................................................................................................668 mysql_field_type ...............................................................................................................................................668 mysql_free_result ..............................................................................................................................................669 mysql_insert_id .................................................................................................................................................669 mysql_list_dbs...................................................................................................................................................669 mysql_list_fields................................................................................................................................................670 mysql_list_tables...............................................................................................................................................670 mysql_num_fields .............................................................................................................................................670 mysql_num_rows ..............................................................................................................................................670 mysql_pconnect.................................................................................................................................................671 mysql_query ......................................................................................................................................................671 mysql_result ......................................................................................................................................................672 mysql_select_db ................................................................................................................................................672 mysql_tablename...............................................................................................................................................673 LVI. Réseau.................................................................................................................................................................674 checkdnsrr .........................................................................................................................................................675 closelog..............................................................................................................................................................675 debugger_off......................................................................................................................................................675 debugger_on ......................................................................................................................................................675 define_syslog_variables.....................................................................................................................................675 fsockopen...........................................................................................................................................................675 gethostbyaddr ....................................................................................................................................................676 gethostbyname...................................................................................................................................................677 gethostbynamel..................................................................................................................................................677 getmxrr ..............................................................................................................................................................677 getprotobyname .................................................................................................................................................677 getprotobynumber .............................................................................................................................................678 getservbyname...................................................................................................................................................678 getservbyport .....................................................................................................................................................678 ip2long...............................................................................................................................................................678 long2ip...............................................................................................................................................................679 openlog ..............................................................................................................................................................679 pfsockopen.........................................................................................................................................................680 socket_get_status...............................................................................................................................................680 socket_set_blocking ..........................................................................................................................................680 socket_set_timeout ............................................................................................................................................680 syslog.................................................................................................................................................................681 LVII. ODBC unifié......................................................................................................................................................683 odbc_autocommit ..............................................................................................................................................684 odbc_binmode ...................................................................................................................................................684 odbc_close .........................................................................................................................................................684 odbc_close_all ...................................................................................................................................................685 odbc_commit .....................................................................................................................................................685 odbc_connect.....................................................................................................................................................685 odbc_cursor .......................................................................................................................................................686 odbc_do .............................................................................................................................................................686 odbc_error .........................................................................................................................................................686 odbc_errormsg...................................................................................................................................................686 odbc_exec ..........................................................................................................................................................687 odbc_execute .....................................................................................................................................................687 odbc_fetch_into .................................................................................................................................................687 xxviii odbc_fetch_row .................................................................................................................................................688 odbc_field_name ...............................................................................................................................................688 odbc_field_num .................................................................................................................................................688 odbc_field_type .................................................................................................................................................689 odbc_field_len ...................................................................................................................................................689 odbc_field_precision .........................................................................................................................................689 odbc_field_scale ................................................................................................................................................689 odbc_free_result ................................................................................................................................................689 odbc_longreadlen ..............................................................................................................................................690 odbc_num_fields ...............................................................................................................................................690 odbc_pconnect...................................................................................................................................................690 odbc_prepare .....................................................................................................................................................690 odbc_num_rows ................................................................................................................................................691 odbc_result ........................................................................................................................................................691 odbc_result_all ..................................................................................................................................................691 odbc_rollback ....................................................................................................................................................692 odbc_setoption ..................................................................................................................................................692 odbc_tables........................................................................................................................................................692 odbc_tableprivileges..........................................................................................................................................693 odbc_columns....................................................................................................................................................694 odbc_columnprivileges......................................................................................................................................694 odbc_gettypeinfo ...............................................................................................................................................695 odbc_primarykeys .............................................................................................................................................695 odbc_foreignkeys ..............................................................................................................................................696 odbc_procedures................................................................................................................................................697 odbc_procedurecolumns....................................................................................................................................697 odbc_specialcolumns ........................................................................................................................................698 odbc_statistics ...................................................................................................................................................698 LVIII. Oracle 8 ............................................................................................................................................................700 ociDefineByName .............................................................................................................................................702 ociBindByName ................................................................................................................................................702 ociLogon............................................................................................................................................................703 ociPLogon .........................................................................................................................................................704 ociNLogon.........................................................................................................................................................704 ociLogOff ..........................................................................................................................................................706 ociexecute ..........................................................................................................................................................706 ociCommit.........................................................................................................................................................706 ociRollback........................................................................................................................................................706 ociNewDescriptor..............................................................................................................................................707 ociRowCount.....................................................................................................................................................708 ociNumCols.......................................................................................................................................................708 ociResult............................................................................................................................................................709 ociFetch .............................................................................................................................................................709 ociFetchInto.......................................................................................................................................................709 ociFetchStatement .............................................................................................................................................710 ociColumnIsNULL............................................................................................................................................710 ociColumnName................................................................................................................................................710 ociColumnSize ..................................................................................................................................................711 ociColumnType .................................................................................................................................................712 ociServerVersion ...............................................................................................................................................713 ociStatementType ..............................................................................................................................................713 ociNewCursor....................................................................................................................................................714 ociFreeStatement ...............................................................................................................................................715 ociFreeCursor ....................................................................................................................................................715 ociFreeDesc .......................................................................................................................................................715 ociparse..............................................................................................................................................................715 ociError..............................................................................................................................................................715 ociinternaldebug ................................................................................................................................................716 OCICancel .........................................................................................................................................................716 ocisetprefetch ....................................................................................................................................................716 xxix OCIWriteLobToFile ..........................................................................................................................................716 OCISaveLobFile................................................................................................................................................716 OCISaveLob ......................................................................................................................................................717 OCILoadLob .....................................................................................................................................................717 OCIColumnScale ..............................................................................................................................................717 OCIColumnPrecision ........................................................................................................................................717 OCIColumnTypeRaw ........................................................................................................................................717 OCINewCollection............................................................................................................................................718 OCIFreeCollection ............................................................................................................................................718 OCICollAssign ..................................................................................................................................................718 OCICollAssignElem..........................................................................................................................................718 OCICollGetElem ...............................................................................................................................................718 OCICollMax......................................................................................................................................................718 OCICollSize ......................................................................................................................................................719 OCICollTrim .....................................................................................................................................................719 LIX. OpenSSL ............................................................................................................................................................720 openssl_error_string ..........................................................................................................................................723 openssl_free_key ...............................................................................................................................................723 openssl_get_privatekey .....................................................................................................................................723 openssl_get_publickey ......................................................................................................................................723 openssl_open .....................................................................................................................................................724 openssl_seal.......................................................................................................................................................724 openssl_sign ......................................................................................................................................................725 openssl_verify ...................................................................................................................................................725 openssl_pkcs7_decrypt......................................................................................................................................726 openssl_pkcs7_encrypt......................................................................................................................................727 openssl_pkcs7_sign ...........................................................................................................................................727 openssl_pkcs7_verify ........................................................................................................................................728 openssl_x509_checkpurpose .............................................................................................................................729 openssl_x509_free.............................................................................................................................................730 openssl_x509_parse ..........................................................................................................................................730 openssl_x509_read ............................................................................................................................................730 LX. Oracle...................................................................................................................................................................731 Ora_Bind ...........................................................................................................................................................732 Ora_Close..........................................................................................................................................................732 Ora_ColumnName ............................................................................................................................................732 Ora_ColumnSize ...............................................................................................................................................732 Ora_ColumnType ..............................................................................................................................................733 Ora_Commit......................................................................................................................................................733 Ora_CommitOff ................................................................................................................................................733 Ora_CommitOn .................................................................................................................................................733 Ora_Do ..............................................................................................................................................................734 Ora_Error ..........................................................................................................................................................734 Ora_ErrorCode ..................................................................................................................................................734 Ora_Exec ...........................................................................................................................................................734 Ora_Fetch ..........................................................................................................................................................735 Ora_Fetch_Into..................................................................................................................................................735 Ora_GetColumn ................................................................................................................................................735 Ora_Logoff........................................................................................................................................................735 Ora_Logon ........................................................................................................................................................736 Ora_pLogon ......................................................................................................................................................736 Ora_Numcols ....................................................................................................................................................736 Ora_Numrows ...................................................................................................................................................736 Ora_Open ..........................................................................................................................................................737 Ora_Parse ..........................................................................................................................................................737 Ora_Rollback ....................................................................................................................................................737 LXI. Ovrimos SQL .....................................................................................................................................................738 ovrimos_connect ...............................................................................................................................................739 ovrimos_close....................................................................................................................................................739 ovrimos_close_all..............................................................................................................................................739 xxx ovrimos_longreadlen .........................................................................................................................................739 ovrimos_prepare................................................................................................................................................740 ovrimos_execute................................................................................................................................................740 ovrimos_cursor..................................................................................................................................................740 ovrimos_exec.....................................................................................................................................................741 ovrimos_fetch_into............................................................................................................................................741 ovrimos_fetch_row............................................................................................................................................742 ovrimos_result ...................................................................................................................................................742 ovrimos_result_all .............................................................................................................................................743 ovrimos_num_rows ...........................................................................................................................................744 ovrimos_num_fields ..........................................................................................................................................744 ovrimos_field_name ..........................................................................................................................................744 ovrimos_field_type............................................................................................................................................744 ovrimos_field_len..............................................................................................................................................745 ovrimos_field_num............................................................................................................................................745 ovrimos_free_result...........................................................................................................................................745 ovrimos_commit................................................................................................................................................745 ovrimos_rollback...............................................................................................................................................745 LXII. Entrées/sorties ...................................................................................................................................................747 flush ...................................................................................................................................................................748 ob_start ..............................................................................................................................................................748 ob_gzhandler .....................................................................................................................................................749 ob_get_contents.................................................................................................................................................749 ob_get_length ....................................................................................................................................................749 ob_end_flush .....................................................................................................................................................750 ob_end_clean.....................................................................................................................................................750 ob_implicit_flush...............................................................................................................................................750 LXIII. PDF..................................................................................................................................................................751 pdf_add_annotation ...........................................................................................................................................756 pdf_add_bookmark............................................................................................................................................756 pdf_add_launchlink ...........................................................................................................................................756 pdf_add_locallink..............................................................................................................................................756 pdf_add_note .....................................................................................................................................................756 pdf_add_outline.................................................................................................................................................756 pdf_add_pdflink ................................................................................................................................................757 pdf_add_weblink ...............................................................................................................................................757 pdf_arc...............................................................................................................................................................757 pdf_attach_file ...................................................................................................................................................757 pdf_begin_page .................................................................................................................................................757 pdf_circle...........................................................................................................................................................758 pdf_clip..............................................................................................................................................................758 pdf_close ...........................................................................................................................................................758 pdf_closepath ....................................................................................................................................................758 pdf_closepath_fill_stroke ..................................................................................................................................758 pdf_closepath_stroke.........................................................................................................................................759 pdf_close_image................................................................................................................................................759 pdf_concat .........................................................................................................................................................759 pdf_continue_text..............................................................................................................................................759 pdf_curveto........................................................................................................................................................759 pdf_delete ..........................................................................................................................................................760 pdf_end_page ....................................................................................................................................................760 pdf_endpath .......................................................................................................................................................760 pdf_fill ...............................................................................................................................................................760 pdf_fill_stroke ...................................................................................................................................................760 pdf_findfont .......................................................................................................................................................761 pdf_get_buffer ...................................................................................................................................................761 pdf_get_font ......................................................................................................................................................761 pdf_get_fontname..............................................................................................................................................761 pdf_get_fontsize ................................................................................................................................................761 pdf_get_image_height .......................................................................................................................................762 xxxi pdf_get_image_width........................................................................................................................................762 pdf_get_parameter.............................................................................................................................................762 pdf_get_value ....................................................................................................................................................762 pdf_lineto ..........................................................................................................................................................762 pdf_moveto........................................................................................................................................................762 pdf_new .............................................................................................................................................................763 pdf_open............................................................................................................................................................763 pdf_open_CCITT ..............................................................................................................................................763 pdf_open_file.....................................................................................................................................................763 pdf_open_gif .....................................................................................................................................................764 pdf_open_image ................................................................................................................................................764 pdf_open_image_file .........................................................................................................................................764 pdf_open_png....................................................................................................................................................764 pdf_open_jpeg ...................................................................................................................................................764 pdf_open_tiff .....................................................................................................................................................765 pdf_place_image ...............................................................................................................................................765 pdf_rect..............................................................................................................................................................765 pdf_restore.........................................................................................................................................................765 pdf_rotate ..........................................................................................................................................................766 pdf_save.............................................................................................................................................................766 pdf_scale............................................................................................................................................................766 pdf_setdash........................................................................................................................................................766 pdf_setflat ..........................................................................................................................................................767 pdf_setfont.........................................................................................................................................................767 pdf_setgray ........................................................................................................................................................767 pdf_setgray_fill..................................................................................................................................................767 pdf_setgray_stroke ............................................................................................................................................767 pdf_setlinecap....................................................................................................................................................768 pdf_setlinejoin ...................................................................................................................................................768 pdf_setlinewidth ................................................................................................................................................768 pdf_setmiterlimit ...............................................................................................................................................768 pdf_setpolydash.................................................................................................................................................768 pdf_setrgbcolor..................................................................................................................................................769 pdf_setrgbcolor_fill ...........................................................................................................................................769 pdf_setrgbcolor_stroke ......................................................................................................................................769 pdf_set_border_color ........................................................................................................................................769 pdf_set_border_dash .........................................................................................................................................769 pdf_set_border_style .........................................................................................................................................770 pdf_set_char_spacing ........................................................................................................................................770 pdf_set_duration................................................................................................................................................770 pdf_set_font.......................................................................................................................................................770 pdf_set_horiz_scaling........................................................................................................................................771 pdf_set_info.......................................................................................................................................................771 pdf_set_leading .................................................................................................................................................771 pdf_set_parameter .............................................................................................................................................771 pdf_set_text_pos................................................................................................................................................772 pdf_set_text_rendering......................................................................................................................................772 pdf_set_text_matrix...........................................................................................................................................772 pdf_set_value.....................................................................................................................................................772 pdf_set_word_spacing.......................................................................................................................................772 pdf_show ...........................................................................................................................................................773 pdf_show_boxed................................................................................................................................................773 pdf_show_xy .....................................................................................................................................................773 pdf_skew ...........................................................................................................................................................773 pdf_stringwidth .................................................................................................................................................774 pdf_stroke..........................................................................................................................................................774 pdf_translate ......................................................................................................................................................774 pdf_open_memory_image.................................................................................................................................774 LXIV. Verisign Payflow Pro Paiement .......................................................................................................................776 pfpro_init ...........................................................................................................................................................777 xxxii pfpro_cleanup....................................................................................................................................................777 pfpro_process ....................................................................................................................................................777 pfpro_process_raw ............................................................................................................................................778 pfpro_version.....................................................................................................................................................778 LXV. Options PHP et informations ............................................................................................................................780 assert..................................................................................................................................................................781 assert-options.....................................................................................................................................................781 extension_loaded ...............................................................................................................................................781 dl........................................................................................................................................................................782 getenv ................................................................................................................................................................782 get_cfg_var........................................................................................................................................................782 get_current_user ................................................................................................................................................782 get_magic_quotes_gpc ......................................................................................................................................783 get_magic_quotes_runtime ...............................................................................................................................783 getlastmod .........................................................................................................................................................783 getmyinode ........................................................................................................................................................783 getmypid............................................................................................................................................................784 getmyuid............................................................................................................................................................784 getrusage............................................................................................................................................................784 ini_alter..............................................................................................................................................................785 ini_get................................................................................................................................................................785 ini_restore..........................................................................................................................................................785 ini_set ................................................................................................................................................................785 phpcredits ..........................................................................................................................................................787 phpinfo ..............................................................................................................................................................788 phpversion .........................................................................................................................................................789 php_logo_guid...................................................................................................................................................789 php_sapi_name..................................................................................................................................................789 php_uname ........................................................................................................................................................790 putenv ................................................................................................................................................................790 set_magic_quotes_runtime................................................................................................................................791 set_time_limit....................................................................................................................................................791 zend_logo_guid .................................................................................................................................................791 get_defined_constants .......................................................................................................................................791 get_loaded_extensions.......................................................................................................................................792 get_extension_funcs ..........................................................................................................................................793 get_required_files ..............................................................................................................................................793 get_included_files..............................................................................................................................................793 zend_version......................................................................................................................................................794 LXVI. POSIX .............................................................................................................................................................796 posix_kill...........................................................................................................................................................797 posix_getpid ......................................................................................................................................................797 posix_getppid ....................................................................................................................................................797 posix_getuid ......................................................................................................................................................797 posix_geteuid ....................................................................................................................................................797 posix_getgid ......................................................................................................................................................797 posix_getegid.....................................................................................................................................................798 posix_setuid.......................................................................................................................................................798 posix_setgid.......................................................................................................................................................798 posix_getgroups ................................................................................................................................................798 posix_getlogin ...................................................................................................................................................798 posix_getpgrp ....................................................................................................................................................799 posix_setsid .......................................................................................................................................................799 posix_setpgid.....................................................................................................................................................799 posix_getpgid ....................................................................................................................................................799 posix_getsid.......................................................................................................................................................799 posix_uname......................................................................................................................................................800 posix_times........................................................................................................................................................800 posix_ctermid ....................................................................................................................................................800 posix_ttyname ...................................................................................................................................................801 xxxiii posix_isatty........................................................................................................................................................801 posix_getcwd.....................................................................................................................................................801 posix_mkfifo......................................................................................................................................................801 posix_getgrnam .................................................................................................................................................801 posix_getgrgid ...................................................................................................................................................801 posix_getpwnam................................................................................................................................................802 posix_getpwuid .................................................................................................................................................802 posix_getrlimit ..................................................................................................................................................803 LXVII. PostgreSQL ....................................................................................................................................................804 pg_Close............................................................................................................................................................805 pg_cmdTuples ...................................................................................................................................................805 pg_Connect........................................................................................................................................................805 pg_DBname.......................................................................................................................................................806 pg_end_copy .....................................................................................................................................................806 pg_ErrorMessage ..............................................................................................................................................806 pg_Exec .............................................................................................................................................................806 pg_Fetch_Array.................................................................................................................................................807 pg_Fetch_Object ...............................................................................................................................................807 pg_Fetch_Row...................................................................................................................................................808 pg_FieldIsNull...................................................................................................................................................809 pg_FieldName ...................................................................................................................................................809 pg_FieldNum.....................................................................................................................................................809 pg_FieldPrtLen..................................................................................................................................................810 pg_FieldSize......................................................................................................................................................810 pg_FieldType.....................................................................................................................................................810 pg_FreeResult....................................................................................................................................................810 pg_GetLastOid ..................................................................................................................................................810 pg_Host .............................................................................................................................................................811 pg_loclose..........................................................................................................................................................811 pg_locreate ........................................................................................................................................................811 pg_loexport........................................................................................................................................................811 pg_loimport .......................................................................................................................................................811 pg_loopen ..........................................................................................................................................................812 pg_loread ...........................................................................................................................................................812 pg_loreadall .......................................................................................................................................................812 pg_lounlink........................................................................................................................................................812 pg_lowrite..........................................................................................................................................................812 pg_NumFields ...................................................................................................................................................813 pg_NumRows....................................................................................................................................................813 pg_Options ........................................................................................................................................................813 pg_pConnect......................................................................................................................................................813 pg_Port ..............................................................................................................................................................813 pg_put_line........................................................................................................................................................814 pg_Result...........................................................................................................................................................814 pg_set_client_encoding .....................................................................................................................................814 pg_client_encoding ...........................................................................................................................................815 pg_trace .............................................................................................................................................................815 pg_tty.................................................................................................................................................................815 pg_untrace .........................................................................................................................................................816 LXVIII. Exécution de programmes externes ..............................................................................................................817 escapeshellarg....................................................................................................................................................818 escapeshellcmd..................................................................................................................................................818 exec....................................................................................................................................................................818 passthru..............................................................................................................................................................819 system................................................................................................................................................................819 LXIX. Printer functions ..............................................................................................................................................820 printer_open ......................................................................................................................................................821 printer_abort ......................................................................................................................................................821 printer_close ......................................................................................................................................................821 printer_write ......................................................................................................................................................821 xxxiv printer_list .........................................................................................................................................................822 printer_set_option..............................................................................................................................................822 printer_get_option .............................................................................................................................................824 printer_create_dc ...............................................................................................................................................824 printer_delete_dc ...............................................................................................................................................824 printer_start_doc................................................................................................................................................825 printer_end_doc.................................................................................................................................................825 printer_start_page..............................................................................................................................................825 printer_end_page ...............................................................................................................................................825 printer_create_pen .............................................................................................................................................826 printer_delete_pen .............................................................................................................................................826 printer_select_pen .............................................................................................................................................826 printer_create_brush..........................................................................................................................................827 printer_delete_brush..........................................................................................................................................827 printer_select_brush ..........................................................................................................................................827 printer_create_font ............................................................................................................................................828 printer_delete_font ............................................................................................................................................829 printer_select_font.............................................................................................................................................829 printer_logical_fontheight .................................................................................................................................829 printer_draw_roundrect .....................................................................................................................................830 printer_draw_rectangle......................................................................................................................................830 printer_draw_elipse ...........................................................................................................................................831 printer_draw_text ..............................................................................................................................................832 printer_draw_line ..............................................................................................................................................832 printer_draw_chord ...........................................................................................................................................832 printer_draw_pie ...............................................................................................................................................833 printer_draw_bmp .............................................................................................................................................834 LXX. Pspell.................................................................................................................................................................835 pspell_add_to_personal .....................................................................................................................................836 pspell_add_to_session .......................................................................................................................................836 pspell_check ......................................................................................................................................................836 pspell_clear_session ..........................................................................................................................................836 pspell_config_create..........................................................................................................................................837 pspell_config_ignore .........................................................................................................................................838 pspell_config_mode ..........................................................................................................................................838 pspell_config_personal......................................................................................................................................839 pspell_config_repl .............................................................................................................................................839 pspell_config_runtogether .................................................................................................................................839 pspell_config_save_repl ....................................................................................................................................840 pspell_new.........................................................................................................................................................840 pspell_new_config.............................................................................................................................................841 pspell_new_personal .........................................................................................................................................841 pspell_save_wordlist .........................................................................................................................................842 pspell_store_replacement ..................................................................................................................................843 pspell_suggest ...................................................................................................................................................843 LXXI. Readline (GNU) ..............................................................................................................................................844 readline ..............................................................................................................................................................845 readline_add_history .........................................................................................................................................845 readline_clear_history .......................................................................................................................................845 readline_completion_function...........................................................................................................................845 readline_info......................................................................................................................................................845 readline_list_history ..........................................................................................................................................846 readline_read_history ........................................................................................................................................846 readline_write_history.......................................................................................................................................846 LXXII. Recode (GNU) ...............................................................................................................................................847 recode_string .....................................................................................................................................................848 recode ................................................................................................................................................................848 recode_file .........................................................................................................................................................848 LXXIII. Expressions régulières compatibles Perl ......................................................................................................849 preg_match ........................................................................................................................................................850 xxxv preg_match_all ..................................................................................................................................................850 preg_replace ......................................................................................................................................................852 preg_replace_callback .......................................................................................................................................854 preg_split ...........................................................................................................................................................854 preg_quote .........................................................................................................................................................855 preg_grep...........................................................................................................................................................855 options de recherche..........................................................................................................................................856 syntaxe des masques..........................................................................................................................................857 LXXIV. Expressions régulières ..................................................................................................................................870 ereg ....................................................................................................................................................................871 ereg_replace.......................................................................................................................................................871 eregi ...................................................................................................................................................................872 eregi_replace .....................................................................................................................................................872 split ....................................................................................................................................................................872 spliti...................................................................................................................................................................873 sql_regcase ........................................................................................................................................................873 LXXV. Satellite CORBA client extension .................................................................................................................875 OrbitObject........................................................................................................................................................876 OrbitEnum .........................................................................................................................................................876 OrbitStruct .........................................................................................................................................................877 satellite_caught_exception ................................................................................................................................877 satellite_exception_id........................................................................................................................................878 satellite_exception_value ..................................................................................................................................878 LXXVI. Sémaphores et gestion de la mémoire partagée............................................................................................879 sem_get..............................................................................................................................................................880 sem_acquire.......................................................................................................................................................880 sem_release .......................................................................................................................................................880 shm_attach.........................................................................................................................................................880 shm_detach........................................................................................................................................................881 shm_remove ......................................................................................................................................................881 shm_put_var ......................................................................................................................................................881 shm_get_var ......................................................................................................................................................881 shm_remove_var ...............................................................................................................................................882 LXXVII. SESAM .......................................................................................................................................................883 sesam_connect...................................................................................................................................................887 sesam_disconnect ..............................................................................................................................................887 sesam_settransaction .........................................................................................................................................887 sesam_commit ...................................................................................................................................................888 sesam_rollback ..................................................................................................................................................889 sesam_execimm.................................................................................................................................................889 sesam_query ......................................................................................................................................................890 sesam_num_fields .............................................................................................................................................891 sesam_field_name .............................................................................................................................................891 sesam_diagnostic...............................................................................................................................................892 sesam_fetch_result ............................................................................................................................................893 sesam_affected_rows.........................................................................................................................................894 sesam_errormsg.................................................................................................................................................894 sesam_field_array..............................................................................................................................................895 sesam_fetch_row ...............................................................................................................................................896 sesam_fetch_array .............................................................................................................................................898 sesam_seek_row................................................................................................................................................899 sesam_free_result ..............................................................................................................................................899 LXXVIII. Sessions......................................................................................................................................................901 session_start ......................................................................................................................................................904 session_destroy..................................................................................................................................................904 session_name.....................................................................................................................................................904 session_module_name.......................................................................................................................................904 session_save_path .............................................................................................................................................905 session_id ..........................................................................................................................................................905 session_register .................................................................................................................................................905 xxxvi session_unregister .............................................................................................................................................906 session_unset .....................................................................................................................................................906 session_is_registered .........................................................................................................................................906 session_get_cookie_params ..............................................................................................................................907 session_set_cookie_params...............................................................................................................................907 session_decode ..................................................................................................................................................907 session_encode ..................................................................................................................................................907 session_set_save_handler ..................................................................................................................................908 session_cache_limiter........................................................................................................................................909 LXXIX. Mémoire partagée.........................................................................................................................................910 shmop_open ......................................................................................................................................................911 shmop_read .......................................................................................................................................................911 shmop_write ......................................................................................................................................................911 shmop_size ........................................................................................................................................................912 shmop_delete.....................................................................................................................................................912 shmop_close ......................................................................................................................................................913 LXXX. Shockwave Flash ...........................................................................................................................................914 swf_openfile ......................................................................................................................................................915 swf_closefile......................................................................................................................................................915 swf_labelframe ..................................................................................................................................................916 swf_showframe .................................................................................................................................................916 swf_setframe .....................................................................................................................................................916 swf_getframe .....................................................................................................................................................916 swf_mulcolor.....................................................................................................................................................916 swf_addcolor .....................................................................................................................................................917 swf_placeobject .................................................................................................................................................917 swf_modifyobject..............................................................................................................................................917 swf_removeobject .............................................................................................................................................918 swf_nextid .........................................................................................................................................................918 swf_startdoaction ..............................................................................................................................................918 swf_actiongotoframe .........................................................................................................................................918 swf_actiongeturl ................................................................................................................................................918 swf_actionnextframe .........................................................................................................................................918 swf_actionprevframe .........................................................................................................................................919 swf_actionplay ..................................................................................................................................................919 swf_actionstop...................................................................................................................................................919 swf_actiontogglequality ....................................................................................................................................919 swf_actionwaitforframe.....................................................................................................................................919 swf_actionsettarget............................................................................................................................................920 swf_actiongotolabel ..........................................................................................................................................920 swf_enddoaction................................................................................................................................................920 swf_defineline ...................................................................................................................................................920 swf_definerect ...................................................................................................................................................920 swf_definepoly ..................................................................................................................................................920 swf_startshape ...................................................................................................................................................921 swf_shapelinesolid ............................................................................................................................................921 swf_shapefilloff .................................................................................................................................................921 swf_shapefillsolid..............................................................................................................................................921 swf_shapefillbitmapclip ....................................................................................................................................921 swf_shapefillbitmaptile .....................................................................................................................................922 swf_shapemoveto ..............................................................................................................................................922 swf_shapelineto .................................................................................................................................................922 swf_shapecurveto ..............................................................................................................................................922 swf_shapecurveto3 ............................................................................................................................................922 swf_shapearc .....................................................................................................................................................923 swf_endshape ....................................................................................................................................................923 swf_definefont ...................................................................................................................................................923 swf_setfont ........................................................................................................................................................923 swf_fontsize ......................................................................................................................................................923 swf_fontslant .....................................................................................................................................................924 xxxvii swf_fonttracking................................................................................................................................................924 swf_getfontinfo .................................................................................................................................................924 swf_definetext ...................................................................................................................................................924 swf_textwidth ....................................................................................................................................................924 swf_definebitmap ..............................................................................................................................................925 swf_getbitmapinfo.............................................................................................................................................925 swf_startsymbol ................................................................................................................................................925 swf_endsymbol..................................................................................................................................................925 swf_startbutton ..................................................................................................................................................925 swf_addbuttonrecord .........................................................................................................................................926 swf_oncondition ................................................................................................................................................926 swf_endbutton ...................................................................................................................................................927 swf_viewport .....................................................................................................................................................927 swf_ortho...........................................................................................................................................................927 swf_ortho2.........................................................................................................................................................927 swf_perspective .................................................................................................................................................927 swf_polarview ...................................................................................................................................................928 swf_lookat .........................................................................................................................................................928 swf_pushmatrix .................................................................................................................................................928 swf_popmatrix...................................................................................................................................................928 swf_scale ...........................................................................................................................................................929 swf_translate......................................................................................................................................................929 swf_rotate ..........................................................................................................................................................929 swf_posround ....................................................................................................................................................929 LXXXI. SNMP ...........................................................................................................................................................930 snmpget .............................................................................................................................................................931 snmpset..............................................................................................................................................................931 snmpwalk ..........................................................................................................................................................931 snmpwalkoid .....................................................................................................................................................932 snmp_get_quick_print .......................................................................................................................................932 snmp_set_quick_print .......................................................................................................................................932 LXXXII. Sockets ........................................................................................................................................................934 accept_connect ..................................................................................................................................................936 bind....................................................................................................................................................................936 close...................................................................................................................................................................936 connect ..............................................................................................................................................................936 listen ..................................................................................................................................................................937 read ....................................................................................................................................................................937 socket.................................................................................................................................................................937 strerror ...............................................................................................................................................................938 write...................................................................................................................................................................938 LXXXIII. Chaîne de caractères ..................................................................................................................................939 AddCSlashes .....................................................................................................................................................940 AddSlashes ........................................................................................................................................................940 bin2hex ..............................................................................................................................................................940 chop ...................................................................................................................................................................940 chr......................................................................................................................................................................941 chunk_split ........................................................................................................................................................941 convert_cyr_string .............................................................................................................................................941 count_chars........................................................................................................................................................942 crc32 ..................................................................................................................................................................942 crypt...................................................................................................................................................................942 echo ...................................................................................................................................................................943 explode ..............................................................................................................................................................944 get_html_translation_table ................................................................................................................................944 get_meta_tags....................................................................................................................................................945 hebrev ................................................................................................................................................................945 hebrevc ..............................................................................................................................................................946 htmlentities ........................................................................................................................................................946 htmlspecialchars ................................................................................................................................................946 xxxviii implode..............................................................................................................................................................947 join.....................................................................................................................................................................947 levenshtein.........................................................................................................................................................947 localeconv..........................................................................................................................................................948 ltrim ...................................................................................................................................................................950 md5....................................................................................................................................................................950 metaphone .........................................................................................................................................................950 nl2br ..................................................................................................................................................................950 ord......................................................................................................................................................................951 parse_str ............................................................................................................................................................951 print ...................................................................................................................................................................951 printf ..................................................................................................................................................................952 quoted_printable_decode ..................................................................................................................................952 QuoteMeta .........................................................................................................................................................952 rtrim ...................................................................................................................................................................952 sscanf .................................................................................................................................................................953 setlocale .............................................................................................................................................................953 similar_text........................................................................................................................................................954 soundex..............................................................................................................................................................954 sprintf ................................................................................................................................................................955 strncasecmp .......................................................................................................................................................956 strcasecmp .........................................................................................................................................................956 strchr..................................................................................................................................................................957 strcmp ................................................................................................................................................................957 strcoll .................................................................................................................................................................957 strcspn................................................................................................................................................................958 strip_tags ...........................................................................................................................................................958 StripCSlashes ....................................................................................................................................................958 StripSlashes .......................................................................................................................................................958 stristr..................................................................................................................................................................959 strlen ..................................................................................................................................................................959 strnatcmp ...........................................................................................................................................................959 strnatcasecmp ....................................................................................................................................................960 strncmp ..............................................................................................................................................................960 str_pad ...............................................................................................................................................................960 strpos .................................................................................................................................................................961 strrchr ................................................................................................................................................................962 str_repeat ...........................................................................................................................................................962 strrev..................................................................................................................................................................962 strrpos ................................................................................................................................................................963 strspn .................................................................................................................................................................963 strstr ...................................................................................................................................................................963 strtok..................................................................................................................................................................964 strtolower...........................................................................................................................................................964 strtoupper...........................................................................................................................................................965 str_replace .........................................................................................................................................................965 strtr ....................................................................................................................................................................966 substr .................................................................................................................................................................966 substr_count ......................................................................................................................................................967 substr_replace....................................................................................................................................................967 trim ....................................................................................................................................................................968 ucfirst .................................................................................................................................................................968 ucwords .............................................................................................................................................................969 wordwrap...........................................................................................................................................................969 LXXXIV. Sybase........................................................................................................................................................971 sybase_affected_rows........................................................................................................................................972 sybase_close ......................................................................................................................................................972 sybase_connect..................................................................................................................................................972 sybase_data_seek ..............................................................................................................................................972 sybase_fetch_array ............................................................................................................................................973 xxxix sybase_fetch_field .............................................................................................................................................973 sybase_fetch_object ..........................................................................................................................................973 sybase_fetch_row ..............................................................................................................................................974 sybase_field_seek ..............................................................................................................................................974 sybase_free_result .............................................................................................................................................974 sybase_get_last_message ..................................................................................................................................974 sybase_min_client_severity...............................................................................................................................974 sybase_min_error_severity................................................................................................................................975 sybase_min_message_severity ..........................................................................................................................975 sybase_min_server_severity..............................................................................................................................975 sybase_num_fields ............................................................................................................................................975 sybase_num_rows .............................................................................................................................................976 sybase_pconnect................................................................................................................................................976 sybase_query .....................................................................................................................................................976 sybase_result .....................................................................................................................................................976 sybase_select_db ...............................................................................................................................................977 LXXXV. URL.............................................................................................................................................................978 base64_decode ..................................................................................................................................................979 base64_encode ..................................................................................................................................................979 parse_url ............................................................................................................................................................979 rawurldecode .....................................................................................................................................................979 rawurlencode .....................................................................................................................................................979 urldecode ...........................................................................................................................................................980 urlencode ...........................................................................................................................................................980 LXXXVI. Variables ....................................................................................................................................................982 doubleval ...........................................................................................................................................................983 empty .................................................................................................................................................................983 gettype ...............................................................................................................................................................983 get_defined_vars................................................................................................................................................984 get_resource_type..............................................................................................................................................984 intval..................................................................................................................................................................985 is_array ..............................................................................................................................................................985 is_bool ...............................................................................................................................................................985 is_double ...........................................................................................................................................................985 is_float ...............................................................................................................................................................985 is_int ..................................................................................................................................................................986 is_integer ...........................................................................................................................................................986 is_long ...............................................................................................................................................................986 is_null ................................................................................................................................................................986 is_numeric .........................................................................................................................................................986 is_object ............................................................................................................................................................987 is_real ................................................................................................................................................................987 is_resource.........................................................................................................................................................987 is_scalar .............................................................................................................................................................987 is_string .............................................................................................................................................................988 isset....................................................................................................................................................................988 print_r ................................................................................................................................................................989 serialize..............................................................................................................................................................989 settype................................................................................................................................................................989 strval ..................................................................................................................................................................990 unserialize..........................................................................................................................................................990 unset ..................................................................................................................................................................991 var_dump...........................................................................................................................................................992 LXXXVII. WDDX .....................................................................................................................................................994 wddx_serialize_value ........................................................................................................................................995 wddx_serialize_vars ..........................................................................................................................................995 wddx_packet_start.............................................................................................................................................995 wddx_packet_end..............................................................................................................................................995 wddx_add_vars..................................................................................................................................................996 wddx_deserialize ...............................................................................................................................................996 xl LXXXVIII. Analyseur syntaxique XML....................................................................................................................997 xml_parser_create ...........................................................................................................................................1004 xml_set_object ................................................................................................................................................1004 xml_set_element_handler................................................................................................................................1004 xml_set_character_data_handler .....................................................................................................................1005 xml_set_processing_instruction_handler ........................................................................................................1006 xml_set_default_handler .................................................................................................................................1007 xml_set_unparsed_entity_decl_handler ..........................................................................................................1007 xml_set_notation_decl_handler ......................................................................................................................1008 xml_set_external_entity_ref_handler..............................................................................................................1009 xml_parse ........................................................................................................................................................1009 xml_get_error_code ........................................................................................................................................1010 xml_error_string..............................................................................................................................................1010 xml_get_current_line_number ........................................................................................................................1010 xml_get_current_column_number ..................................................................................................................1011 xml_get_current_byte_index...........................................................................................................................1011 xml_parse_into_struct .....................................................................................................................................1011 xml_parser_free...............................................................................................................................................1014 xml_parser_set_option ....................................................................................................................................1014 xml_parser_get_option....................................................................................................................................1015 utf8_decode .....................................................................................................................................................1015 utf8_encode .....................................................................................................................................................1015 LXXXIX. XSLT........................................................................................................................................................1017 xslt_closelog....................................................................................................................................................1018 xslt_create........................................................................................................................................................1018 xslt_errno.........................................................................................................................................................1018 xslt_error .........................................................................................................................................................1018 xslt_fetch_result ..............................................................................................................................................1018 xslt_free ...........................................................................................................................................................1018 xslt_openlog ....................................................................................................................................................1019 xslt_output_begintransform.............................................................................................................................1019 xslt_output_endtransform................................................................................................................................1019 xslt_process .....................................................................................................................................................1019 xslt_run............................................................................................................................................................1021 xslt_set_sax_handler .......................................................................................................................................1021 xslt_transform..................................................................................................................................................1021 XC. YAZ ...................................................................................................................................................................1022 yaz_addinfo .....................................................................................................................................................1024 yaz_close .........................................................................................................................................................1024 yaz_connect .....................................................................................................................................................1024 yaz_errno .........................................................................................................................................................1024 yaz_error..........................................................................................................................................................1024 yaz_hits............................................................................................................................................................1025 yaz_element.....................................................................................................................................................1025 yaz_database....................................................................................................................................................1025 yaz_present......................................................................................................................................................1025 yaz_range ........................................................................................................................................................1025 yaz_record .......................................................................................................................................................1026 yaz_search .......................................................................................................................................................1026 yaz_syntax .......................................................................................................................................................1027 yaz_scan ..........................................................................................................................................................1027 yaz_scan_result ...............................................................................................................................................1028 yaz_ccl_conf....................................................................................................................................................1028 yaz_ccl_parse ..................................................................................................................................................1028 yaz_itemorder..................................................................................................................................................1029 yaz_wait...........................................................................................................................................................1030 XCI. NIS ...................................................................................................................................................................1032 yp_get_default_domain ...................................................................................................................................1033 yp_order ..........................................................................................................................................................1033 yp_master ........................................................................................................................................................1033 xli yp_match .........................................................................................................................................................1034 yp_first.............................................................................................................................................................1034 yp_next ............................................................................................................................................................1034 XCII. Zip (décompression) .......................................................................................................................................1036 zip_close..........................................................................................................................................................1037 zip_entry_close................................................................................................................................................1037 zip_entry_compressedsize...............................................................................................................................1037 zip_entry_compressionmethod........................................................................................................................1037 zip_entry_filesize ............................................................................................................................................1037 zip_entry_name ...............................................................................................................................................1038 zip_entry_open ................................................................................................................................................1038 zip_entry_read .................................................................................................................................................1038 zip_open ..........................................................................................................................................................1038 zip_read ...........................................................................................................................................................1039 XCIII. Zlib (Compression)........................................................................................................................................1040 gzclose .............................................................................................................................................................1041 gzeof ................................................................................................................................................................1041 gzfile ................................................................................................................................................................1041 gzgetc ..............................................................................................................................................................1041 gzgets...............................................................................................................................................................1041 gzgetss .............................................................................................................................................................1042 gzopen .............................................................................................................................................................1042 gzpassthru........................................................................................................................................................1042 gzputs ..............................................................................................................................................................1043 gzread ..............................................................................................................................................................1043 gzrewind ..........................................................................................................................................................1043 gzseek ..............................................................................................................................................................1044 gztell ................................................................................................................................................................1044 gzwrite .............................................................................................................................................................1044 readgzfile .........................................................................................................................................................1044 gzcompress ......................................................................................................................................................1045 gzuncompress ..................................................................................................................................................1045 gzdeflate ..........................................................................................................................................................1045 gzinflate ...........................................................................................................................................................1046 gzencode..........................................................................................................................................................1046 V. PEAR: the PHP Extension and Application Repository..........................................................................................1047 24. A propos de PEAR..............................................................................................................................................1047 Qu’est ce que PEAR? ......................................................................................................................................1048 25. Style de codage PEAR ........................................................................................................................................1049 Indentation.......................................................................................................................................................1050 Structures de contrôle......................................................................................................................................1050 Appels de fonctions .........................................................................................................................................1050 Définitions de fonctions ..................................................................................................................................1051 Commentaires..................................................................................................................................................1051 Inclusion de code.............................................................................................................................................1052 Balises de code PHP........................................................................................................................................1052 Entête de fichier...............................................................................................................................................1052 Balises CVS.....................................................................................................................................................1053 URL d’exemple ...............................................................................................................................................1053 Noms des constantes .......................................................................................................................................1053 XCIV. Manuel de référence PEAR...........................................................................................................................1054 PEAR...............................................................................................................................................................1055 PEAR_Error ....................................................................................................................................................1057 xlii VI. FAQ: Frequently Asked Questions ...........................................................................................................................1059 26. General Information............................................................................................................................................1059 27. Mailing lists ........................................................................................................................................................1061 28. Obtaining PHP ....................................................................................................................................................1063 29. Connecting to databases......................................................................................................................................1066 30. Installation...........................................................................................................................................................1070 31. Build Problems ...................................................................................................................................................1073 32. Using PHP...........................................................................................................................................................1077 33. PHP and HTML ..................................................................................................................................................1081 34. PHP and other languages ....................................................................................................................................1083 35. Common Problems .............................................................................................................................................1085 36. Migrating from PHP 2 to PHP 3 .........................................................................................................................1087 37. Migrating from PHP 3 to PHP 4 .........................................................................................................................1089 38. Miscellaneous Questions ....................................................................................................................................1091 VII. Appendices ................................................................................................................................................................1093 A. Migration de PHP/FI 2.0 à PHP 3.0.....................................................................................................................1093 A propos des incompatibilités en 3.0 ..............................................................................................................1094 Balises PHP .....................................................................................................................................................1094 Syntaxe if..endif ..............................................................................................................................................1094 Syntaxe while ..................................................................................................................................................1095 Types d’expression ..........................................................................................................................................1095 Les messages d’erreur ont changé...................................................................................................................1096 Evaluation rapide des booléens .......................................................................................................................1096 La valeur TRUE/FALSE comme retour de fonctions ........................................................................................1096 Diverses incompatibilités ................................................................................................................................1097 B. Migration de PHP 3.0 à PHP 4.0..........................................................................................................................1098 Ce qui a changé en PHP 4.0 ............................................................................................................................1099 Comportement de l’analyseur .........................................................................................................................1099 Rapport d’erreur ..............................................................................................................................................1099 Changement de configuration ................................................................................................................1099 Nouveaux messages d’erreurs ...............................................................................................................1099 Initialiseur........................................................................................................................................................1100 empty("0") ...................................................................................................................................................1100 Fonctions manquantes .....................................................................................................................................1100 Fonctions manquantes pour des raisons de structure.............................................................................1100 Fonctions et extensions obsolètes ..........................................................................................................1100 Nouveau statut pour unset() ..................................................................................................................1100 Extensions PHP 3.0 .........................................................................................................................................1101 Substitution de variables dans les chaînes.......................................................................................................1101 Cookies............................................................................................................................................................1101 C. Développement PHP ............................................................................................................................................1102 Créer une fonction PHP 3................................................................................................................................1103 Prototypes de fonctions..........................................................................................................................1103 Arguments de fonctions .........................................................................................................................1103 Fonctions à nombre d’arguments variable.............................................................................................1103 Utiliser les arguments d’une fonction....................................................................................................1103 Gestion de la mémoire dans une fonction..............................................................................................1104 Affecter une variable dans la table des symboles ..................................................................................1104 Retourne une valeur simple ...................................................................................................................1106 Retourner des valeurs complexes...........................................................................................................1107 Utiliser la liste des ressources................................................................................................................1108 Utiliser la table des ressources persistantes. ..........................................................................................1108 Ajouter des directives de configuration à l’exécution............................................................................1109 Appeler des fonctions utilisateurs ...................................................................................................................1110 HashTable *function_table ....................................................................................................................1110 pval *object............................................................................................................................................1110 pval *function_name..............................................................................................................................1110 pval *retval.............................................................................................................................................1110 int param_count .....................................................................................................................................1110 xliii pval *params[] .......................................................................................................................................1110 Rapport d’erreurs.............................................................................................................................................1110 E_NOTICE ............................................................................................................................................1111 E_WARNING ........................................................................................................................................1111 E_ERROR..............................................................................................................................................1111 E_PARSE...............................................................................................................................................1111 E_CORE_ERROR .................................................................................................................................1111 E_CORE_WARNING ...........................................................................................................................1111 E_COMPILE_ERROR ..........................................................................................................................1111 E_COMPILE_WARNING ....................................................................................................................1111 E_USER_ERROR .................................................................................................................................1111 E_USER_WARNING............................................................................................................................1111 E_USER_NOTICE ................................................................................................................................1112 D. Débuggeur PHP....................................................................................................................................................1113 A propos du débuggeur ...................................................................................................................................1114 Utiliser le débuggeur PHP...............................................................................................................................1114 Protocole du débuggeur...................................................................................................................................1114 E. Mot réservés en PHP ............................................................................................................................................1116 F. Types des ressources PHP ....................................................................................................................................1119 G. Liste d’alias ..........................................................................................................................................................1143 xliv Préface PHP, est un acronyme récursif, qui signifie "PHP: Hypertext Preprocessor" : c’es un langage de script HTML, exécuté coté serveur. L’essentiel de sa syntaxe est emprunté aux langages C, Java et Perl, avec des améliorations spécifiques. L’objet de ce langage est de permettre aux développeurs web d’écrire des pages dynamiques rapidement. Notez qu’aujourd’hui, les capacités de PHP vont bien au-dela de la génération de pages personnelles : PHP génère des pages PDF, des images ou même des animations Flash à la volée. PHP-GTK (http://gtk.php.net/) permet à PHP de faire des scripts utilisant des interfaces X. A propos de ce manuel Ce manuel est écrit en XML avec DocBook XML DTD (http://www.nwalsh.com/docbook/xml/), en utilisant DSSSL (http://www.jclark.com/dsssl/) (Document Style and Semantics Specification Language) pour l’affichage. Les outils utilisés pour les formats HTML et TeX sont Jade (http://www.jclark.com/jade/), écrit par James Clark (http://www.jclark.com/bio.htm) et The Modular DocBook Stylesheets (http://nwalsh.com/docbook/dsssl/) écrit par Norman Walsh (http://nwalsh.com/). Nous utilisons aussi Microsoft HTML Help Workshop (http://msdn.microsoft.com/library/en-us/htmlhelp/html/vsconhh1start.asp) pour générer le format HTML. Vous pouvez télécharger le manuel courant dans divers langages et formats, y compris en texte seul, HTML, PDF, PalmPilot DOC, PalmPilot iSilo et WinHelp, depuis http://www.php.net/docs.php. Les manuels sont mis à jour quotidiennement. La version française est traduite quotidiennement et disponible chez Nexen (nexen.net/ (http://www.nexen.net/)). Ce manuel a été généré à partir de la documentation originale en anglais du PHP Documentation Group, au format XML, grâce à une version adaptée de texi (http://www.texinfo.com/). Vous pouvez avoir d’autres informations sur le téléchargement des sources XML de cette documentation à http://cvs.php.net/. La documentation est stockée dans le module phpdoc. i Partie I. Comment Commencer Chapitre 1. Introduction 1 Chapitre 1. Introduction Qu’est ce que PHP? PHP (officiellement "PHP: Hypertext Preprocessor") est un langage de script HTML, qui fonctionne coté serveur. Réponse simple et claire, mais qu’est ce que cela veut dire? Un exemple : Exemple 1-1. Exemple d’introduction <html> <head> <title>Exemple</title> </head> <body> <?php echo "Bonjour, je suis un script PHP!"; ?> </body> </html> Il est à noter la différence avec les autres scripts CGI écrit dans d’autres langages tels que le Perl ou le C : Au lieu d’écrire un programme avec de nombreuses lignes de commandes afin d’afficher une page HTML, vous écrivez une page HTML avec du code inclus à l’intérieur afin de réaliser une action précise (dans ce cas là, afficher du texte). Le code PHP est inclus entre une balise de début et une balise de fin qui permettent au navigateur de passer en "mode PHP". Ce qui distingue le PHP des langages de script comme le Javascript est que le code est exécuté sur le serveur. Si vous avez un script similaire sur votre serveur, le client ne reçoit que le résultat du script, sans aucun moyen d’avoir accès au code qui a produit ce résultat. Vous pouvez configurer votre serveur web afin qu’il analyse tous vos fichiers HTML comme des fichiers PHP. Ainsi, il n’y a aucun moyen de distinguer les pages qui sont produites dynamiquement des pages statiques. Que peut faire PHP? Le langage PHP possède les même fonctionnalités que les autres langages permettant d’écrire des scripts CGI, comme collecter des données, générer dynamiquement des pages web ou bien envoyer et recevoir des cookies. La plus grande qualité et le plus important avantage du langage PHP est le support d’un grand nombre de bases de données. Réaliser une page web dynamique interfacant une base de donnés est extrêmement simple. Les bases de données suivantes sont supportées par PHP: Adabas D InterBase PostgreSQL dBase FrontBase Sesam Empress mSQL Solid FilePro (lecutre seule) Direct MS-SQL Sybase Hyperwave MySQL Velocis IBM DB2 ODBC Unix dbm Informix Oracle (OCI7 et OCI8) Ingres Ovrimos Le langage PHP inclus le support des services utilisant les protocoles tels que IMAP, SNMP, NNTP, POP3 ou encore HTTP. Vous pouvez également ouvrir des connections et interagir en utilisant d’autres protocoles. La génèse du PHP Le langage PHP a été conçu durant l’automne 1994 par Rasmus Lerdorf. Les premières versions (qui restèrent privées) étaient utilisées afin de savoir qui venait consulter son CV en ligne. La première version publique fut disponible au début de l’année 1995. Elle fut connue sous le nom de "Personal Sommaire Page Tools". Elle était composée d’un analyseur extrêmement simple qui ne reconnaissait que quelques macros spéciales et d’un petit nombre d’utilitaires couramment utilisés dans les pages web. Un livre d’or, un compteur, etc... L’analyseur fut réécrit durant l’été 1995 et fut appelé PHP/FI Version 2. FI etaient les initiales d’un autre package que Rasmus avait écrit qui interprétait les formulaires HTML. C’est alors qu’il combina le "Personnal Sommaire Page tools" avec le "Form Interpreter" et il y ajouta le support de mSQL: c’est comme cela que naquît PHP/FI. PHP/FI grandit de manière spectaculaire et de nombreuses personnes commencèrent à contribuer à son amélioration. 2 Chapitre 1. Introduction Il est relativement peu aisé de donner des statistiques, mais on estime que PHP/FI est utilisé sur 15 000 sites web dans le monde entier, fin 1996. Ce chiffre atteint 50 000 durant l’été 1997. L’été 1997 voit aussi un profond changement dans le développemnt du PHP: d’un projet personnel (celui de Ramsus), on passe alors à une projet d’équipe. L’analyseur fut de nouveau réécrit par Zeev Suraski et Andi Gutmans et ce nouvel analyseur forma la base de la version 3 du PHP. Une grande partie du code de PHP/FI fut complètement réécrit alors que l’autre partie fut portée pour donner le PHP Version 3. La dernière version de PHP (PHP 4) utilise le moteur d’analyse Zend (http://www.zend.com/) pour atteindre de nouveaux niveaux de performance, et supporter un nombre encore plus grand de librairies et extensions. Il tourne de manière native sur tous les serveurs web les plus répandus. Aujourd’hui (Janvier 2001) PHP 3 ou PHP 4 sont distribués avec de nombreux produits commerciaux comme "C2’s StrongHold web server" et "RedHat Linux" et il est admis (d’après les chiffres de NetCraft (http://www.netcraft.com/), et leurs statistiques Netcraft Web Server Survey (http://www.netcraft.com/survey/)) que le PHP est utilisé sur 5 100 000 sites web dans le monde entier. Pour comparaison, ce chiffre est légèrement supérieur au nombre de serveurs tournant sous Microsoft Information server (IIS) : 5.03 millions. Enfin, à l’heure oú ce document est rédigé, la nouvelle génération du PHP est en cours de création. Elle utilisera les qualités de Zend (http://www.zend.com/) pour améliorer les performances et améliorera le support des serveurs web autres que Apache. 3 Chapitre 2. Installation 4 Chapitre 2. Installation Télécharger la dernière version Les codes source et les exécutables compilés de certains OS (y compris Windows), sont disponibles à http://www.php.net/. Nous recommandons l’utilisation du miroir (http://www.php.net/mirrors.php) le plus proche pour accélérer les chargements. Installation sous UNIX Cette section va vous guider lors du processus d’installation et de configuration de PHP sous Unix. Commencez par étudier les sections spécifiques à votre plate-forme ou à votre serveur web avant de passer à l’installation. Pré-requis : • Connaissance de base d’UNIX (savoir faire un "make" et compiler en C, si besoin). • Un compilateur ANSI C (pour les codes sources) • flex (pour les codes sources) • bison (pour les codes sources) • Un serveur web • Tous les composants nécessaires aux extensions (librairie GD, PDF, etc...) Il y a plusieurs façons d’installer PHP sur une plate-forme UNIX : soit un processus de compilation-configuration, ou bien avec des packages déjà tout prêts. Cette documentation se concentre sur la première solution. La première partie du processus est faite en ligne de commande, grâce aux options du script configure. Cette section présente l’utilisation des options les plus courantes, mais il y en a beaucoup d’autres à essayer. Reportez-vous à la liste complète des options de configuration pour une liste exhaustive. Voici les différentes méthodes d’installation de PHP : • Comme module Apache • Comme module fhttpd • Pour l’utiliser avec AOLServer, NSAPI, phttpd, Pi3Web, Roxen, thttpd, ou Zeus. • Comme exécutable CGI Référence Module Apache PHP peut être compilé de nombreuses manières différentes, mais la plus populaire est le module Apache. La liste suivante est un récapitulatif de l’installation. Exemple 2-1. Instructions d’installation PHP 4 (Version Module Apache) 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. gunzip apache_1.3.x.tar.gz tar xvf apache_1.3.x.tar gunzip php-x.x.x.tar.gz tar xvf php-x.x.x.tar cd apache_1.3.x ./configure --prefix=/www cd ../php-x.x.x ./configure --with-mysql --with-apache=../apache_1.3.x --enable-track-vars make make install cd ../apache_1.3.x ./configure --activate-module=src/modules/php4/libphp4.a make make install cd ../php-x.x.x cp php.ini-dist /usr/local/lib/php.ini "Editez votre fichier httpd.conf ou srm.conf et ajoutez : " 5 Chapitre 2. Installation AddType application/x-httpd-php .php 18. "Utilisez votre procédure habituelle pour redémarrer le serveur Apache. (vous devez arrêter puis redémarrer le serveur, et pas seulement forcer le serveur à relire la configuration initiale). Compilation Lorsque PHP est configuré, vous êtes prêts à compiler l’exécutable CGI. La commande make doit prendre tout en charge. Si ce n’est pas le cas et que vous restez bloqué, reportez-vous aux problèmes courants. Installation sous Linux Cette section contient les notes et conseils d’installation de PHP sur les distributions Linux. Utilisation des packages De nombreuses distributions Linux disposent d’un système d’installation par package, comme le fameux RPM. Ils vous permettent de faire des installations standard, mais si vous avez des configurations spécifiques (comme par exemple un serveur sécurisé, ou un pilote de base de données exotique), vous aurez probablement à compiler vous-même votre PHP et votre serveur web. Si vous n’êtes pas familier avec la compilation de vos propres logiciels, il vaut mieux rechercher le package qui pourra répondre à vos besoins. Installation sous HP-UX Cette section contient les notes et conseils d’installation de PHP sur les distributions HP-UX. Exemple 2-2. Instructions d’installation pour HP-UX 10 From: [email protected] 04-Jan-2001 09:49 (Ces conseils sont destinés à PHP 4.0.4 et Apache v1.3.9) Vous voulez installer PHP et Apache sur une HP-UX 10.20? 1. Vous aurez besoin de gzip. Téléchargez la distribution compilée à http://hpux.connect.org.uk/ftp/hpux/Gnu/gzip-1.2.4a/gzip-1.2.4a-sd-10.20.depot.Z, puis décompressez la, et utilisez swinstall pour installer. 2. Vous aurez besoin de gcc. Téléchargez une distribution compilée à http://gatekeep.cs.utah.edu/ftp/hpux/Gnu/gcc-2.95.2/gcc-2.95.2-sd-10.20.depot.gz, puis décompressez la, et utilisez swinstall pour installer. 3. Vous aurez besoin de GNU binutils. Téléchargez une distribution compilée à http://hpux.connect.org.uk/ftp/hpux/Gnu/binutils-2.9.1/binutils-2.9.1-sd-10.20.depot.gz , puis décompressez la, et utilisez swinstall pour installer. 4. Vous aurez besoin de bison. Téléchargez une distribution compilée à http://hpux.connect.org.uk/ftp/hpux/Gnu/bison-1.28/bison-1.28-sd-10.20.depot.gz , puis décompressez la, et utilisez swinstall pour installer. 5. Vous aurez besoin de flex. Téléchargez une distribution source sur l’un des miroirs http://www.gnu.org. Il se trouve dans le dossier non-gnu du site FTP. Téléchargez le fichier, décompressez leur, puis utilisez tar -xvf avec. Allez dans le nouveau dossier flex ainsi créé, et exécutez la commande "./configure", puis faites un "make", puis un "make install". Si vous avez des erreurs à cette étape, c’est probablement par ce que gcc et les autres ne sont pas inscrites dans votre PATH. Ajoutez les. Maintenant, la partie délicate. 6. Téléchargez les sources d’Apache et de PHP. 7. Décompressez les avec gunzip puis faites "tar -xvf" avec les deux archives. Nous devons modifier quelques fichiers avant de les compiler. 8. Premièrement, le fichier de configuration doit être modifié car il semble oublier qu’il est sur une machine HP-UX. Il y a des méthodes plus rusées, mais le plus simple et le plus efficace est d’ajouter 6 Chapitre 2. Installation "lt_target=hpux10.20" à la ligne 47286 du script de configuration. 9. Le fichier d’Apache GuessOS doit être modifié. Sous apache_1.3.9/src/helpers, modifier la ligne 89, en remplaçant "echo "hp${HPUXMACH}-hpux${HPUXVER}"; exit 0" par : "echo "hp${HPUXMACH}-hp-hpux${HPUXVER}"; exit 0" 10. Il n’est pas possible d’installer PHP sous forme de shared object sous HP-UX, ce qui fait que vous devez le compiler en statique. Suivez simplement les instructions de la section Apache. 11. PHP et Apache sont maintenant compilés correctement, mais Apache ne démarre pas. Vous devez créer un nouvel utilisateur Apache, par exemple www, ou apache. Puis, modifiez les lignes 252 et 253 de conf/httpd.conf pour remplacer User nobody Group nogroup par vos valeurs, par exemple : User www Group sys Il n’est pas possible d’éxécuter Apache avec l’utilisateur nobody sous HP-UX. A partir de ce moment là, PHP et Apache doivent fonctionner. J’espère que cela aidera quelqu’un. Paul Mckay. Installation sous Solaris Cette section contient les notes et conseils d’installation de PHP sur les distributions Solaris. Logiciels nécessaires L’installation Solaris oublie généralement les compilateurs C, et leurs utilitaires. Voici la liste des outils nécessaires : • gcc (recommandé, mais d’autres compilateurs C peuvent fonctionner) • make • flex • bison • m4 • autoconf • automake • perl • gzip • tar De plus, vous devrez aussi installer (et peut être aussi compiler) toutes les librairies nécessaires aux extensions (MySQL, ORACLE..). Utilisation des packages Vous pouvez simplifier l’installation Solaris en utilisant pkgadd pour installer la plupart des composants. Installations Unix/OpenBSD Cette section contient les notes spécifiques à l’installation de PHP sous OpenBSD (http://www.openbsd.org/). 7 Chapitre 2. Installation Utilisation des ports Ceci est la méthode recommandée d’installation de PHP sous OpenBSD, car elle prend en compte les dernières modifications et mises à jour de sécurité. Pour utiliser cette méthode, assurez vous que vous avez bien ports tree (http://www.openbsd.org/ports.html) récent. Choisissez alors simplement la version que vous souhaitez installer, et utilisez la commande make install. Ci-dessous, voici un exemple. Exemple 2-3. Exemple d’installation de PHP sous OpenBSD avec Ports $ cd /usr/ports/www/php4 $ make show VARNAME=FLAVORS (choisissez les versions que vous souhaitez sur votre liste). $ env FLAVOR="imap gettext ldap mysql gd" make install $ /usr/local/sbin/php4-enable Utilisation des Packages Il existe des packages pré-compilés disponibles en téléchargement à OpenBSD (http://www.openbsd.org/). Ils s’intègrent automatiquement avec la version d’Apache installée sur votre OS. Cependant, comme il y a un grand nombre d’options (appelées flavors) disponibles, vous trouverez peut-être plus facile de le compiler à partir de l’arbre de ports. Lisez le manuel packages(7) (http://www.openbsd.org/cgi-bin/man.cgi?query=packages) pour plus de détails sur les packages disponibles (en anglais). Installation sous Mac OS X Cette section contient les notes et conseils d’installation de PHP sur les distributions Mac OS X. Utilisation des packages Il existe quelques versions pré-packagée et pré-compilées de PHP pour Mac OS X. Ils permettent de réaliser rapidement des installations standard, mais si vous avez des configurations personnelles, (comme un serveur sécurisé SSL ou un pilote de base de données exotique), vous devrez compiler PHP et/ou votre serveur web vous-même. Si vous n’êtes pas familier avec la compilation de vos propres logiciels, il vaut mieux rechercher le package qui pourra répondre à vos besoins. Lightyear Design (http://homepage.mac.com/LightyearDesign/MacOSX/Packages/) propose une version pré-compilé de PHP pour OS X tout comme Tenon Intersystems (http://www.tenon.com/products/webten/). Compilation pour serveur OS X Il existe deux versions légèrement différentes de Mac OS X, client et serveur. Cette installation est faite pour le OS X Serveur. Exemple 2-4. Installation sous Mac OS X serveur 1. Téléchargez la dernière version de Apache et PHP 2. Décompressez puis désarchivez la, puis configurez Apache comme ceci : ./configure --exec-prefix=/usr \ --localstatedir=/var \ --mandir=/usr/share/man \ --libexecdir=/System/Library/Apache/Modules \ --iconsdir=/System/Library/Apache/Icons \ --includedir=/System/Library/Frameworks/Apache.framework/Versions/1.3/Headers \ --enable-shared=max \ --enable-module=most \ --target=apache 4. Vous aurez peut être besoin d’ajouter ces lignes ci, pour optimiser la compilation : setenv OPTIM=-O2 5. Puis, allez dans le dossier source de PHP 4, et configurez le : ./configure --prefix=/usr \ 8 Chapitre 2. Installation --sysconfdir=/etc \ --localstatedir=/var \ --mandir=/usr/share/man \ --with-xml \ --with-apache=/src/apache_1.3.12 Si vous avez d’autres composants (MySQL, GD, etc.), n’oubliez pas de les ajouter à ce moment la. Pour l’option --with-apache, ajoutez le chemin jusqu’au dossier source d’Apache, par exemple "/src/apache_1.3.12". 6. Exécutez un "make" 7. Exécutez un "make install" Cette commande ajoutera un dossier dans le dossier Apache : src/modules/php4. 8. Maintenant, reconfigurez Apache pour compiler PHP 4. ./configure --exec-prefix=/usr \ --localstatedir=/var \ --mandir=/usr/share/man \ --libexecdir=/System/Library/Apache/Modules \ --iconsdir=/System/Library/Apache/Icons \ --includedir=/System/Library/Frameworks/Apache.framework/Versions/1.3/Headers \ --enable-shared=max \ --enable-module=most \ --target=apache \ --activate-module=src/modules/php4/libphp4.a Vous pouvez rencontrer un message qui vous dira que libmodphp4.a est obsolète. Si c’est le cas, allez dans le dossier src/modules/php4 de votre dossier Apache et exécutez la commande suivante : ranlib libmodphp4.a Puis, revenez à la racine de la distribution Apache, et recommencez la configuration. Cela aura mis à jour la table de liens. 9. Exécutez un "make" 10. Exécutez un "make install" 11. Copiez et renommez le fichier php.ini-dist de votre distribution PHP 4 dans votre dossier "bin": cp php.ini-dist /usr/local/bin/php.ini ou (si vous n’avez pas de dossier local) cp php.ini-dist /usr/bin/php.ini D’autres exemples pour Mac OS X client (http://www.stepwise.com/Articles/Workbench/Apache-1.3.14-MacOSX.html) et Mac OS X server (http://www.stepwise.com/Articles/Workbench/Apache-1.3.14-MacOSX.html) sont disponibles à Stepwise (http://www.stepwise.com/). Compilation pour MacOS X client Ces conseils sont gracieusement fourni par Marc Liyanage (http://www.entropy.ch/software/macosx). Le module PHP pour Apache est inclus dans Mac OS X. Cette version inclus le support des bases de données MySQL et PostgreSQL. NOTE: Soyez prudent avec cette manipulation, vous risquez de mettre votre serveur Apache à terre! Insctructions : • 1. Ouvrez un terminal • 2. Tapez "wget http://www.diax.ch/users/liyanage/software/macosx/libphp4.so.gz", attendez la fin du téléchargement. • 3. Tapez "gunzip libphp4.so.gz" • 4. Tapez "sudo apxs -i -a -n php4 libphp4.so" Maintenant, tapez "sudo open -a TextEdit /etc/httpd/httpd.conf" TextEdit ouvrira le fichier de configuration. Recherchez ces deux lignes, vers la fin du fichier (Utilisez la commande Find) * * #AddType application/x-httpd-php .php #AddType application/x-httpd-php-source .phps 9 Chapitre 2. Installation Supprimez les deux marques de commentaires (#), puis sauvez le fichier, et quittez TextEdit. Finalement, tapez "sudo apachectl graceful" pour redémarrer le serveur Apache. PHP devrait fonctionner. Vous pouvez le tester en placant un script dans le dossier "Sites". Par exemple, le fichier "test.php", qui contient la simple ligne : "<?php phpinfo() ?>". Ouvrez l’URL 127.0.0.1/~your_username/test.php dans votre navigateur. Vous obtiendrez le tableau de bord de PHP. Liste complète des options de configuration Cette section rassemble la liste complète des options de configuration supportées par PHP 3 et PHP 4, à utiliser avec le fichier configure, lors de la configuration sous Unix. Certaines options sont disponibles sous PHP 3, d’autres sous PHP 4 et certains sous PHP 3 et PHP 4, comme inidiqué. Il y a de nombreuses options dont le nom a changé entre PHP 3 et PHP 4. Ces options ont des liens entre elles : si vous vous souvenez d’un nom d’option en PHP 3, regardez si le nom a changé. • Base de données • E-commerce • Images • Divers • Réseau • Comportement PHP • Serveur • Texte et langue • XML Base de données --with-adabas[=DIR] PHP 3, PHP 4: Inclut le support Adabas D. DIR est le dossier d’installation de Adabas (par défaut, /usr/local). Adabas home page (http://www.adabas.com/) --enable-dba=shared PHP 3: Option non disponible en PHP 3 PHP 4: Compile DBA comme module partagé --enable-dbx PHP 3: Option non disponible en PHP 3 PHP 4: Inclut le support DBX. --enable-dbase PHP 3: Option non disponible; utilisez plutôt --with-dbase instead. PHP 4: Active la librairie dbase livrée avec PHP. Aucune librairie supplémentaire n’est nécessaire. 10 Chapitre 2. Installation --with-dbase PHP 3: Active la librairie dbase livrée avec PHP. Aucune librairie supplémentaire n’est nécessaire. PHP 4: Option non disponible; utilisez plutôt --enable-dbase instead. --with-db2[=DIR] PHP 3, PHP 4: Active le support Berkeley DB2. --with-db3[=DIR] PHP 3: Option non disponible en PHP 3 PHP 4: Active le support Berkeley DB3. --with-dbm[=DIR] PHP 3, PHP 4: Active le support DBM. --with-dbmaker[=DIR] PHP 3: Option non disponible en PHP 3. PHP 4: Inclut le support DBMaker. DIR est le dossier d’installation DBMaker (par défaut, c’est le dossier de la dernière installation DBMaker, comme /home/dbmaker/3.6). --with-empress[=DIR] PHP 3, PHP 4: Inclut le support Empress. DIR est le dossier d’installation Empress (par défaut, $EMPRESSPATH). --enable-filepro PHP 3: Option non disponible; utilisez plutôt --with-filepro instead. PHP 4: Active la librairie filePro (lecture seule) livrée avec PHP. Aucune librairie supplémentaire n’est nécessaire. --with-fbsql[=DIR] PHP 3: Option non disponible. PHP 4: Inclut le support de FrontBase SQL. DIR est le chemin jusqu’à l’installation de FrontBase base. Par défaut, c’est le dossier standard d’installation Frontbase. L’installation dépend de votre OS : Solaris: /opt/FrontBase, WinNT: \usr\FrontBase, Linux: /usr/frontbase, Mac OSX: /Library/FrontBase. --with-filepro PHP 3: Inclut le support IBM DB2. Aucune librairie supplémentaire n’est nécessaire. PHP 4: Option non disponible; utilisez plutôt --enable-filepro. --with-gdbm[=DIR] PHP 3, PHP 4: Active le support GDBM. --with-hyperwave PHP 3, PHP 4: Active le support Hyperwave. --with-ibm-db2[=DIR] PHP 3, PHP 4: Inclut le support IBM DB2. DIR est le dossier d’installation de DB2 (par défaut, /home/db2inst1/sqllib). IBM DB2 (http://www.ibm.com/db2/) 11 Chapitre 2. Installation --with-informix[=DIR] PHP 3, PHP 4: Inclut le support Informix. DIR est le dossier d’installation d’Informix (par défaut, aucune valeur). --with-ingres[=DIR] PHP 3: Option non disponible en PHP 3 PHP 4: Inclut le support Ingres II. DIR est le dossier d’installation d’Ingres (par défaut, /II/ingres). --with-interbase[=DIR] PHP 3, PHP 4: Inclut le support InterBase. DIR est le dossier d’installation d’InterBase (par défaut, /usr/interbase). Fonctions Interbase Interbase (http://www.interbase.com/) --with-ldap[=DIR] PHP 3: Inclut le support LDAP. DIR est le dossier d’installation de LDAP (par défaut /usr et /usr/local). PHP 4: Inclut le support LDAP. DIR est le dossier d’installation de LDAP. (par défaut; /usr/local/ldap). Plus de détails sur LDAP sont disponibles à RFC1777 (http://www.faqs.org/rfcs/rfc1777.html) et RFC1778 (http://www.faqs.org/rfcs/rfc1778.html). --with-msql[=DIR] PHP 3, PHP 4: Active le support mSQL. DIR est le dossier d’installation de mSQL (par défaut /usr et /usr/local/Hughes, pour la version 2.0). configure détecte automatiquement la version de mSQL qui fonctionne. PHP supporte les versions 1.0 et 2.0, mais si vous compilez PHP avec mSQL 1.0, vous ne pourrez accéder qu’à des bases mSQL 1.0, et vice-versa. Voir aussi Configuration mSQL dans le fichier de configuration. mSQL (http://www.hughes.com.au/) --with-mysql[=DIR] PHP 3: Inclut le support MySQL. DIR est le dossier d’installation de MySQL (par défaut, il cherche dans différents dossiers où MySQL a coutume d’être installé). PHP 4: Inclut le support MySQL. DIR est le dossier de l’installation MySQL. S’il est omis, la librairie MySQL livrée en standard avec PHP sera utilisée par défaut. Voir aussi Configuration MySQL dans le fichier de configuration. MySQL (http://www.mysql.com/) --with-ndbm[=DIR] PHP 3, PHP 4: Active le support NDBM. --with-ovrimos PHP 3, PHP 4: Inclut le support Ovrimos. --with-oci8[=DIR] PHP 3: Option non disponible en PHP 3 PHP 4: Inclut le support Oracle-oci8. DIR est le dossier d’installation de Oracle-oci8 (par défaut, ORACLE_HOME). 12 Chapitre 2. Installation --with-oracle[=DIR] PHP 3: Inclut le support Oracle database. DIR est le dossier d’installation de Oracle (par défaut, $ORACLE_HOME). PHP 4: Inclut le support Oracle-oci7. DIR est le dossier d’installation de Oracle-oci7 (par défaut, ORACLE_HOME). Inclut le support Oracle. Ce support a été testé et permet de travailler avec les versions d’Oracle de 7.0 à 7.3. Le paramètre est le dossier ORACLE_HOME. Vous n’avez pas à spécifier ce paramètre si votre environnement Oracle a été configuré. Oracle (http://www.oracle.com/) --with-pgsql[=DIR] PHP 3: Inclut le support PostgresSQL. DIR est le dossier d’installation de PostgresSQL (par défaut, /usr/local/pgsql). PHP 4: Inclut le support PostgreSQL. DIR est le dossier d’installation de PostgreSQL (par défaut, /usr/local/pgsql). Pour compiler en "dl", utilisez la valeur "shared", ou "shared,DIR", pour compiler en "dl", mais spécifier DIR malgré tout. Voir aussi Postgres dans le fichier de configuration. PostgreSQL (http://www.postgresql.org/) --with-solid[=DIR] PHP 3, PHP 4: Inclut le support Solid. DIR est le dossier d’installation de Solid (par défaut, /usr/local/solid). Solid (http://www.solidtech.com/) --with-sybase-ct[=DIR] PHP 3, PHP 4: Inclut le support Sybase-CT. DIR est le dossier d’installation de Sybase (par défaut, /home/sybase). Voir aussi Sybase-CT dans le fichier de configuration. --with-sybase[=DIR] PHP 3, PHP 4: Inclut le support Sybase-DB. DIR est le dossier d’installation de Sybase (par défaut, /home/sybase). Voir aussi Sybase dans le fichier de configuration. Sybase (http://www.sybase.com/) --with-openlink[=DIR] PHP 3, PHP 4: Inclut le support OpenLink ODBC. DIR est le dossier d’installation d’OpenLink (par défaut /usr/local/openlink). A partir de PHP 4.0.6, cette option n’est plus valable. Utilisez plutôt --with-iodbc si vous voulez utiliser l’ODBC de OpenLink Software. OpenLink Software (http://www.openlinksw.com/) --with-iodbc[=DIR] PHP 3, PHP 4: Inclut le support iODBC. DIR est le dossier d’installation d’iODBC (par défaut, /usr/local). Cette fonctionnalité a d’abord été développée avec le gestionnaire iODBC Driver Manager, un pilote ODBC librement distribuable, qui fonctionne sous divers UNIX. FreeODBC (http://users.ids.net/~bjepson/freeODBC/) ou iODBC (http://www.iodbc.org/) 13 Chapitre 2. Installation --with-custom-odbc[=DIR] PHP 3, PHP 4: Inclut le support ODBC, avec une librairie tierce. Le paramètre DIR est le nom du dossier d’installation de cette librairie. Par défaut, il vaut /usr/local. Cette option implique qus vous avez défini CUSTOM_ODBC_LIBS lorsque vous éxécutez le script de configuration. Vous devez aussi avoir une en-tête odbc.h valide dans vos dossiers d’Inclution. Si vous n’en avez pas, créez le, et ajoutez-y vos en-têtes spécifiques. Votre en-tête peut aussi réclamer d’autres définitions, surtout si elle est multi-plate-forme. Définissez les dans CFLAGS. Par exemple, vous pouvez utilisez Sybase SQL Anywhere sous QNX comme ceci : CFLAGS=-DODBC_QNX LDFLAGS=-lunix CUSTOM_ODBC_LIBS="-ldblib -lodbc" ./configure --with-custom-odbc=/usr/lib/sqlany50 --disable-unified-odbc PHP 3: Inactive le support unified ODBC. Uniquement valable si iODBC, Adabas, Solid, Velocis ou une interface spéciale ODBC a été activée. PHP 4: Option non disponible en PHP 4 Le module Unified ODBC est commun à toutes les bases de données ODBC, comme par exemple Solid, IBM DB2 et Adabas D. Il fonctionne aussi avec les librairies ODBC normales. Des tests ont été menés avec iODBC, Solid, Adabas D, IBM DB2 et Sybase SQL Anywhere. Il requiert une (et une seule) de ces extensions, ou l’extension Velocis, ou une librairie ODBC spéciale. Cette option n’est possible qu’avec l’utilisation de l’une des options suivantes : --with-iodbc, --with-solid, --with-ibm-db2, --with-adabas, --with-velocis, ou --with-custom-odbc. Voir aussi Unified ODBC dans le fichier de configuration. --with-unixODBC[=DIR] PHP 3: Option non disponible en PHP 3 PHP 4: Inclut le support unixODBC. DIR est le dossier d’installation d’unixODBC (par défaut, /usr/local). --with-velocis[=DIR] PHP 3, PHP 4: Inclus le support Velocis. DIR est le dossier d’installation de Velocis (par défaut, /usr/local/velocis). Velocis (http://www.raima.com/) E-commerce --with-ccvs[=DIR] PHP 3: Option non disponible en PHP 3 PHP 4: Ajoute le support CCVS. DIR est le dossier d’installation de CCVS. --with-cybermut[=DIR] PHP 3: Option non disponible en PHP 3 PHP 4: Inclut le support de Cybermut pour PHP 4. DIR est le dossier du SDK Cybermut, qui contient les deux fichiers libcm-mac.a et cm-mac.h. --with-mck[=DIR] PHP 3: Inclut le support Cybercash MCK. DIR est le dossier d’installation de cybercash mck (par défaut, /usr/src/mck-3.2.0.3-linux). Plus d’aide dans le dossier extra/cyberlib. PHP 4: Option non disponible; utilisez plutôt --with-cybercash instead. 14 Chapitre 2. Installation --with-cybercash[=DIR] PHP 3: Option non disponible; utilisez plutôt --with-mck instead. PHP 4: Inclut le support CyberCash. DIR est le dossier d’installation de CyberCash MCK. --with-pfpro[=DIR] PHP 3: Option non disponible en PHP 3 PHP 4: Active le support Verisign Payflow Pro. Images --enable-freetype-4bit-antialias-hack PHP 3: Option non disponible en PHP 3 PHP 4: Inclut le support de FreeType2 (expérimental). --with-gd[=DIR] PHP 3: Inclut le support GD. DIR est le dossier d’installation de GD. PHP 4: Inclut le support GD. DIR est le dossier d’installation de GD. Pour compiler en "dl", utilisez la valeur "shared", ou "shared,DIR", pour compiler en "dl", mais spécifier DIR malgré tout. --without-gd PHP 3, PHP 4: Inactive le support GD . --with-imagick[=DIR] PHP 3: Inclut le support ImageMagick. DIR est le dossier d’installation de ImageMagick. S’il est omis, PHP essaiera de le trouver de lui-même (expérimental). PHP 4: Option non disponible en PHP 4 --with-jpeg-dir[=DIR] PHP 3: dossier JPEG pour pdflib 2.0 PHP 4: dossier JPEG pour pdflib 3.x et 4.x --with-png-dir[=DIR] PHP 3: Option non disponible en PHP 3 PHP 4: dossier PNG pour pdflib 3.x et 4.x --enable-t1lib PHP 3: Active le support t1lib. PHP 4: Option non disponible; utilisez plutôt --with-t1lib 15 Chapitre 2. Installation --with-t1lib[=DIR] PHP 3: Option non disponible; utilisez plutôt --enable-t1lib. PHP 4: Inclut le support T1lib. --with-tiff-dir[=DIR] PHP 3: dossier TIFF pour pdflib 2.0 PHP 4: dossier TIFF pour pdflib 3.x et 4.x --with-ttf[=DIR] PHP 3, PHP 4: Active le support FreeType. --with-xpm-dir[=DIR] PHP 3: Option non disponible en PHP 3 PHP 4: dossier XPM pour GD-1.8+ Divers Ces options seront classées ultérieurement, lorsqu’une catégorie adéquate apparaîtra. --disable-bcmath PHP 3: Inactive la librairie BCmath. PHP 4: Option non disponible en PHP 4. La librairie BCmath n’est pas compilée par défaut. Utilisez --enable-bcmath pour l’inclure. --with-gmp PHP 3, PHP 4 : Inclut le support GMP. --disable-display-source PHP 3: Compile sans afficher le support des sources PHP 4: Option non disponible en PHP 4 --disable-libtool-lock PHP 3: Option non disponible en PHP 3 PHP 4: Empêche le verrouillage (risque d’empêcher certaines compilations paralléles). --disable-pear PHP 3: Option non disponible en PHP 3 PHP 4: N’installe pas PEAR --disable-pic PHP 3: Option non disponible en PHP 3 PHP 4: Inactive PIC pour les shared objects 16 Chapitre 2. Installation --disable-posix PHP 3: Option non disponible en PHP 3; Utilisez plutôt --without-posix PHP 4: Inactive les fonctions POSIX. --disable-rpath PHP 3: Option non disponible en PHP 3 PHP 4: Inactive le passage de chemins supplémentaires pour la recherche de librairie lors de l’exécution. --disable-session PHP 3: Option non disponible en PHP 3 PHP 4: Inactive le support session. --enable-bcmath PHP 3: Option non disponible en PHP 3; bcmath est compilée par défaut. Utilisez plutôt --disable-bcmath, pour l’inactiver. PHP 4: Active le support de l’extension bc maths. Voir aussi les fonctions BCMath. --enable-c9x-inline PHP 3: Option non disponible en PHP 3 PHP 4: Active les sémantiques C9x-inline --enable-calendar PHP 3: Option non disponible en PHP 3 PHP 4: Active le support des conversions calendaires --enable-debug PHP 3, PHP 4: Compile sans les symboles de débuggages --enable-debugger PHP 3: Compile avec les fonctions de débuggage à distance PHP 4: Option non disponible en PHP 4 --enable-discard-path PHP 3, PHP 4: Si cette option est activée, le CGI PHP peut être placé hors de l’arborescence web, pour que personne ne puisse l’atteindre, même en contournant les .htaccess. --enable-dmalloc PHP 3, PHP 4: Active dmalloc --enable-exif PHP 3: Option non disponible en PHP 3 PHP 4: Active le support exif. 17 Chapitre 2. Installation --enable-experimental-zts PHP 3: Option non disponible en PHP 3 PHP 4: Cela risque fortement de ne plus compiler du tout! --enable-fast-install[=PKGS] PHP 3: Option non disponible en PHP 3 PHP 4: Optimise pour les installations rapides for fast installation (par défaut, no). --enable-force-cgi-redirect PHP 3, PHP 4: Active la vérification interne des redirections serveurs. Il est recommandé d’utiliser cette option si vous avez compilé PHP en CGI. --enable-inline-optimization PHP 3: Option non disponible en PHP 3 PHP 4: Si vous avez beaucoup de mémoire disponible et que vous utilisez gcc, essayez donc ça. --enable-libgcc PHP 3: Option non disponible en PHP 3 PHP 4: Active explicitement les liens avec libgcc --enable-maintainer-mode PHP 3, PHP 4: Active des règles de make et de dépendances qui sont parfois absconses et ne servent pas aux utilisateurs habituels (Bref, ne l’utilisez pas). --enable-memory-limit PHP 3, PHP 4: Compile avec le support de la limitation de mémoire (par défaut, no). --enable-safe-mode PHP 3, PHP 4: Active le SAFE_MODE (par défaut, yes). --enable-satellite PHP 3: Option non disponible en PHP 3 PHP 4: Active le support CORBA via Satellite (Requiert ORBit) --enable-shared[=PKGS] PHP 3: Option non disponible en PHP 3 PHP 4: Compile les librairies partagées (par défaut, yes). --enable-sigchild PHP 3, PHP 4: Active le gestionnaire SIGCHLD propre à PHP. --enable-static[=PKGS] PHP 3: Option non disponible en PHP 3 PHP 4: Compile les librairies en statique (par défaut, yes). --enable-sysvsem PHP 3, PHP 4: Active le support des sémaphores System V. 18 Chapitre 2. Installation --enable-sysvshm PHP 3, PHP 4: Active le support de partage de mémoire System V. --enable-trans-sid PHP 3: Option non disponible en PHP 3 PHP 4: Active la propagation transparente des identifiants de session. --with-cdb[=DIR] PHP 3, PHP 4: Active le support CDB. --with-config-file-path=PATH PHP 3: Indique le chemin dans lequel aller lire le fichier php3.ini. Par défaut, c’est /usr/local/lib. PHP 4: Indique le chemin dans lequel allet lire le fichier php.ini. Par défaut, c’est /usr/local/lib. --with-cpdflib[=DIR] PHP 3: Inclut le support ClibPDF. DIR est le dossier d’installation de ClibPDF (par défaut, /usr/local). PHP 4: Inclut le support ClibPDF.(requires cpdflib >= 2). DIR est le dossier d’installation de cpdfllib (par défaut, /usr). --with-esoob[=DIR] PHP 3: Option non disponible en PHP 3 PHP 4: Inclut le support Easysoft OOB. DIR est le dossier d’installation de OOB (par défaut, /usr/local/easysoft/oob/client). --with-exec-dir[=DIR] PHP 3, PHP 4: N’autorise que les exécutables placés dans le dossier DIR, lorsque le SAFE MODE est activé (par défaut, c’est /usr/local/php/bin). --with-fdftk[=DIR] PHP 3, PHP 4: Inclut le support fdftk. DIR est le dossier d’installation de fdftk (par défaut, /usr/local). --with-gnu-ld PHP 3: Option non disponible en PHP 3 PHP 4: Suppose que le compilateur C utilise GNU ld (par défaut, no). --with-icap[=DIR] PHP 3: Option non disponible en PHP 3 PHP 4: Inclut le support ICAP. --with-imap[=DIR] PHP 3, PHP 4: Inclut le support IMAP. DIR est le dossier d’include d’IMAP (et aussi c-client.a). --with-imsp[=DIR] PHP 3: Inclut le support IMSP.(DIR est le dossier d’installation IMSP, là où il y a les dossiers d’include et libimsp.a). PHP 4: Option non disponible en PHP 4 19 Chapitre 2. Installation --with-java[=DIR] PHP 3: Option non disponible en PHP 3 PHP 4: Inclut le support Java. DIR est le dossier d’installation du JDK). Cette extension peut uniquement être compilée comme "dl". --with-kerberos[=DIR] PHP 3: Option non disponible en PHP 3 PHP 4: Inclut le support Kerberos dans IMAP. --with-mcal[=DIR] PHP 3, PHP 4: Inclut le support MCAL. --with-mcrypt[=DIR] PHP 3, PHP 4: Inclut le support mcrypt. DIR est le dossier d’installation de mcrypt. --with-mhash[=DIR] PHP 3, PHP 4: Inclut le support mhash. DIR est le dossier d’installation de mhash. --with-mm[=DIR] PHP 3: Option non disponible en PHP 3 PHP 4: Inclut le support mm pour le stockage de session. --with-mod_charset PHP 3, PHP 4: Active le transfert des tables depuis le module Apache mod_charset (Rus Apache). --with-pdflib[=DIR] PHP 3: Inclut le support pdflib (testé avec 0.6 et 2.0). DIR est le dossier d’installation de pdflib (par défaut, c’est /usr/local). PHP 4: Inclut le support pdflib 3.x/4.x. DIR est le dossier d’installation de pdflib. Par défaut, c’est /usr/local. PHP 4 et PDFlib 3.x/4.x requiert les librairies JPEG et TIFF. Lors de la compilation du support PDFlib utilise les options --with-jpeg-dir et --with-tiff-dir. Vous pouvez aussi utiliser --with-png-dir et --with-zlib-dir, pour compiler le support PNG et Zlib avec PDFlib. --enable-shared-pdflib PHP 3, PHP 4: Inclut pdflib comme shared librairy. --with-readline[=DIR] PHP 3: Option non disponible en PHP 3 PHP 4: Inclut le support readline. DIR est le dossier d’installation de readline. --with-regex=TYPE PHP 3: Option non disponible en PHP 3 PHP 4: Type de librairie d’expressions régulières : système, apache, php --with-servlet[=DIR] PHP 3: Option non disponible en PHP 3 PHP 4: Inclut le support servlet. DIR est le dossier d’installation de JSDK. Ce SAPI demande que l’extension Java soit compilée comme shared dl. 20 Chapitre 2. Installation --with-ming PHP 3: Option non disponible en PHP 3 PHP 4: Active le support Flash 4 avec Ming. --with-swf[=DIR] PHP 3: Option non disponible en PHP 3 PHP 4: Active le support SWF. --with-system-regex PHP 3: Inactive la librairie d’expressions régulières livrée avec PHP. PHP 4: (Obsolète) Utilise la librairie d’expressions régulières système. --with-tsrm-pth[=pth-config] PHP 3: Option non disponible en PHP 3 PHP 4: Utilise GNU Pth. --with-tsrm-pthreads PHP 3: Option non disponible en PHP 3 PHP 4: Utilise les threads POSIX (par défaut). --with-x PHP 3: Utilise X Window System PHP 4: Option non disponible en PHP 4 --with-bz2[=DIR] PHP 4: Ajoute le support bzip2. DIR est le dossier d’installation de bzip2. --with-zlib-dir[=DIR] PHP 3: Dossier zlib pour pdflib 2.0 ou active le support zlib. PHP 4: Dossier zlib pour pdflib 3.x/4.x ou active le support zlib. --with-zlib[=DIR] PHP 3, PHP 4: Inclut le support zlib. (requiert zlib >= 1.0.9). DIR est le dossier d’installation de zlib (par défaut, /usr). --with-zziplib[=DIR] PHP 4: Inclut le support ZZIPlib (requiert ZZIPlib >= 0.10.6). DIR est le dossier d’installation de ZZIPliby (par défaut, /usr/local). La dernière version de ZZIPlib est disponible à http://zziplib.sourceforge.net/. 21 Chapitre 2. Installation --without-pcre-regex PHP 3: Inactive le support des expressions régulières Perl. PHP 4: Inactive le support des expressions régulières Perl. Utilisez --with-pcre-regex=DIR pour spécifier le dossier d’installation de PCRE, si vous n’utilisez pas la librairie livrée en standard. --without-posix PHP 3: N’Inclut pas lrs fonctions POSIX. PHP 4: Option non disponible en PHP 4; utilisez plutôt --disable-posix. Réseau --with-curl[=DIR] PHP 3: Option non disponible en PHP 3 PHP 4: Active le support CURL. --enable-ftp PHP 3: Option non disponible; utilisez plutôt --with-ftp PHP 4: Active le support FTP. --with-ftp PHP 3: Inclut le support FTP. PHP 4: Option non disponible; utilisez plutôt --enable-ftp instead --disable-url-fopen-wrapper PHP 3, PHP 4: Inactive le support des URL avec fopen(). Avertissement Cette option n’est disponible que jusqu’à la version 4.0.3. Les versions plus récentes fournissent un paramètre dans le fichier php.ini appelé allow_url_fopen, afin de vous éviter de faire ce choix au moment de la compilation. --with-mod-dav=DIR PHP 3, PHP 4: Inclut le support DAV, grâce au module Apache mod_dav. DIR est le dossier d’installation de mod_dav (valable uniquement pour les serveurs Apache). --with-openssl[=DIR] PHP 3, PHP 4: Inclut le support OpenSSL avec SNMP. --with-snmp[=DIR] PHP 3, PHP 4: Inclut le support SNMP. DIR est le dossier d’installation de SNMP (par défaut, il scanne un nombre de dossiers habituels de l’installation SNMP). Utilisez la valeur de "shared" pour compiler sous forme de "dl", ou "shared,DIR" pour compiler sous forme de "dl" tout en spécifiant un dossier. --enable-ucd-snmp-hack PHP 3, PHP 4: Active le hack UCD SNMP 22 Chapitre 2. Installation --enable-sockets PHP 3: Option non disponible en PHP 3 PHP 4: Active le support des sockets. --with-yaz[=DIR] PHP 3: Option non disponible en PHP 3 PHP 4: Inclut le support YAZ.(ANSI/NISO Z39.50). DIR est le dossier d’installation de YAZ (dossier bin). --enable-yp PHP 3: Option non disponible; utilisez plutôt --with-yp PHP 4: Active le support YellowPages (YP). --with-yp PHP 3: Active le support YellowPages (YP). PHP 4: Option non disponible; utilisez plutôt --enable-yp --with-mnogosearch PHP 3, PHP 4: Inclut le support mnoGoSearch. Comportement PHP --enable-magic-quotes PHP 3, PHP 4: Active les magic quotes par défaut. --disable-short-tags PHP 3, PHP 4: Désactive la forme courte des balises PHP (<? ?>). --enable-track-vars PHP 3: Active le suivi des variables GET/POST/Cookie par défaut. PHP 4: Option non disponible en PHP 4; à partir de PHP 4.0.2, cette option est toujours activée. Serveur --with-aolserver-src=DIR PHP 3: Option non disponible en PHP 3 PHP 4: Indique le chemin jusqu’à la distribution source de AOLserver --with-aolserver=DIR PHP 3: Option non disponible en PHP 3 PHP 4: Indique le chemin jusqu’à la distribution installée de AOLserver. --with-apache[=DIR] PHP 3, PHP 4: Compile PHP en module Apache. DIR est le dossier d’installation supérieur d’Apache (par défaut, /usr/local/etc/httpd. 23 Chapitre 2. Installation --with-apxs[=FILE] PHP 3, PHP 4: Compile PHP comme module partagé d’Apache module. FILE est le chemin optionnel jusqu’à Apache apxs tool; par défaut, c’est apxs). --enable-versioning PHP 3: Tire profit du système de versionnage et de scoping fourni par Solaris 2.x et Linux PHP 4: Exporte uniquement les symboles nécessaires. Voyez l’installation pour plus de détails. --with-caudium[=DIR] PHP 3: Option non disponible en PHP 3 PHP 4: Compile PHP sous forme de module Pike pour être utilisé avec le serveur web Caudium. DIR est le dossier d’installation de Caudium (par défaut, $prefix/caudium/server. Le préfixe est paramétré par l’option --prefix (par défaut, /usr/local). --with-fhttpd[=DIR] PHP 3, PHP 4: Compile PHP comme module fhttpd. DIR est le dossier d’installation de fhttpd (par défaut, /usr/local/src/fhttpd). --with-nsapi=DIR PHP 3: Option non disponible en PHP 3 PHP 4: Indique le chemin jusqu’au serveur Netscape --with-phttpd=DIR PHP 3: Option non disponible en PHP 3 PHP 4: --with-pi3web=DIR PHP 3: Option non disponible en PHP 3 PHP 4: Compile PHP comme module pour Pi3Web. --with-roxen=DIR PHP 3: Option non disponible en PHP 3 PHP 4: Compile PHP comme module pour Pi3Web Pike. DIR est le dossier d’installation de Roxen (par défaut, /usr/local/roxen/server). --enable-roxen-zts PHP 3: Option non disponible en PHP 3 PHP 4: Compile le module Roxen en utilisant Zend Thread Safety. --with-thttpd=SRCDIR PHP 3: Option non disponible en PHP 3 PHP 4: 24 Chapitre 2. Installation --with-zeus=DIR PHP 3: Option non disponible en PHP 3 PHP 4: Compile PHP comme module ISAPI pour Zeus. Texte et langue --with-aspell[=DIR] PHP 3, PHP 4: Inclut le support ASPELL. --with-gettext[=DIR] PHP 3, PHP 4: Inclut le support GNU gettext. DIR est le dossier d’installation de gettext (par défaut, /usr/local). --with-iconv[=DIR] PHP 3: Option non disponible en PHP 3 PHP 4: Inclut le support iconv. --with-pspell[=DIR] PHP 3: Option non disponible en PHP 3 PHP 4: Inclut le support PSPELL. --with-recode[=DIR] PHP 3: Inclut le support GNU recode. PHP 4: Inclut le support recode. DIR est le dossier d’installation de recode. --enable-shmop PHP 3, PHP 4 : Inclut le support shmop. XML --with-dom[=DIR] PHP 3: Option non disponible en PHP 3 PHP 4: Active le support DOM. (requiert libxml >= 2.0). DIR est le dossier d’installation de libxml (par défaut, /usr). --enable-sablot-errors-descriptive PHP 3: Option non disponible en PHP 3 PHP 4: Active les erreurs descriptives. --with-sablot[=DIR] PHP 3: Option non disponible en PHP 3 PHP 4: Active le support Sablotron. 25 Chapitre 2. Installation --enable-wddx PHP 3: Option non disponible en PHP 3 PHP 4: Active le support WDDX. --disable-xml PHP 3: Option non disponible en PHP 3; Les fonctions XML ne sont pas construites par défaut. Utilisez plutôt --with-xml pour les activer. PHP 4: Inactive le support XML, qui utilise la librairie expat, livrée avec PHP. --with-xml PHP 3: Active le support XML. PHP 4: Option non disponible en PHP 4; Le support XML est activé par défaut. Utilisez plutôt --disable-xml pour l’inactiver. Installation sous Windows 9x/ME/NT/2000 Il y a deux méthodes principales pour installer PHP sous Windows : soit manuellement, soit avec InstallShield. Si vous avez Microsoft Visual Studio, vous pouvez aussi compiler PHP à partir des sources. Une fois que PHP est installé sur votre Windows, vous pouvez aussi ajouter diverses extensions. InstallShield sous Windows L’installeur Windows de PHP disponible depuis les pages de téléchargement (http://www.php.net/), installe la version CGI de PHP, et configure les serveurs web IIS, PWS, et Xitami. Installez votre serveur HTTP favori sur votre système et assurez-vous qu’il fonctionne. Exécutez l’installeur et suivez les instructions fournies par le wizard. Deux types d’installation sont fournis : standard, qui utilise toutes les configurations par défaut les plus pratiques, et avancée, qui pose un maximum de questions pour paramétrer le plus finement. Le wizard d’installation rassemble suffisamment d’informations pour configurer php.ini et le serveur web qui utilisera PHP. Pour IIS, mais aussi PWS sous NT Workstation, une liste de l’arboresence web est affichée, et vous pouvez sélectionner les dossiers qui utiliseront PHP. Une fois l’installation terminée, l’installeur vous informera que vous devez redémarrer. Suivez ce conseil, ou commencez à utiliser PHP immédiatement. Instructions Générales d’installation Ce guide vous permet d’installer et de configurer manuellement PHP sur vos stations Windows 9x/Me/NT/2000. La première version de ce guide a été compilée par Bob Silva (mailto:[email protected]). La version originale est disponible (en anglais) à http://www.umesd.k12.or.us/php/win32install.html. Ce guide fournit une aide d’installation pour : • Personal Web Server (Version la plus récente recommandée) • Internet Information Server 3 ou 4 • Apache 1.3.x • Omni HTTPd 2.0b1 et plus récent • Oreilly Website Pro • Xitami 26 Chapitre 2. Installation PHP 4 pour Windows est décliné en deux versions : un exécutable CGI (php.exe), et plusieurs modules SAPI (par exemple php4isapi.dll). Cette dernière forme est nouvelle pour PHP 4 et founit des performances améliorées ainsi que des fonctionnalités supplémentaires. Notez cependant que les modules SAPI ne sont pas considéré comme ayant atteint une qualité de production. La raison à cela est que les modules SAPI utilisent le système de thread sécurisé de PHP, ce qui est nouveau en PHP 4, et qui n’a pas été testé et torturé suffisamment pour être considérés comme stable. Il y a encore quelques bugs qui trainent. D’un autre côté, certains d’entre vous ont rapporté des résultats significativement meilleurs avec les modules SAPI, même si nous ne connaissons actuellement personne qui le fasse fonctionner en production. En clair, faites votre choix : soit vous avez absolument besoin de stabilité, et il vaut mieux laisser les performances SAPI de côté; soit vous avez besoin de performances, et alors c’est l’occasion de tester en production et de nous rapporter vos résultats. Si vous choisissez l’un des modules SAPI et utilisez Windows 95, pensez à télécharger la mise à jour DCOM à Microsoft DCOM pages (http://download.microsoft.com/msdownload/dcom/95/x86/en/dcom95.exe). Pour le module ISAPI, comme un serveur web compatible est nécessaire (testé avec IIS 4.0, PWS 4.0 et IIS 5.0). IIS 3.0 n’est pas supporté; vous devez télécharger et installer le Windows NT 4.0 Option Pack avec IIS 4.0 si vous voulez le support natif de PHP. Voici les différentes étapes d’installation avant les étapes spécifiques au serveur. • Extrayez la distribution dans le dossier de votre choix. "C:\PHP\" est une bonne idée. L’exécutable binaire PHP, les modules SAPI, et certaines extensions utilisent des DLL externes. Assurez vous que ces DLL sont dans votre distribution, et dans un dossier qui est cité dans le PATH Windows. Le mieux à faire est de copier les fichiers ci-dessous dans votre dossier système, qui est généralement : c:\windows\system pour Windows 95/98 c:\winnt\system32 pour Windows NT/2000 Les fichiers à copier sont : ’php4ts.dll’, s’il existe, écrasez le Les fichiers ’dlls’ de votre distribution. Si vous les avez déjà installé, ne les remplacez pas, sauf si quelquechose ne fonctionne pas • • • Copiez le fichier ’php.ini-dist’ dans votre dossier ’%WINDOWS%’ sous Windows 95/98, ou vers votre dossier ’%SYSTEMROOT%’ sous Windows NT ou Windows 2000 et renommez le en ’php.ini’. Votre dossier ’%WINDOWS%’ ou ’%SYSTEMROOT%’ est généralement : c:\windows pour Windows 95/98 c:\winnt ou c:\winnt40 pour les serveurs NT/2000 Editez votre fichier php.ini : • Vous devez changer votre option ’extension_dir’ pour qu’il pointe sur votre dossier d’installation PHP, ou vers l’endroit où vous avez installé vos ’php_*.dll’. ex: c:\php • Si vous utilisez Omni Httpd, sautez l’étape suivante. Modifiez ’doc_root’ pour qu’il pointe sur votre racine de serveur web. ex: c:\apache\htdocs ou c:\webroot. • Choisissez les modules que vous voulez charger lorsque PHP démarre. Vous pouvez décommenter les lignes ’extension=php_*.dll’ pour charger ces modules. Certains modules requièrent que des librairies supplémentaires soient installées sur votre système. La FAQ (http://www.php.net/FAQ.php) PHP a plus d’informations sur ces librairies. Vous pouvez aussi charger dynamiquement ces librairies avec dl("php_*.dll");. Voyez la section sur les extensions Windows. • Sous PWS et IIS, vous pouvez modifier le fichier browscap.ini pour qu’il pointe sur : c:\windows\system\inetsrv\browscap.ini sous Windows 95/98 et c:\winnt\system32\inetsrv\browscap.ini sous NT. Plus de détails sur l’utilisation de browscap sont accessibles sur ce miroir (http://php.netvision.net.il/browser-id.php3), sélectionnez le bouton "source" pour le voir en action. Compilation des sources Avant de commencer, il est bon de se poser la question suivante : "Pourquoi la compilation de PHP sous Windows est si difficile?". Deux raisons viennent immédiatement à l’esprit : 1. Windows ne dispose pas (encore) d’une grande communauté de développeurs qui partagent librement leurs sources. La conséquence directe est que les investissements nécessaires en infrastructure pour supporter ce type de 27 Chapitre 2. Installation développement n’ont pas été faits. Ce qui fait que le portage des utilitaires Unix a été la solution pour pallier ce manque. Ne soyez donc pas surpris de rencontrer cette parenté de temps en temps. 2. La majorité des instructions que vous allez rencontrer sont du type : "faire et oublier". Alors, asseyez-vous confortablement et suivez aussi scrupuleusement que possible les instructions. Préparation Avant de commencer, il faut télécharger un maximum de fichiers! • • Pour commencer, téléchargez le Cygwin depuis le miroir cygwin (http://sources.redhat.com/cygwin/download.html) le plus proche. Cela vous donnera les utilitaires GNU les plus populaires, utilisés durant le processus de compilation. Téléchargez le reste des utilitaires de compilation dont vous aurez besoin depuis le site PHP à http://www.php.net/extra/win32build.zip (http://www.php.net/extra/win32build.zip). • Téléchargez le code source du DNS utilisé par PHP à http://www.php.net/extra/bindlib_w32.zip (http://www.php.net/extra/bindlib_w32.zip). Il remplacera le fichier resolv.lib inclut dans win32build.zip. • Si vous n’avez pas d’utilitaire de dézippage, vous devez en télécharger un. Une version libre est disponible à InfoZip (http://www.cdrom.com/pub/infozip/UnZip.html). Finalement, vous aurez besoin des sources PHP 4 elles-mêmes!! Les dernières versions sont accessibles sur le serveur CVS anonyme (http://www.php.net/anoncvs.php). Si vous téléchargez une version intermédiaire (http://snaps.php.net/) ou la source (http://www.php.net/downloads.php), vous devez non seulement extraire les fichiers, mais aussi convertir les nouvelles lignes en leur équivalent windows (crlf) dans les fichiers *.dsp et *.dsw avant que Microsoft Visual C++ ne soit capable de les comprendre. Note : Placez les dossiers Zend et TSRM dans le dossier php4 pour que les projets puissent les trouver durant la compilation. Mettre tout ensemble • • Suivez les instructions pour installer l’utilitaire d’unzip de votre choix. Exécutez setup.exe et suivez les instructions d’installation. Si vous décidez d’installer dans un autre dossier que c:\cygnus, indiquez le au processus de compilation en modifiant la variable d’environnement Cygwin. Sous Windows 95/98, modifier une variable d’environnement se fait en ajoutant une ligne dans le fichier autoexec.bat. Sous Windows NT, allez dans le menu "Démarrer => Paramètres => Panneau de contrôle => Système " ("My Computer => Control Panel => System ") et sélectionnez l’onglet "environnement" ("environment"). Avertissement Créez un dossier temporaire pour Cygwin, sinon de nombreuses commandes (comme bison) échoueront. Sous Windows 95/98, mkdir C:\TMP. Sous Windows NT, mkdir %SystemDrive%\tmp. • • Créez un dossier et dézippez win32build.zip dedans. Lancez Microsoft Visual C++, et allez dans le menu "select Tools => Options". Dans le dialogue, sélectionnez l’onglet "directories". Assurez-vous que cygwin\bin, win32build\include, et win32build\lib sont bien dans les menus déroulants "Executables", "Include", et "Library". (Pour ajouter une entrée, sélectionnez une ligne blanche, et tapez). Une entrée typique ressemble à ceci : • c:\cygnus\bin • c:\php-win32build\include • c:\php-win32build\lib Pressez "OK", et sortez de Visual C++. 28 • Chapitre 2. Installation Créez un autre dossier et dézippez bindlib_w32.zip dedans. Décidez si vous avez besoin des symboles de débuggage (bindlib - Win32 Debug) ou non (bindlib - Win32 Release). Compilez la configuration adéquate : • Pour les utilisateurs de GUI, lancez VC++, puis sélectionnez le menu "File => Open Workspace" et "bindlib". Puis sélectionnez "Build=>Set Active Configuration" et sélectionnez la configuration voulue. Enfin, sélectionnez "Build=>Rebuild All". • Pour les utilisateurs en ligne de commande, assurez-vous que vous avez enregistré les variables d’environnement C++, ou que vous avez exécuté vcvars.bat. Exécutez maintenant l’une des commandes suivantes : • • msdev bindlib.dsp /MAKE "bindlib - Win32 Debug" • msdev bindlib.dsp /MAKE "bindlib - Win32 Release" A ce stade, vous avez une librairie resolv.lib utilisable, soit dans votre dossier Debug, soit sans le dossier Release. Copiez ce fichier dans votre dossier win32build\lib, en remplaçant le fichier du même nom. Compilation La meilleure façon de compiler est de commander par la version CGI/exécutable. • Pour les utilisateurs GUI, lancez VC++, puis sélectionnez le menu "File => Open Workspace" et sélectionnez "php4ts". Ensuite, sélectionnez le menu "Build=>Set Active Configuration", et sélectionnez la configuration voulue. Finalement, sélectionnez le menu "Build=>Rebuild All". • Pour les utilisateurs en ligne de commande, assurez-vous que vous avez enregistré les variables d’environnement C++, ou que vous avez exécuté vcvars.bat. Exécutez maintenant l’une des commandes suivantes : • msdev php4ts.dsp /MAKE "php4ts - Win32 Debug_TS" • msdev php4ts.dsp /MAKE "php4ts - Win32 Release_TS" • A ce stade, vous avez une librairie php.exe utilisable, soit dans votre dossier Debug_TS soit sans le dossier Release_TS. Répétez les instructions ci-dessus avec php4isapi.dsp (qui est dans sapi\isapi) pour compiler le code nécessaire pour intégrer PHP avec Microsoft IIS. Installation des extensions sous Windows Après avoir installé PHP et votre serveur web sous Windows, vous voudrez sÛrement ajouter quelques extensions bien pratiques. La table suivante liste une partie des extensions disponibles. Comme indiqué dans le manuel, vous pouvez choisir quelles extensions vous voulez charger en décommentant la ligne ’extension=php_*.dll’ dans le fichier php.ini. Vous pouvez aussi charger dynamiquement un module avec la fonction dl(). Les fichiers DLLs des extensions PHP sont préfixés par ’php_’ en PHP 4, et ’php3_’ en PHP 3. Cela évite la confusion des extensions PHP et de leurs librairies. Note : En PHP 4.0.4pl1, les extensions BCMath, BCMath,Calendar, COM, FTP, MySQL, ODBC, PCRE, Sessions, WDDX et XML sont activées par défaut. Vous n’avez rien à faire pour qu’elles soient inclues. Lisez le fichier README.txt ou install.txt dans votre distribution pour connaître la liste des modules par défaut. Tableau 2-1. Extensions PHP php_bz2.dll Fonctions de compression Bzip2 php_calendar.dll Fonctions de conversions calendaires (Depuis PHP 4.03, elles sont activées par défaut) php_cpdf.dll Fonctions ClibPDF 29 Chapitre 2. Installation php_crypt.dll Fonctions de cryptage php_ctype.dll Fonctions ctype php_curl.dll Fonctions CURL php_cybercash.dll Fonctions de paiement Cybercash php_db.dll Fonctions DBM php_dba.dll Fonctions dbm-style php_dbase.dll Fonctions DBase php3_dbm.dll Librairie d’émulation GDBM via Berkely DB2 php_domxml.dll Fonctions DOM XML php_dotnet.dll Fonctions .NET php_exif.dll Entêtes EXIF des images JPEG php_fbsql.dll Fonctions FrontBase php_fdf.dll Fonction FDF (Forms Data Format) php_filepro.dll Lecture des bases filepro php_ftp.dll Fonctions FTP(Depuis PHP 4.0.3, elles sont activées par défaut) php_gd.dll Bibliothèque GD (pour les manipulations d’images) php_gettext.dll Fonctions GNU Gettext php_hyperwave.dll Fonctions HyperWave php_iconv.dll Fonctions de conversions ICONV php_ifx.dll Fonctions Informix php_iisfunc.dll Fonctions IIS php_imap.dll Fonctions IMAP 4(en PHP 3: php3_imap4r1.dll) php_ingres.dll Fonctions Ingres II php_interbase.dll Fonctoins InterBase php_java.dll Extension Java php_ldap.dll Fonctions LDAP php_mhash.dll Fonctions Mhash php_ming.dll Fonctions Ming pour Flash php_msql.dll Fonctions mSQL php3_msql1.dll Fonctions mSQL 1 php3_msql2.dll Fonctions mSQL 2 php_mssql.dll Fonctions MSSQL (anciennement php_mssql70.dll, requiert MSSQL DB-Libraries) php3_mysql.dll Fonctions MySQL (Activées par défaut en PHP 4) php_nsmail.dll Fonctions Netscape mail php3_oci73.dll Fonctions Oracle php_oci8.dll Fonctions Oracle 8 php_openssl.dll Fonctions OpenSSL php_oracle.dll Fonctions Oracle php_pdf.dll Fonctions PDF php_pgsql.dll Fonctions PostgreSQL php_printer.dll Fonctions d’impression php_sablot.dll Focntions XSLT php_snmp.dll Fonctions SNMP get et walk (NT uniquement!) 30 Chapitre 2. Installation php_sybase_ct.dll Fonctions Sybase php_yaz.dll Fonctions YAZ php_zlib.dll Fonctions ZLib Installation du serveur Apache Cette section contient des notes spécifiques pour l’installation de PHP avec Apache, aussi bien pour la version Unix que Windows. Détails pour l’installation de PHP sous Apache sous Unix. Vous pouvez sélectionner des options à ajouter au fichier configure à la ligne 8 depuis la liste complète des options de configuration. Exemple 2-5. Instructions d’installation (version module) 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. gunzip apache_1.3.x.tar.gz tar xvf apache_1.3.x.tar gunzip php-x.x.x.tar.gz tar xvf php-x.x.x.tar cd apache_1.3.x ./configure --prefix=/www cd ../php-x.x.x ./configure --with-mysql --with-apache=../apache_1.3.x --enable-track-vars make make install cd ../apache_1.3.x for PHP 3: ./configure --activate-module=src/modules/php3/libphp3.a for PHP 4: ./configure --activate-module=src/modules/php4/libphp4.a 13. make 14. make install Au lieu de cette étape, vous pouvez aussi copier le binaire httpd et remplacer votre exécutable actuel. Assurez-vous tout de même que le serveur est bien éteint. 15. cd ../php-x.x.x 16. for PHP 3: cp php3.ini-dist /usr/local/lib/php3.ini for PHP 4: cp php.ini-dist /usr/local/lib/php.ini Vous pouvez éditer votre fichier php.ini pour modifier certaines options PHP. Si vous préférez placer ce fichier ailleurs, utilisez --with-config-file-path=/path lors de l’étape 8. 17. Editez votre fichier httpd.conf ou srm.conf file et ajoutez : Pour PHP 3: AddType application/x-httpd-php3 .php3 Pour PHP 4: AddType application/x-httpd-php .php Vous pouvez choisir n’importe quelle extension que vous voulez ici. .php est uniquement une suggestion. Vous pouvez aussi inclure .html. 18. Utilisez votre procédure habituelle pour démarrer votre serveur Apache. (vous devez l’éteindre et le redémarrer, pas seulement lui envoyer un signal HUP ou USR1.) Suivant votre installation d’Apache et votre variante d’Unix, il existe de nombreuses façons d’arrêter et redémarrer Apache. Voici une liste des commandes typiques, pour différentes installations. Remplacez /path/to/ par le chemin d’accès à vos applications sur votre système. 1. Nombreuses variantes Linux SysV : /etc/rc.d/init.d/httpd restart 2. Avec les scripts apachectl : /path/to/apachectl stop /path/to/apachectl start 31 Chapitre 2. Installation 3. httpdctl et httpsdctl (utilisant OpenSSL), similaire à apachectl: /path/to/httpsdctl stop /path/to/httpsdctl start 4. En utilisant mod_ssl, ou un autre seveur SSL, manuellement : /path/to/apachectl stop /path/to/apachectl startssl Les exécutables apachectl et http(s)dctl peuvent être situés dans différents dossiers. Si votre système a locate ou whereis ou which, utilisez-les pour retrouver vos programmes. Différents exemples de compilation PHP pour Apache suivent : ./configure --with-apxs --with-pgsql Cette commande va créer une librairie partagée libphp4.so qui sera chargée par Apache avec une ligne LoadModule dans le fichier httpd.conf. Le support PostgreSQL est aussi inclut dans libphp4.so. ./configure --with-apxs --with-pgsql=shared Cette commande va créer une autre librairie partagée libphp4.so, mais va aussi créer une librairie partagée pgsql.so qui sera chargée dans PHP avec les options de configurations du fichier php.ini ou par chargement dynamique avec dl(). ./configure --with-apache=/path/to/apache_source --with-pgsql Cette commande va créer une autre librairie partagée libmodphp4.a, un fichier mod_php4.c et quelques fichiers compagnons dans le dossier src/modules/php4 de dossier Apache. Puis, vous devez compiler Apache avec --activate-module=src/modules/php4/libphp4.a et le système de compilation d’Apache va créer un fichier libphp4.a et le lien statiquement avec httpd. Le support PostgreSQL est alors inclut directement dans l’exécutable httpd, ce qui fait que le résultat final est un fichier unique httpd, qui inclus Apache et PHP. ./configure --with-apache=/path/to/apache_source --with-pgsql=shared Identique à la version précédente, mais au lieu d’inclure le support PostgreSQL directement dans l’exécutable final httpd, vous allez obtenir une librairie partagée pgsql.so que vous pouvez charger dans PHP soit grâce au fichier de configuration php.ini ou dynamiquement avec dl(). Lorsque vous faites le choix entre les différents modes de compilation de PHP, vous devez prendre en compte leurs avantages et inconvénients respectifs. Les objets partagés permettent de compiler PHP et Apache de manière séparée, et vous n’aurez pas à compiler l’ensemble pour faire évoluer PHP. La compilation statique permet de charger et d’éxécuter plus rapidement PHP. Pour plus d’informations, voyez webpage on DSO support (http://www.apache.org/docs/dso.html). Détails sur l’installation de PHP sous Windows avec Apache 1.3.x Il y a deux méthodes pour faire fonctionner PHP avec Apache 1.3.x sous Windows. La première est d’utiliser l’exécutable CGI (php.exe), l’autre est d’utiliser les modules Apache DLL. Dans les deux cas, vous devez arrêter le serveur Apache, éditer votre fichier srm.conf ou httpd.conf pour configurer Apache. Bien qu’il puisse y avoir quelques différences de configurations de PHP sous Apache, le processus reste simple et à la portée du néophyte. Reportez-vous aux documentations Apache pour plus de détails sur ces directives. Si vous avez dézippé le package dans C:\PHP\ comme indiqué dans Instructions Générales d’installation, vous devez insérer les lignes suivantes dans votre fichier srm.conf ou httpd.conf pour qu’il fonctionne en CGI : • ScriptAlias /php/ "c:/php/" 32 Chapitre 2. Installation • AddType application/x-httpd-php .php .phtml • Action application/x-httpd-php "/php/php.exe" N’oubliez pas de redémarrer le serveur, avec la commande NET STOP APACHE suivie de NET START APACHE. Si vous voulez utiliser PHP comme module Apache, vous devez déplacer le fichier php4ts.dll dans le dossier windows/system (pour Windows 9x/Me) ou winnt/system32 (pour Windows NT/2000), en écrasant les anciennes versions. Puis, vous devez ajouter les deux lignes suivantes dans le fichier de configuration Apache : • LoadModule php4_module c:/php/sapi/php4apache.dll • AddType application/x-httpd-php .php .phtml Pour utiliser les fonctionnalités de mise en évidence du code source, créez simplement un script PHP et ajoutez le code suivant : <?php show_source("original_php_script.php"); ?>. Remplacez le fichier original_php_script.php par le fichier que vous voulez afficher : c’est la seule manière de le faire. Note : Sous Win-Apache tous les antislash des noms de chemins tels que "c:\directory\file.ext", doivent être convertis en slash. CGI/ Installation pour exécution en ligne de commande Par défaut, PHP est compilé comme une CGI. Si vous voulez que votre serveur web supporte le PHP, compiler le PHP comme un CGI permet d’obtenir de meilleures performances. Cependant, la version CGI permet aux utilisateurs de lancer des scripts PHP sous leur UID respectives. Lisez attentivement le chapitre consacré à la sécurité si vous souhaitez utiliser cette solution. Tests Si vous avez compilé PHP comme programme CGI, vous pouvez tester votre produit en tapant : make test. C’est toujours une bonne chose de tester le résultat d’une compilation. Cela vous permet de repérer des problèmes entre PHP et votre plate-forme, bien plus facilement que si vous attendez. Performances Si vous avez compilé PHP comme programme CGI, vous pouvez évaluer les performances de PHP 3 avec la commande make bench. Notez que si le safe mode est activé (par défaut), vous ne risquez pas de voir l’évaluation s’arrêter une fois les 30 secondes réglementaires écoulées. En effet, la fonction set_time_limit() ne peut pas être utilisée si le safe mode fonctionne. Utilisez l’option max_execution_time pour contrôler le temps d’éxécution de vos scripts. make bench ignore le fichier de configuration file. Note : make bench n’est disponible qu’en PHP 3. Installation avec les serveurs fhttpd Pour compiler PHP comme un module fhttpd, répondre "yes" à la question "Build as an fhttpd module ?" (cela correspond à l’option de configuration --with-fhttpd=DIR et spécifier la racine de la distribution fhttpd. Le répertoire par défaut est: /usr/local/src/fhttpd. Si vous utilisez fhttpd, compiler PHP en module vous permettra d’obtenir des performances supérieures, plus de contrôle et la possibilité d’exécution à distance. 33 Chapitre 2. Installation Installation sur serveur Caudium PHP 4 peut être compilé comme module Pike pour le serveur web Caudium. Notez que ce mode n’est pas supporté en PHP 3. Suivez simplement les instructions suivantes pour installer PHP 4 sur un serveur Caudium. Exemple 2-6. Instructions d’installation Caudium 1. Assurez-vous que vous avez un serveur Caudium installé avant de tenter l’installation PHP 4. Pour que PHP 4 fonctionne correctement, vous devez installer Pike 7.0.268 ou plus récent. Pour cet exemple, nous supposerons que vous avez installé Caudium dans le dossier /opt/caudium/server/. 2. Renommez le dossier en php-x.y.z (où x.y.z est le numéro de version). 3. ./configure --with-caudium=/opt/caudium/server 4. make 5. make install 6. Redémarrez Caudium s’il était en fonctionnement 7. Connectez-vous à l’interface de configuration graphique et allez dans le serveur virtuel auquel vous voulez ajouter le support PHP. 8. Cliquez sur "Add Module" et recherchez puis ajoutez le module "PHP 4 Script Support". 9. Si la documentation dit que ’PHP 4 interpreter isn’t available’, assurez-vous que vous avez bien redémarré le serveur. Si vous l’avez fait, vérifiez le fichier /opt/caudium/logs/debug/default.1 : il contient peut-être des erreurs liées à PHP4.so. De même, assurez-vous que caudium/server/lib/[pike-version]/PHP4.so est présent. 10. Configurez le module "PHP Script Support" si nécessaire. Vous pouvez bien sÛr compiler votre module Caudium avec les diverses extensions disponibles. Voyez la liste complète des options de configuration pour une liste exhaustive. Note : Lorsque vous ajoutez le support MySQL à PHP 4, vous devez-vous assurer que le client MySQL normal est utilisé. Sinon, il peut y avoir des conflits avec Pike, qui dispose déjà du support MySQL. Vous pouvez le faire en spécifiant le dossier d’installation de MySQL grâce à l’option --with-mysql. Installation avec les serveurs IIS/PWS Cette section contient des notes sur l’installation de PHP avec IIS ( Microsoft Internet Information Server) : PWS/IIS 3, PWS 4 ou plus récent et IIS 4 ou plus récent. Windows et PWS/IIS 3 La méthode recommandée pour configurer ces serveurs est d’utiliser le fichier INF inclus dans la distribution (php_iis_reg.inf). Vous pouvez éditer ce fichier, pour vous assurer que les extenstions et les dossiers d’installation de PHP sont bien ceux de votre configuration. Ou alors, vous pouvez suivre les instructions suivantes : Avertissement ATTENTION: Ces instructions requièrent la manipulation du fichier de registry de Windows. Une erreur peut laisser votre système dans un état instable. Nous vous recommandons vivement de sauvegarder ce fichier en lieu sÛr. L’équipe de développement et les traducteurs de cette documentation ne pourront pas être tenus responsable d’un quelconque dommage qui pourrait survenir dans votre registry. • • Lancez Regedit. Naviguez jusqu’à : HKEY_LOCAL_MACHINE /System /CurrentControlSet /Services /W3Svc /Parameters /ScriptMap. • Dans le menu "edit", sélectionnez : New->String Value. 34 Chapitre 2. Installation • • Entrez l’extension que vous voulez utiliser pour les scripts PHP. ex: .php Double cliquez sur la chaîne, et entrez le chemin jusqu’à php.exe dans le champ "value data". ex: c:\php\php.exe %s %s. Les ’%s %s’ sont TRES importants, PHP ne fonctionnera pas sans. • Répétez ces instructions pour toutes les extensions que vous voulez associer aux scripts PHP. • Naviguez jusqu’à : HKEY_CLASSES_ROOT • Dans le menu edit, sélectionnez: New->Key. • Donnez le nom de votre extension à la clé : ex: .php • Sélectionnez le nom de la nouvelle clée dans le panneau de droite, et double cliquez dans "default value", puis entrez phpfile. • Répétez ces instructions pour toutes les extensions que vous avez associées aux scripts PHP. • Créez une autre New->Key sous HKEY_CLASSES_ROOT et nommez-la phpfile. • Sélectionnez la nouvelle clé phpfile et dans le panneau de doite, double cliquez dans "default value" et entrez PHP Script. • Faites un clic droit dans phpfile et sélectionnez New->Key, appelez-le Shell. • Faites un clic droit dans Shell et sélectionnez New->Key, appelez-le open. • Faites un clic droit dans open et sélectionnez New->Key, appelez-le command. • Sélectionnez la nouvelle clé command et dans le panneau de droite, faites un double clic dans "default value", puis entrez le chemin jusqu’à php.exe. ex: c:\php\php.exe -q %1. (n’oubliez pas le %1). • Quittez Regedit. • Si vous utilisez PWS sous Windows, redémarrez pour prendre en compte la nouvelle registry. Les utilisateurs de PWS et IIS 3 sont prêts à utiliser leur serveur. Avec IIS 3, vous pouvez utiliser un outil (http://www.genusa.com/iis/iiscfg.html) bien pratique de Steven Genusa pour configurer votre carte des scripts. Windows et PWS 4 ou plus récent Pour installer PHP sous Windows avec PWS 4 ou plus récent, vous avez deux options : l’une est d’avoir PHP sous forme de CGI, l’autre est d’utiliser les modules SAPI, sous forme de DLL. Si vous optez pour le CGI, faites ceci : • Editez le fichier pws-php4cgi.reg (dans le dossier sapi) pour indiquer la localisation de votre fichier php.exe. Les slash doivent être échappés. Par exemple : [HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\w3svc\parameters\Script Map] ".php"="C:\\PHP\\php.exe" • Dans le gestionnaire PWS Manager, faites un clic droit sur les dossiers qui supporteront PHP, et sélectionnez "Properties". Cochez l’option "Execute" et confirmez. Si vous optez pour les modules ISAPI, faites ceci : • Editez le fichier pws-php4isapi.reg (dans le dossier sapi) pour indiquer la localisation de votre fichier php4isapi.dll. Les slash doivent être échappés. Par exemple : [HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\w3svc\parameters\Script Map] ".php"="C:\\PHP\\sapi\\php4isapi.dll" • Dans le gestionnaire PWS Manager, faites un clic droit sur les dossiers qui supporteront PHP, et sélectionnez "Properties". Cochez l’option "Execute" et confirmez. 35 Chapitre 2. Installation Windows NT/2000 et IIS 4 ou plus récent Pour installer PHP sous Windows NT/2000 serveyr avec IIS 4 ou plus récent, vous avez deux options : l’une est d’avoir PHP sous forme de CGI, l’autre est d’utiliser les modules SAPI, sous forme de DLL. Dans les deux cas, vous devez lancer la console "Microsoft Management" (elle peut aussi s’appeler "Internet Services Manager". Elle est située soit dans "Windows NT 4.0 Option Pack" ou dans "Control Panel=>Administrative Tools" sous Windows 2000). Puis, faites un clic droit sur votre dossier web (qui apparaitra probablement comme Default Web Server), et sélectionnez "Properties". Si vous optez pour le CGI, faites ceci : • Sous "Home Directory", "Virtual Directory", ou "Directory", cliquez sur le bouton "Configuration", et sélectionnez l’onglet "App Mappings". • Cliquez sur "Add", puis dans la boîte "Executable", tapez : c:\php\php.exe %s %s (en supposant que vous avez dézippé PHP dans c:\php\). Vous DEVEZ ajouter %s %s à la fin : PHP ne fonctionnera pas correctement sans. • Dans la boîte "Extension", tapez le nom de l’extension que vous voulez associer aux scripts PHP. Laissez "Method exclusions" vide, et cochez "Script engine". Répétez les étapes 3 et 4 pour chaque extension que vous souhaitez associer aux scripts PHP. (.php et .phtml sont les plus répandus.) • Configurer la sécurité nécessaire (dans "Internet Service Manager"), et si votre serveur NT utilise NTFS, ajoutez les droits adéquats pour I_USR_, au dossier qui contient php.exe. Si vous optez pour les modules ISAPI, faites ceci : • Si vous ne voulez pas effectuer des authentifications HTTP avec PHP, vous pouvez (et devez) sauter cette étape. Avec ISAPI Filters, ajoutez un nouveau filtre ISAPI. Utilisez PHP comme nom de filtre, et ajoutez simplement le chemin jusqu’à php4isapi.dll. • Sous "Home Directory", cliquez sur le bouton "Configuration". Ajoutez une nouvelle entrée dans "Application Mappings". Utilisez le chemin jusqu’à php4isapi.dll comme "Executable", indiquez ".php" comme extension, laissez "Method exclusions" vide, et cochez "Script engine". • Arrêtez totalement IIS • Démarrez IIS Installation sous Netscape et iPlanet Enterprise Serveur Pour compiler PHP avec NES ou iPlanet web, ajoutez le dossier d’installation dans l’option de configuration --with-nsapi = DIR . Par défaut, le dossier est /opt/netscape/suitespot/. Lisez aussi le fichier /php-xxx-version/sapi/nsapi/nsapi-readme.txt pour plus de détails. Exemple 2-7. Installation de Netscape Enterprise sous Solaris Instructions pour Sun Solaris 2.6 avec Netscape Enterprise Server 3.6 From: [email protected] 1. Installez les packages suivants depuis le serveur www.sunfreeware.com ou un miroir ad hoc : flex-2_5_4a-sol26-sparc-local gcc-2_95_2-sol26-sparc-local gzip-1.2.4-sol26-sparc-local perl-5_005_03-sol26-sparc-local bison-1_25-sol26-sparc-local make-3_76_1-sol26-sparc-local m4-1_4-sol26-sparc-local autoconf-2.13 automake-1.4 mysql-3.23.24-beta (if you want mysql support) tar-1.13 (GNU tar) 36 Chapitre 2. Installation 2. Assurez-vous que le path inclut bien les dossiers nécessaires : PATH=.:/usr/local/bin:/usr/sbin:/usr/bin:/usr/ccs/bin export PATH 3. gunzip php-x.x.x.tar.gz (si vous avez une distribution .gz, ou bien allez en 4) 4. tar xvf php-x.x.x.tar 5. cd ../php-x.x.x 6. Pour les étapes suivantes, assurez-vous que /opt/netscape/suitespot/ correspond bien à votre installation du serveur netscape. Sinon, indiquez le chemin correct : /configure --with-mysql=/usr/local/mysql --with-nsapi=/opt/netscape/suitespot/ --enable-track-vars --enable-libgcc 7. make 8. make install Après avoir fait l’installation de base et lu les fichiers readme.txt, vous pouvez avoir besoin de faire des configurations supplémentaires. D’abord, vous devez ajouter des chemins dans la variable LD_LIBRARY_PATH pour que PHP trouve toutes les librairies partagées. Le mieux est de le faire dans le script de démarrage de votre serveur Netscape. Les utilisateurs Windows peuvent probablement ignorer cette étape. Le script de démarrage est situé dans : /path/to/server/https-servername/start Vous pouvez aussi avoir besoin d’éditer les fichiers de configuration qui sont situés dans : /path/to/server/https-servername/config/. Exemple 2-8. Exemple de configuration pour Netscape Enterprise Instructions de configuration for Netscape Enterprise Server From: [email protected] 1. Ajoutez les lignes suivantes dans mime.types: type=magnus-internal/x-httpd-php exts=php 2. Ajoutez les lignes suivantes dans obj.conf. shlib peut dépendre de votre OS, pour Unix c’est quelque chose de proche de /opt/netscape/suitespot/bin/libphp4.so. Il est conseillé de placer les lignes suivantes après les lignes de types mime : Init fn="loadmodules" funcs="php4_init,php4_close,php4_execute,php4_auth_trans" shlib="/php4/nsapiPHP4.dll" Init fn=php4_init errorString="Failed to initialize PHP!" <object name="default"> . . . .#NOTE La ligne suivante doit être placée après toutes .#les lignes ’ObjectType’ .# et avant les lignes ’AddLog’ Service fn="php4_execute" type="magnus-internal/x-httpd-php" . . </Object> <Object name="x-httpd-php"> ObjectType fn="force-type" type="magnus-internal/x-httpd-php" Service fn=php4_execute </Object> Configuration d’authentification L’authentification PHP ne peut pas être utilisée avec d’autre authentification. TOUTES LES FORMES D’AUTHENTIFICATION SONT PASSEES AU SCRIPT PHP. Pour configurer l’authentification PHP pour le serveur entier, ajoutez la ligne suivante : <Object name="default"> AuthTrans fn=php4_auth_trans . . . 37 Chapitre 2. Installation . </Object> Pour configurer l’authentification PHP pour un dossier, ajoutez la ligne suivante : <Object ppath="d:\path\to\authenticated\dir\*"> AuthTrans fn=php4_auth_trans </Object> Si vous utilisez Netscape Enterprise 4.x, alors, il faut utiliser ceci : Exemple 2-9. Exemple de configuration pour Netscape Enterprise 4.x Placez ces lignes après les types MIME, et tout le reste ressemble à l’exemple ci-dessus : From: Graeme Hoose ([email protected]) Init fn="load-modules" shlib="/path/to/server4/bin/libphp4.so" funcs="php4_init,php4_close,php4_execute,php4_auth_trans" Init fn="php4_init" LateInit="yes" Installation OmniHTTPd Cette section contient des notes et conseils spécifiques à OmniHTTPd. OmniHTTPd 2.0b1 et plus récent pour Windows La méthode la plus simple pour configurer le serveur est : • Step 1: Installez Omni server. • Step 2: Faites un clic-droit sur l’icone bleue d’OmniHTTPd, sur le bureau, et sélectionnez Properties • Step 3: Cliquez sur Web Server Global Settings • Step 4: Dans l’onglet ’External’, entrez: virtual = .php | actual = c:\path-to-php-dir\php.exe, et utilisez le bouton "Add". • Step 5: Dans l’onglet Mime, entrez: virtual = wwwserver/stdcgi | actual = .php et utilisez le bouton "Add". • Step 6: Cliquez sur OK. Réptez les étapes 2 à 6 pour chaque extension que vous voulez associer à PHP. Note : Certains package OmniHTTPd sont livrés avec le support PHP déjà intégré. Vous pouvez choisir au moment de la configuration de faire un paramétrage poussé et de décocher le support PHP. Nous vous conseillons d’utiliser les dernières versions de PHP. Certains serveurs OmniHTTPd sont encore livrés avec des versions beta de PHP : il est recommandé de ne pas les installer, mais d’installer votre propre version. Si le serveur est déjà sur votre machine, vous pouvez utiliser le bouton "Replace" dans les étapes 4 et 5 pour en choisir un nouveau et à jour. Installation Oreilly Website Pro Server Cette section contient les conseils d’installation spécifiques à Oreilly Website Pro. 38 Chapitre 2. Installation Oreilly Website Pro 2.5 et plus récent pour Windows Cette liste décrit comment installer PHP comme CGI exécutable ou module ISAPI avec Oreilly Website Pro sous Windows. • Editez les "Server Properties" et sélectionnez l’onglet "Mapping". • Dans la "List" sélectionnez "Associations" et entrez le nom de l’extension voulue (".php") et le chemin jusqu’à l’exécutable (ex. c:\php\php.exe) ou la DLL ISAPI (ex. c:\php\sapi\php4isapi.dll). • Sélectionnez "Content Types", ajoutez la même extension ".php" et entrez le "content type". Si vous choisissez la forme CGI, entrez "wwwserver/shellcgi"; si vous choisissez la forme module ISAPI, entrez "wwwserver/isapi" (sans les guillemets). Installation Xitami Cette section contient les conseils d’installation spécifiques à Xitami. Xitami pour Windows Cette liste décrit comment installer PHP comme CGI exécutable ou module ISAPI avec Xitami sous Windows. • Assurez-vous que le serveur web fonctionne, et allez dans la console d’administration du serveur (généralement http://127.0.0.1/admin), puis cliquez sur "Configuration". • Naviguez dans les "Filters", et ajoutez l’extension que vous souhaitez (souvent ".php") dans le champs "File extensions". • Dans la commande "Filter", ajoutez le nom et le chemin de votre exécutable PHP (souvent c:\php\php.exe). • Cliquez sur le bouton "Save". Autres serveurs web PHP peut être compilé pour fonctionner avec de nombreux autres serveurs web. Reportez-vous à Options particulières aux serveurs web pour une liste complète des options de configuration. Les exécutables PHP CGI sont compatibles avec la majorité des serveurs supportant les interfaces CGI. Des problèmes? Lisez la FAQ Certains problèmes sont récurrents : les plus communs sont listés dans la FAQ PHP, disponible à http://www.php.net/FAQ.php. Rapports de Bug Si vous pensez avoir trouvé un bug dans PHP, n’oubliez pas de le signaler. L’équipe de développement PHP ne le connaît peut être pas, et si vous ne le signaler pas, vos chances de voir le bug corrigé sont nulles. Vous pouvez rapporter des bugs grâce au système de suivi, accessible à http://bugs.php.net/. Lisez les Bugs-Dos-And-Donts (http://bugs.php.net/bugs-dos-and-donts.php) (Les bugs : ce qu’il faut faire, et ce qu’il ne faut pas faire) avant d’envoyer n’importe quel rapport! 39 Chapitre 2. Installation Autres problèmes Si vous êtes complètement bloqués, quelqu’un sur la liste de diffusion PHP pourra probablement vous aider. Essayez de consulter les archives, au cas où quelqu’un aurait déjà rencontré votre problème. Les archives sont toujours accessibles à : http://www.php.net/. Pour souscrire à la liste de diffusion, envoyez un mail vide à [email protected] (mailto:[email protected]). L’adresse de la mailing liste : [email protected]. Si vous voulez obtenir de l’aide sur la liste de diffusion PHP, essayez d’être concis et clair, et pensez à donner tous les détails sur votre environnement (OS, version de PHP, serveur web, CGI ou module, safe mode...), et n’hésitez pas à envoyer suffisamment de code pour que nous puissions reproduire l’erreur. 40 Chapitre 3. Configuration 41 Chapitre 3. Configuration Le fichier de configuration Le fichier de configuration (appelé php3.ini dans la version 3.0 du PHP, et simplement php.ini dans la version 4.0) est lu par le PHP au démarrage. Si vous avez compilé PHP en module, le fichier n’est lu qu’une seule fois, au lancement du démon HTTP. Pour la version CGI le fichier est lu à chaque invocation. Lorsque vous utilisez le module Apache vous pouvez aussi changer les paramètres de configurations en utilisant les directives dans les fichiers de configuration d’Apache et dans les fichiers .htaccess. Dans la version 3.0, à chaque directive de configuration présente dans le fichier de configuration d’Apache correspond une directive de configuration dans le fichier php3.ini à l’exception des directives préfixées par "php3_". Dans la version 4.0, il n’y a seulement que quelques directives dans le fichier de configuration d’Apache qui vous permettent de modifier la configuration de PHP. php_value name value Cette directive affecte une valeur à la variable spécifiée. php_flag name on|off Cette directive est utilisée pour activer ou désactiver une option. php_admin_value name value Cette directive affecte une valeur à la variable spécifiée. La directive "Admin" ne peut être utilisée que dans le fichier de configuration d’Apache, et non dans un fichier .htaccess. php_admin_flag name on|off Cette directive est utilisée pour activer ou désactiver l’option précédente. Vous pouvez voir l’état de votre configuration en utilisant la fonction phpinfo(). Vous pouvez aussi accéder aux valeurs de votre configuration de manière individuelle en utilisant la fonction get_cfg_var(). Directives de configuration générale allow_url_fopen boolean Cette option autorise les accès au réseau des fonctions fopen(). Par défaut, l’accès est autorisé aux procédures d’accès distants, avec les protocoles FTP, NNTP, et certaines extensions telles ques zlib. Note : Cette option a été introduite immédiatement après la version 4.0.3. Pour les versions jusqu’à la 4.0.3 inclus, vous pouvez désactiver cette fonctionnalité au moment de la compilation en utilisant la configuration --disable-url-fopen-wrapper. asp_tags booléen Active l’utilisation des balises de type ASP <% %>, en plus des traditionnelles balises <?php ?> . Cela inclus l’utilisation du raccourcis <%= $value %>. Pour plus d’informations, reportez vous à inclusion dans le HTML. Note : Le support des balises ASP a été ajouté dans la version 3.0.4. auto_append_file chaîne de caractères Spécifie le nom d’un fichier qui sera automatiquement ajouté après le fichier principal. Le fichier est inclus comme si il avait été appelé avec la fonction include(), donc include_path est utilisé. Le mot réservé NONE désactive l’auto-appending. Note : Si le script s’arrête par la fonction exit(), auto-append ne fonctionnera pas. 42 Chapitre 3. Configuration auto_prepend_file chaîne de caractères Spécifie le nom d’un fichier qui sera automatiquement ajouté avant le fichier principal. Le fichier est inclus comme si il avait été appelé avec la fonction include(), donc include_path est utilisé. Le mot réservé NONE désactive l’auto-appending. cgi_ext chaîne de caractères (NDT : aucune documentation n’est fournie). display_errors booléen Cette directive détermine si les erreurs doivent être affichées à l’écran au format HTML ou non. doc_root string Le dossier racine de PHP. Utilisée uniquement si elle est définie. Si PHP est configuré en safe mode, aucun fichier en dehors de ce dossier ne sera accessible. engine boolean Cette directive ne sert vraiment que si PHP est un module Apache. Elle sert aux sites qui veulent activer ou désactiver l’analyse des fichiers par PHP, dossier par dossier. En mettant php3_engine off au bon endroit, dans le fichier httpd.conf, PHP peut être activé ou desactivé. error_log string Nom du fichier oú les erreurs seront enregistrées. Si la valeur spéciale syslog est utilisée, les erreurs sont envoyées au système standard d’historique. Sous UNIX, c’est syslog(3) et sous Windows NT c’est l’historique d’événements. L’historique système n’est pas supporté sous Windows 95. error_reporting integer Fixe le niveau d’erreur. Ce paramètre est un entier, représentant un champs de bits. Ajoutez les valeurs suivantes pour choisir le niveau que vous désirez : Tableau 3-1. Niveau de rapport d’erreur valeur du bit niveau choisi 1 erreurs normales 2 alertes normales 4 erreurs d’analyseur (parser errors) 8 alertes non critiques Par défaut, la valeur est de 7 (erreurs normales, alertes normales et erreurs d’analyseur sont affichées). open_basedir string Limite l’espace oú PHP peut ouvrir des fichiers. Lorsqu’un script essaie d’ouvrir un fichier avec les fonctions fopen ou gzopen (par exemple), la localisation du fichier est vérifiée. Si ce fichier est hors du dossier cité dans cette directive, PHP refusera de l’ouvrir. Tous les liens symboliques sont résolus, et subissent aussi la restriction. La valeurs spéciale . indique que le dossier courant du script est utilisé comme open_basedir. Sous Windows, séparez les noms de dossiers par un point virgule (;). Sur les autres systèmes, séparez les noms de dossiers par des deux points (:). Lorsque PHP est un module Apache, la valeur de la directive open_basedir des dossiers parents sont automatiquement hérités par les fils. Note : Le support pour les dossiers multiples a été ajouté dans 3.0.7. La valeur par défaut est : libre accès à tous les fichiers. 43 Chapitre 3. Configuration gpc_order chaîne de caractères Etablit l’ordre de préséance des méthodes GET/POST/COOKIE. Par défaut, cette directive est établie à "GPC". En affectant "GP" à cette directive, PHP ignorera les cookies, et écrasera toute méthode GET utilisée par une méthode POST avec des variables du même nom. ignore_user_abort chaîne de caractères Désactivée par défaut. Si cette directive est activée, alors tous les scripts lancés iront jusqu’à leur terme, même si le client se déconnecte en plein milieu. Voir aussi la fonction ignore_user_abort(). include_path string Spécifie une liste de dossier oú les fonctions require(), include() et fopen_with_path (NDtraducteur : cette fonction semble avoir disparue) iront chercher les fichiers. Le format est le même que celui de la variable d’environnement PATH : une liste de dossiers, séparés par des deux points (:) sous UNIX, et des points virgules (;), sous Windows. Exemple 3-1. UNIX include_path include_path=.:/home/httpd/php-lib Exemple 3-2. Windows include_path include_path=".;c:\www\phplib" La valeur par défaut pour cette directive est ., c’est à dire le dossier courant. isapi_ext string (Aucune documentation n’est fournie) log_errors boolean Indique oú les messages d’erreur générés doivent être écrits. Cette fonction est spécifique aux serveurs. magic_quotes_gpc boolean Fixe le mode magic_quotes pour les opérations GPC (Get/Post/Cookie). Lorsque magic_quotes est activé, tous les caractères ’ (guillemets simples), " (guillemets doubles), \ (antislash) et NUL sont échappés avec un antislash. Si magic_quotes_sybase fonctionne aussi, les guillemets simples seront échappés avec un autre guillemet simple, plutôt qu’un antislash. magic_quotes_runtime boolean Si magic_quotes_runtime est activé, toutes les fonctions qui retournent des données d’une source externe, y compris les bases de données et les fichiers texte, verront leur guillemets échappés avec un antislash. Si magic_quotes_sybase est aussi activé, les guillemets simples seront échappés avec un autre guillemet simple, plutôt qu’un antislash. magic_quotes_sybase boolean Si magic_quotes_sybase est activé, les guillemets simples seront échappés avec un autre guillemet simple, plutôt qu’un antislash, si magic_quotes_gpc ou magic_quotes_runtime est activé. max_execution_time integer Fixe le temps maximal d’éxécution d’un script, en secondes. Cela permet d’éviter que des scripts en boucles infinies ne saturent le serveur. memory_limit entier Grâce à cette option, vous pouvez donner la quantité maximale de mémoire qu’un script peut allouer. Cela permet de reserver toute la mémoire d’un serveur à un seul script. nsapi_ext chaîne de caractères Aucune documentation n’est fournie. 44 Chapitre 3. Configuration register_globals boolean Cette option active l’enregistrement des variables EGPCS (Environement, GET, POST, Cookie, Serveur), en tant que variables globales. Vous pouvez désactiver cette fonction si vous ne voulez pas truffer vos scripts avec des valeurs utilisateurs. Cette option est surtout utile lorsqu’elle est utilisée conjointement avec track_vars - dans ce cas, vous pouvez accéder à toutes les variables EGPCS grâce aux tableaux $HTTP_ENV_VARS, $HTTP_GET_VARS, $HTTP_POST_VARS, $HTTP_COOKIE_VARS, et $HTTP_SERVER_VARS. short_open_tag booléen Active ou désactive l’utilisation des balises courtes, (<? ?>). Si vous voulez utiliser PHP et XML en même temps, vous devez désactiver cette option. Si cette option est désactivée, vous devez utiliser la forme longue des tags, (<?php ?>). sql.safe_mode booléen Aucune documentation n’est fournie. track_errors booléen Si cette option est activée, le dernier message d’erreur sera placé dans la variable globale $php_errormsg. track_vars booléen Si cette option est activée, lors de l’appel des méthodes GET, POST et l’utilisation des cookies, les variables sont disponibles dans des tableaux associatifs globaux appelés respectivement $HTTP_GET_VARS, $HTTP_POST_VARS et $HTTP_COOKIE_VARS. upload_tmp_dir chaîne de caractères Indique le répertoire utilisé lors du chargement d’un fichier sur un serveur. Ce répertoire doit être accessible en lecture pour l’utilisateur qui lance le script PHP. user_dir chaîne de caractères Répertoire oú sont stockés les fichiers PHP dans le répertoire d’un utilisateur. Par exemple, public_html. warn_plus_overloading booléen Si cette option est activée, PHP émet un warning lorsque l’opérateur plus (+) est utilisé sur une chaîne de caractères. Cela permet de réperer plus facilement les scripts qui doivent être réécrits en utilisant l’opérateur de concaténation (.) plutôt que l’opérateur plus. Configuration des directives concernant le mail SMTP chaîne de caractères Sous Windows, adresse IP ou nom que PHP doit utiliser pour envoyer du mail avec la fonction mail(). sendmail_from chaîne de caractères Sous Windows, valeur du champs "From:" qui doit être utilisée lors de l’envoie de mail. sendmail_path chaîne de caractères Localisation du programme de sendmail, habituellement /usr/sbin/sendmail ou /usr/lib/sendmail. configure essaye de repérer la présence de sendmail par lui même, et affecte ce résultat par défaut. En cas de problème de localisation, vous pouvez établir une nouvelle valeur par défaut ici. Tout système n’utilisant pas sendmail doit établir cette directive à la valeur chemin du programme de substitution qui remplace le serveur de mail, si celui-ci existe, par exemple, Qmail (http://www.qmail.org/). Dans ce cas la, vous devez mettre: /var/qmail/bin/sendmail. Directives de configuration du "Safe Mode" safe_mode booléen Cette directive active ou désactive l’option "safe mode". Lisez le chapitre sécurité pour plus d’informations. 45 Chapitre 3. Configuration safe_mode_exec_dir chaîne de caractères Si l’option "SAFE MODE" est activée, system() et les autres fonctions exécutant des programmes systèmes refusent de se lancer si ces programmes ne sont pas placés dans ce répertoire. Directives de configuration de débbugage. debugger.host chaîne de caractères Adresse IP ou nom de l’hôte utilisé pour le déboggage. debugger.port chaîne de caractères Numéro du port utilisé pour le déboggage. debugger.enabled booléen Activation ou désactivation du debugger. Directives de chargement des extensions enable_dl booléen Cette directive n’est réellement utile que dans le cas d’une compilation comme module Apache. Vous pouvez activer le chargement dynamique des extensions avec la fonction dl(), et cela de manière locale à chaque serveur virtuel ou à chaque répertoire. La principale raison qui pousse à désactiver le chargement dynamique est un problème de sécurité. Lorsque le chargement dynamique est activé, il est possible d’ignorer les directives safe mode ou "open_basedir". Par défaut, il est possible d’utiliser le chargement dynamique, sauf lorsque la directive safe mode est activée. En effet, il est alors impossible d’utiliser la fonction dl(). extension_dir chaîne de caractères Définit le répertoire dans lequel le PHP doit chercher les extensions lors du chargement dynamique. extension chaîne de caractères Définit les extensions qui doivent être chargées lors du démarrage du PHP. MySQL Configuration Directives mysql.allow_persistent booléen Active ou désactive les connexions persistentes à la base de données MySQL. mysql.default_host chaîne de caractères Adresse par défaut du serveur, à utiliser lors de la connexion à un serveur MySQL, si aucun hôte n’est spécifié. mysql.default_user chaîne de caractères Utilisateur par défaut, à utiliser lors de la connexion à un serveur MySQL, si aucun utilisateur n’est spécifié. mysql.default_password chaîne de caractères Mot de passe par défaut, à utiliser lors de la connexion à un serveur MySQL, si aucun mot de passe n’est spécifié. mysql.max_persistent entier Nombre maximum de connexions persistantes à une base de donnée MySQL, par processus. mysql.max_links entier Nombre de connexion maximum à une base de donnée MySQL, par processus, incluant les connexions persistantes 46 Chapitre 3. Configuration Directives de configuration mSQL msql.allow_persistent booléen Active ou désactive les connexions persistentes à la base de données mSQL. msql.max_persistent entier Nombre maximum de connexions persistantes à une base de donnée mSQL, par processus. msql.max_links entier Nombre maximum de connexions à une base de donnée mSQL, par processus, incluant les connexions persistantes. Directives de configuration Postgres pgsql.allow_persistent booléen Active ou désactive les connexions persistantes à la base de données Postgres. pgsql.max_persistent entier Nombre maximum de connexions persistantes à une base de données Postgres, par processus. pgsql.max_links entier Nombre maximal de connexions à une base de donnée Postgres, par processus, incluant les connexions persistantes. Directives de configuration SESAM sesam_oml string Nom de la librairieBS2000 PLAM contenant les pilotes de connexion SESAM. Obligatoire pour les fonctions SESAM. La librairie BS2000 PLAM doit être configurée avec ACCESS=READ,SHARE=YES car elle doit être accessible à l’utilisateur Apache. sesam_configfile string Nom du fichier de configuration de l’application SESAM. Obligatoire pour les fonctions SESAM. Le fichier BS2000 doit être accessible être accessible à l’utilisateur Apache. Le fichier de configuration de l’application va contenir la configuration sur le schéma suivant (voir le manuel SESAM) : CNF=B NAM=K NOTYPE sesam_messagecatalog string Nom du catalogue de messages SESAM. Dans la plus part des cas, cette directive n’est pas nécessaire. Seulement, si le fichier de messages SESAM n’est pas installé dans la table de messages BS2000, il faut indiquer sa localisation avec cette directive. Le catalogue de messages doit être paramétré avec ACCESS=READ,SHARE=YES car elle doit être accessible à l’utilisateur Apache. Directives de configuration Sybase sybase.allow_persistent booléen Active ou désactive les connexions persistentes à la base de données Sybase. 47 Chapitre 3. Configuration sybase.max_persistent entier Nombre maximum de connexions persistantes à une base de données Sybase par processus. sybase.max_links entier Nombre maximum de connexions à une base de données Sybase, par processus, incluant les connexions persistantes. Sybase-CT Configuration Directives sybct.allow_persistent booléen Active ou désactive les connexions persistantes à la base de données Sybase-CT. Par défaut, cette option est activée. sybct.max_persistent entier Nombre maximum de connexions persistantes à une base de données Sybase-CT par processus. Par défaut, cette option est à -1, ce qui signifie que le nombre de connexion est illimité. sybct.max_links entier Nombre maximum de connexions à une base de données Sybase-CT, par processus, incluant les connexions persistantes. Par défaut, cette option est à -1, ce qui signifie que le nombre de connexions est illimitée. sybct.min_server_severity entier Les messages en provenance du serveur d’un niveau d’erreur égal à sybct.min_server_severity seront considérés comme des alertes (warnings). Cette valeur peut être modifiée à l’intérieur du script en appelant la fonction sybase_min_server_severity (NDtraducteur : cette fonction semble ne pas exister). Par défaut, cette valeur vaut 10. sybct.min_client_severity entier Les messages en provenance de la librairie client avec un niveau d’erreur égal ou supérieur à sybct.min_client_severity seront considérés comme des alertes. Cette valeur peut être modifiée à l’intérieur du script en appelant la fonction sybase_min_client_severity (NDtraducteur : cette fonction semble ne pas exister). Par défaut, cette valeur vaut 10, ce qui annule tout rapport d’erreur. sybct.login_timeout entier Délai de validité d’une tentative de connexion. Il est à noter que si max_execution_time est dépassé avant que la connexion n’éxpire, le script sera terminé avant le message d’erreur. Par défaut, cette valeur vaut 1 minute. sybct.timeout entier Temps maximum en secondes avant qu’une tentative de requête "select_db" ou "query" non aboutie renvoie une erreur. Il est à noter que si max_execution_time est dépassé avant que la requête n’éxpire, votre script sera terminé avant le message d’erreur. Par défaut, il n’y a pas de limite. sybct.hostname chaîne de caractères Nom de l’hôte à partir duquel vous vous connectez, afin d’être affiché par la fonction sp_who (NDtraducteur : cette fonction semble ne pas exister). Par défaut, cette valeur égale à 0. Directives de configuration Informix ifx.allow_persistent booléen Active les connexions persistantes à une base de données Informix. ifx.max_persistent entier Nombre maximum de connexions persistantes à une base de données Informix, par processus. ifx.max_links entier Nombre maximum de connexions à une base de données Informix par processus, en incluant les connexions persistantes. ifx.default_host chaîne de caractères Hôte par défaut oú se connecter si aucun hôte n’est spécifié par les fonctions ifx_connect() ou ifx_pconnect(). 48 Chapitre 3. Configuration ifx.default_user chaîne de caractères Utilisateur par défaut si aucun utilisateur n’est spécifié par les fonctions ifx_connect() ou ifx_pconnect(). ifx.default_password chaîne de caractères Mot de passe par défaut si aucun mot de passe n’est spécifié par les fonctions ifx_connect() ou ifx_pconnect(). ifx.blobinfile booléen Lorsque cette option est activée, les colonnes de type "blob" seront retournées dans un fichier. Par défaut, elles seront retournées en mémoire. Il est possible de modifier dynamiquement cette valeur grâce à la fonction ifx_blobinfile_mode(). ifx.textasvarchar booléen Lorsque cette option est activée, les colonnes de type "TEXT" seront retournées dans une chaîne de caractères. Par défaut, elles seront retournées en mémoire. Il est possible de modifier dynamiquement cette valeur grâce à la fonction ifx_textasvarchar(). ifx.byteasvarchar booléen Lorsque cette option est activée, les colonnes de type "BYTE" seront retournées dans une chaîne de caractères. Par défaut, elles seront retournées en mémoire. Il est possible de modifier dynamiquement cette valeur grâce à la fonction ifx_textasvarchar(). ifx.charasvarchar booléen Lorsque cette option est activée, les espaces en fin de chaîne de caractères seront conservés lors d’une commande FETCH. ifx.nullformat booléen Lorsque cette option est activée, les colonnes de valeur NULL seront retournées comme des chaînes de caractères vides. Il est possible de modifier dynamiquement cette valeur grâce à la fonction ifx_nullformat(). Directives de configuration pour les calculs mathématiques. bcmath.scale entier Nombre de chiffres après la virgule pour toutes les fonctions de précision mathématique arbitraire. Directives de configuration du navigateur. browscap chaîne de caractères Nom du fichier de descriptif des clients HTML. Voir aussi get_browser(). Directives de configuration du driver ODBC unifié uodbc.default_db chaîne de caractères Source de données ODBC à utiliser par défaut avec les fonctions odbc_connect() ou odbc_pconnect(). uodbc.default_user chaîne de caractères Nom d’utilisateur défaut avec les fonctions odbc_connect() ou odbc_pconnect(). uodbc.default_pw chaîne de caractères Mot de passe par défaut dans les fonctions odbc_connect() ou odbc_pconnect(). uodbc.allow_persistent booléen Cette option active ou désactive les connexions persistantes à la base de données, via le canal ODBC. uodbc.max_persistent entier Nombre maximum de connexions persistantes autorisées à la base de données. 49 Chapitre 3. Configuration uodbc.max_links entier Nombre maximum de connexions (persistantes ou non), par processus, à la base de données. 50 Chapitre 4. Sécurité 51 Chapitre 4. Sécurité PHP est un langage puissant et l’interpréteur, qu’il soit inclus dans le serveur web ou bien compilé en version CGI, est capable d’accéder aux fichiers, d’exécuter des commandes et d’ouvrir des connexions réseaux. Toutes ces propriétés rendent fragile la sécurité d’un serveur web. Le langage PHP a été pensé afin d’être un langage beaucoup plus sécurisé pour écrire des CGI que le Perl ou le langage C. De plus, une sélection rigoureuse des options de compilation et d’exécution vous permettra d’obtenir un équilibre parfait entre liberté et sécurité. Etant donné qu’il y a de nombreux moyens d’utiliser le langage PHP, il y a de nombreuses directives de configuration afin d’en contrôler le comportement. Un grand nombre d’options permettent d’utiliser le PHP dans de nombreuses situations, mais cela signifie aussi qu’il y a certaines combinaisons d’options de compilation et d’exécution qui fragilisent la sécurité du serveur. Ce chapitre explique comme les différentes options de configurations peuvent être combinées, tout en conservant une sécurité maximum. La flexibilité de configuration de PHP est épaulée par la flexibilité du code. PHP peut être compilé pour constituer une application serveur complète, avec toutes les fonctionnalités d’un shell, ou il peut encore être utilisé comme simple SSI (server side include) avec peu de risque, dans un environnement à sécurité renforcée. Comment créer cet environnement et le sécuriser est largement à la charge du développeur PHP. Ce chapitre commence par expliquer les différentes options de configuration et les situations dans lesquelles elles peuvent être utilisées en toute sécurité. Puis, viennent les considérations de niveaux de sécurité, et les conseils généraux. Binaires CGI Faiblesses connues Utiliser le PHP comme un CGI exécutable vient la majorité du temps du fait que l’on ne veut pas l’utiliser comme un module du serveur web, (comme Apache), ou bien que l’on souhaite l’utiliser en combinaison d’un CGI complémentaire, afin de créer un environnement de script sécurisé (en utilisant des techniques de chroot ou setuid). Une telle décision signifie habituellement que vous installez votre exécutable dans le répertoire cgi-bin de votre serveur web. CERT CA-96.11 (http://www.cert.org/advisories/CA-96.11.interpreters_in_cgi_bin_dir.html) recommande effectivement de placer l’interpréteur à l’intérieur du répertoire cgi-bin. Même si le binaire PHP peut être utilisé comme interpréteur indépendant, PHP a été pensé afin de rendre impossible les attaques que ce type d’installation induit. • Accès au système de fichier: http://ma.machine/cgi-bin/php?/etc/passwd Lorsque la requête est passée dans une url, après le point d’interrogation (?), elle est envoyée à l’interpréteur comme une ligne de commande par l’interface CGI. Habituellement, l’interpréteur ouvre le fichier spécifié et l’exécute. Lorsqu’il est invoqué comme exécutable CGI, le PHP refuse d’interpréter les arguments de la ligne de commande. • Accès d’un document web sur le serveur : http://my.host/cgi-bin/php/secret/doc.html Le "path information" dans l’url, situé juste après le nom du binaire PHP, /secret/doc.html est utilisé par convention pour spécifier le nom du fichier qui doit être ouvert et interprété par le programe CGI. Habituellement, des directives de configuration du serveur web (pour le serveur Apache: Action) sont utilisées pour rediriger les requêtes afin d’obtenir un document http://my.host/secret/script.php par l’interpréteur PHP. Dans une telle configuration, le serveur web vérifie d’abord s’il a accès au répertoire /secret, et après cette vérification redirige la requête vers http://my.host/cgi-bin/php/secret/script.php. Malheureusement, si la requête est faite directement sous cette forme, aucune vérification d’accès n’est faite par le serveur web pour le fichier /secret/script.php, mais uniquement pour le fichier /cgi-bin/php. De cette manière, n’importe quel utilisateur qui peut accéder au fichier /cgi-bin/php peut aussi accéder aux documents protégés sur le serveur web. Avec le PHP, l’option de compilation --enable-force-cgi-redirect et les options d’exécution doc_root et user_dir peuvent être utilisées pour prévenir ce genre d’attaques, si des restrictions d’accès sont appliquées sur les documents du serveur. Voir ci-dessous pour des explications plus complètes sur les différentes combinaisons. Cas 1: Tous les fichiers sont publics Si votre serveur n’a aucun document dont l’accès est restreint par un mot de passe ou un système de vérification de l’adresse IP, vous n’avez aucun besoin de ce type de configuration. Si votre serveur web ne permet pas les redirections, ou si votre serveur web n’a aucun besoin de communiquer avec le binaire PHP de manière sécurisée, vous pouvez utiliser 52 Chapitre 4. Sécurité l’option de compilation --disable-force-cgi-redirect. Vous devez quand même vérifier qu’aucun script ne fait appel au PHP, de manière directe, http://my.host/cgi-bin/php/dir/script.php ou bien de manière indirecte, par redirection, http://my.host/dir/script.php. Les redirections peuvent être configurées dans les fichiers de configuration d’Apache en utilisant les directives "AddHandler" et "Action" (voir ci-dessous). Cas 2: Utilisation de la directive de compilation --enable-force-cgi-redirect Cette option de compilation prévient quiconque d’appeler directement un script avec l’url http://my.host/cgi-bin/php/secretdir/script.php. Dans ce cas là, PHP parsera le fichier uniquement s’il y a eu redirection. Habituellement, le serveur web Apache réalise une redirection grâce aux directives suivantes : Action.php-script /cgi-bin/php AddHandler.php-script .php Cette option a uniquement été testée avec Apache et compte sur Apache pour affecter la variable d’environnement non-standart REDIRECT_STATUS pour les requêtes redirigées. Dans le cas où votre serveur web ne supporte pas le renseignement du PHP, pour savoir si la requête a été redirigée ou non, vous ne pouvez pas utiliser cette option de compilation. Vous devez alors utiliser une des autres méthodes d’exploitation de la version binaire CGI du PHP, comme exposé ci-dessous. Cas 3: Utilisation du "doc_root" ou du "user_dir" Ajouter un contenu interactif dans votre serveur web, comme des scripts ou des exécutables, est souvent considéré comme une pratique non-sécurisée. Si, par erreur, le script n’est pas exécuté mais affiché comme une page HTML classique, il peut en résulter un vol de propriété intellectuelle ou des problèmes de sécurité à propos des mots de passe notamment. Donc, la majorité des administrateurs préfèrent mettre en place un répertoire spécial pour les scripts qui soit uniquement accessible par le biais du binaire CGI du PHP, et donc, tous les fichiers de ce répertoire seront interprétés et non affichés tels quels. Aussi, si vous ne pouvez pas utiliser la méthode présentée ci-dessus, il est nécessaire de mettre en place un répertoire "doc_root" différent de votre répertoire "document root" de votre serveur web. Vous pouvez utiliser la directive doc_root dans le fichier de configuration, ou vous pouvez affecter la variable d’environnement PHP_DOCUMENT_ROOT. Si cette variable d’environnement est affectée, le binaire CGI du PHP construira toujours le nom de fichier à ouvrir avec doc_root et le "path information" de la requête, et donc vous serez sÛr qu’aucun script n’est exécuté en dehors du répertoire prédéfini (à l’exception du répertoire désigné par la directive user_dir Voir ci-dessous). Une autre option possible ici est la directive user_dir. Lorsque la directive n’est pas activée, seuls les fichiers contenus dans le répertoire doc_root peuvent être ouverts. Ouvrir un fichier possédant l’url http://my.host/~user/doc.php ne correspond pas à l’ouverture d’un fichier sous le répertoire racine de l’utilisateur mais à l’ouverture du fichier ~user/doc.php sous le repertoire "doc_root" (oui, un répertoire commence par un tilde [~]). Si la directive "user_dir" est activée à la valeur public_php par exemple, une requête du type http://my.host/~user/doc.php ouvrira un fichier appelé doc.php sous le répertoire appelé public_php sous le répertoire racine de l’utilisateur. Si le répertoire racine des utilisateurs est /home/user, le fichier exécuté sera /home/user/public_php/doc.php. user_dir et doc_root sont deux directives totalement indépendantes et donc vous pouvez contrôler l’accès au répertoire "document root" séparément des répertoires "user directory". Cas 4: L’exécutable PHP à l’extérieur de l’arborescence du serveur Une solution extrêmement sécurisée consiste à mettre l’exécutable PHP à l’extérieur de l’arborescence du serveur web. Dans le répertoire /usr/local/bin, par exemple. Le problème de cette méthode est que vous aurez à rajouter la ligne suivante : #!/usr/local/bin/php 53 Chapitre 4. Sécurité dans tous les fichiers contenant des tags PHP. Vous devrez aussi rendre le binaire PHP exécutable. Dans ce cas-là, traitez le fichier exactement comme si vous aviez un autre script écrit en Perl ou en sh ou en un autre langage de script qui utilise #! comme mécanisme pour lancer l’interpréteur lui-même. Pour que l’exécutable PHP prenne en compte les variables d’environnement PATH_INFO et PATH_TRANSLATED correctement avec cette configuration, vous devez utiliser l’option de compilation --enable-discard-path. Module Apache Lorsque le PHP est compilé en tant que module Apache, ce module hérite des permissions accordées à l’utilisateur faisant tourner Apache ( par défaut, l’utilisateur "nobody"). Par exemple, si vous utilisez PHP pour accéder à une base de données, à moins que la base n’ait un système de droits d’accès interne, vous devrez rendre la base accessible à l’utilisateur "nobody". Cela signifie qu’un script mal intentionné peut accéder à la base, la modifier sans authentification. Il est aussi possible qu’un robot accède à la page d’administration, et détruise toutes les pages. Vous devez aussi protéger vos bases de données avec les autorisations Apache, ou définir votre propre modèle d’accès avec LDAP, .htaccess, etc... et inclure ce code dans tous vos scripts PHP. Souvent, lorsqu’on a établi les droits de l’utilisateur PHP (ici, l’utilisateur Apache) pour minimiser les risques, on s’aperçoit que PHP ne peut plus écrire des virus dans les fichiers des utilisateurs. Ou encore, de modifier une base de données privée. Il est aussi incapable de modifier des fichiers qu’il devrait pouvoir modifier, ou effectuer certaines transactions. Une erreur fréquente de sécurité est de donner à l’utilisateur Apache les droits de superadministrateur. Donner de telles permissions à l’utilisateur Apache est extrêmement dangereux, et peut compromettre tout le système, telle que l’utilisation des sudo ou du chroot. Pour les professionnels de la sécurité, une telle utilisation est à exclure d’office. Sécurité des fichiers PHP est soumis aux règles de sécurité intrinsèques de la plupart des systèmes serveurs : il respecte notamment les droits des fichiers et des dossiers. Une attention particulière doit être portée aux fichiers ou dossiers qui sont accessibles à tout le monde, afin de s’assurer qu’ils ne divulguent pas d’informations critiques. Puisque PHP a été fait pour permettre aux utilisateurs d’accéder aux fichiers, il est possible de créer un script qui vous permet de lire des fichiers tels que /etc/password, de modifier les connexions ethernet, lancer des impressions de documents, etc... Cela implique notamment que vous devez-vous assurer que les fichiers accédés par les scripts sont bien ceux qu’il faut. Considérez le script suivant, où l’utilisateur indique qu’il souhaite effacer un fichier dans son dossier racine. Nous supposons que PHP est utilisé comme interface web pour gérer les fichiers, et que l’utilisateur Apache est autorisé à effacer les fichiers dans le dossier racine des utilisateurs. Exemple 4-1. Une erreur de vérification de variable conduit à ... <?php // efface un fichier dans un dossier racine $username = $user_submitted_name; $homedir = "/home/$username"; $file_to_delete = "$userfile"; unlink ($homedir/$userfile); echo "$file_to_delete a été effacé!"; ?> Etant donné que le nom de l’utilisateur est à fournir, des intrus peuvent envoyer un nom d’utilisateur autre que le leur, et effacer des documents dans les comptes des autres utilisateurs. Dans ce cas, vous souhaiterez utiliser une autre forme d’authentification. Considérez ce qui pourrait se passer si les utilisateurs passent "../etc/" et "passwd" comme arguments! Le code serait éxécuté tel que : 54 Chapitre 4. Sécurité Exemple 4-2. Une attaque du système de fichiers! <?php // efface un fichier n’importe où sur le disque dur, // où l’utilisateur PHP a accès. Si PHP a un accès root : $username = "../etc/"; $homedir = "/home/../etc/"; $file_to_delete = "passwd"; unlink ("/home/../etc/passwd"); echo "/home/../etc/passwd" has been deleted!"; ?> Il y a deux mesures primordiales à prendre pour éviter ces manoeuvres : • Limiter les permissions du l’utilisateur web PHP. • Vérifier toutes les variables liées aux chemins et aux fichiers qui sont fournie. Voici le script renforcé : Exemple 4-3. Une vérification renforcée <?php // Efface un fichier sur le disque où l’utilisateur à le droit d’aller $username = get_env("REMOTE_USER"); // utilise un mécanisme d’authentification $homedir = "/home/$username"; $file_to_delete = basename("$userfile"); // supprime le chemin excédentaire unlink ($homedir/$file_to_delete); $fp = fopen("/home/logging/filedelete.log","+a"); //note l’effacement $logstring = "$HTTP_REMOTE_USER $homedir $file_to_delete"; fputs ($fp, $logstring); fclose($fp); echo "$file_to_delete a été éffacé!"; ?> Vous pouvez-vous protéger avec une vérification telle que : Exemple 4-4. Vérification de noms de fichier sécurisée <?php $username = $HTTP_REMOTE_USER; $homedir = "/home/$username"; if (!ereg(’^[^./][^/]*$’, $userfile)) die(’Erreur de nom de fichier’); //meurt, ne pas traiter! //etc... ?> Suivant votre système d’exploitation, vous devrez protéger un grand nombre de fichiers, notamment les entrées de périphériques, (/dev/ ou COM1), les fichiers de configuration (fichiers /etc/ et .ini), les lieux de stockages d’informations (/home/, My Documents), etc. Pour cette raison, il est généralement plus sÛr d’établir une politique qui interdit TOUT sauf ce que vous autorisez. Rapport d’erreur Une tactique d’attaque standard consiste à faire faire des erreurs au système, et lire les variables d’environnement et de contexte qui sont retournées. Cela permet au pirate de lire de nombreuses informations sur le serveur, et de détecter des faiblesses du serveur. Les erreurs PHP qui sont normalement retournées peuvent être très pratiques pour un développeur qui essaie de débugger un script, car elles donnent de précieux renseignements tels que quelle fonction a échoué, quel fichier n’a pas été trouvé, 55 Chapitre 4. Sécurité quel script PHP a buggé, et quelle ligne est en faute. Toutes ces informations sont exploitables. Il est commun aux développeurs PHP d’utiliser les fonctions show_source(), highlight_string(), ou highlight_file() comme outils de débuggage, mais sur un site en production, cela expose des variables cachées, des syntaxes non vérifiées ou d’autres informations dangereuses. Par exemple, le style d’erreur indique sur quel système PHP fonctionne. Si un pirate affiche une page html, et essaye de la tester (pour rechercher des faiblesses du système), il peut déterminer sur quel système PHP a été compilé. Une erreur de fonction indique si un système supporte une base de données spécifique, ou bien indique comment la page a été générée. Cela peut orienter l’intrus vers les ports de cette base de données ou bien vers une attaque liée à cette application. En envoyant des données erronées, par exemple, un pirate peut déterminer l’ordre d’authentification dans un script (à partir des lignes d’erreurs), et d’essayer de les exploiter ailleurs, dans le script. Une erreur de fichier, ou une erreur générale PHP peut indiquer quelles sont les permissions du serveur web, ainsi que la structure et l’organisation des fichiers. Les gestionnaires d’erreurs utilisateurs peuvent aussi aggraver ce problème, en permettant l’exploitation facile d’informations préalablement cachées. Il y a trois solutions majeures à ces problèmes : la première est de scruter toutes les fonctions, et essayer de traiter toutes les erreurs. La deuxième est d’inactiver le rapport d’erreur, dès que le script est en production. La troisième est d’utiliser les fonctions de gestions des erreurs. Suivant votre politique de sécurité, vous pouvez utiliser un panachage savant des trois méthodes. Données transmises par les internautes Les plus grandes faiblesses de nombreux programmes PHP ne viennent pas du langage lui-même, mais de son utilisation en omettant les caractéristiques de sécurité. Pour cette raison, vous devez toujours prendre le temps de prendre en compte les implications d’une fonction, et de cerner toutes les applications d’une utilisation exotiques des paramètres. Exemple 4-5. Utilisation dangereuse de variables <?php // efface un fichier à la racine d’un utilisateur... ou peut être // de quelqu’un d’autre? unlink ($evil_var); // Note l’accès de ce fichier ... ou pas? fputs ($fp, $evil_var); // Exécute une commande triviale... ou pas? system ($evil_var); exec ($evil_var); ?> Il est vivement recommandé d’examiner minutieusement votre code pour vous assurer qu’il n’y a pas de variables envoyées par le client web, et qui ne sont pas suffisamment vérifiées avant utilisation. • Est-ce que ce script n’affectera que les fichiers prévus? • Est-il possible que des valeurs incohérentes soient exploitées ici? • Est-ce que ce script peut être utilisé dans un but différent? • Est-ce que ce script peut être utilisé malicieusement, en conjonction avec d’autres? • Est-ce que toutes les actions seront notées? En répondant de manière adéquate à ces questions lors de l’écriture de vos scripts (plutôt qu’après), vous éviterez une réécriture inopportune pour raison de sécurité. En commençant vos projets avec ces recommandations en tête, vous ne garantirez pas la sécurité de votre système, mais vous contribuerez à l’améliorer. Vous pouvez aussi envisager de supprimer l’acquisition automatique des variables d’environnement, les guillemets magiques (magic_quotes), ou encore toute option qui pourrait vous conduire à mésévaluer la validité, la source ou la valeur d’une variable. En travaillant avec error_reporting(E_ALL), vous pouvez être averti que certaines variables sont utilisées avant d’être exploitées, ou vérifiées (et donc, vous pourrez traiter des valeurs exotiques à la source). 56 Chapitre 4. Sécurité Considérations générales Un système complètement sécurisé est virtuellement impossible. De ce fait, une approche qui équilibre les risques et l’ergonomie est souvent retenue. Si toutes les variables envoyées par l’utilisateur nécessitaient deux formes d’identification biométriques (comme par exemple un scanner de la rétine, et une empreinte digitale), vous pourriez avoir un niveau de sécurité élevé. Cela prendrait aussi une demi-heure pour remplir les conditions de sécurité, ce qui pousserait les utilisateurs à éviter d’utiliser votre système. La meilleure sécurité est celle qui protège votre système, sans empêcher les utilisateurs de faire leur travail. En général, les attaques exploitent des trous de sécurité entre diverses couches d’identification : cet empilement devient trop complexe, et finalement, peu fiable. Une phrase qui vaut la peine d’être retenue : un système est aussi fiable que son maillon le plus faible. Si toutes les transactions sont exhaustivement notées (heure, lieu, type, etc...) mais que l’utilisateur n’est authentifié que par un cookie, la validité de votre système de surveillance est intimement liée à la validité du cookie (et donc, sévèrement réduite). Lors de vos tests, gardez à l’esprit que vous ne pourrez pas tester toutes les configurations, mais probablement les plus simples. Les données en entrées auxquelles vous pouvez vous attendre ne seront rien comparées aux données incohérentes d’un employé négligent, un pirate disposant d’autant de temps qu’il veut, ou du chat de la maison marchant sur le clavier. Il est donc bon de regarder le code logiquement, de chercher où des données incohérentes peuvent être introduites, modifiées, réduites ou amplifiées. L’Internet est rempli de personnes qui tentent de se faire une renommée en piratant vos programmes, en bloquant votre site, en envoyant des contenus inappropriés, qui rendent vos journées si "spéciales". Peut importe que vous ayez un grand portail ou un petit web, vous pouvez être la cible pour tout quidam avec une connexion. Vous êtes une cible potentielle dès que vous êtes connecté vous-même. Certains programmes de piratage ne font pas dans la demi-mesure, et testent systématiquement des millions d’IP, à la recherche de victimes : ne soyez pas la prochaine. Etre à jour PHP, comme de nombreux systèmes de grande taille, est constamment testé et amélioré. Chaque nouvelle version rassemble des modifications majeures et mineures, aussi bien pour renforcer la sécurité, que pour réparer les problèmes de conceptions de configuration, et d’autres points qui peuvent affecter la sécurité globale et la stabilité de votre système. Comme les autres langages de scripts systèmes, la meilleure approche est de mettre à jour souvent PHP, et de rester à l’écoute des dernières versions et des modifications qu’elles apportent. 57 Partie II. Référence Chapitre 5. La syntaxe de base 58 Chapitre 5. La syntaxe de base Le passage du HTML au PHP Lorsque PHP commence à traiter un fichier, il ne fait qu’afficher le texte HTML qu’il rencontre. Si vous renommez un fichier .html en .php, il fonctionnera exactement comme avant. Si vous voulez insérer des commandes PHP dans votre fichier, vous devez indiquer à PHP le début d’une telle séquence, en passant en mode PHP. Il y a quatre moyens pour passer du mode HTML au mode PHP : Exemple 5-1. Le passage du HTML au PHP 1. <? echo ("Ceci est un exemple d’affichage à l’écran en PHP, sous forme d’expression SGML.\n"); ?> <?= expression ?> Raccourci de "<? echo expression ?>" 2. <?php echo("Si vous voulez afficher du XML ou du XHTML, faites comme ceci.\n"); ?> 3. <script language="php"> echo ("Certains éditeurs HTML (comme FrontPage) n’acceptent pas les expressions telles que celle-ci."); </script> 4. <% echo ("Vous pouvez aussi utiliser le style ASP comme délimiteur."); %> <%= $variable; # ceci est un raccourci pour "<%%echo .." %> La deuxième méthode est généralement utilisée, car elle permet une implémentation aisée de PHP avec la prochaine génération de XHTML. La première possibilité n’est valable que si vous l’avez activée. Soit en faisant appel à la fonction short_tags() (NdT : semble avoir disparu), soit en utilisant l’option d’exécution short_open_tag dans le fichier de configuration, soit en utilisant l’option de compilation --enable-short-tags. La quatrième possibilité est seulement disponible si vous l’avez activée en utilisant soit l’option d’exécution asp_tags, soit en utilisant l’option de compilation --enable-asp-tags. Note : Le support de la quatrième possibilité, ASP-style, a été ajouté dans la version 3.0.4. La marque de fermeture d’un bloc (?>) comprend la nouvelle ligne suivante, s’il y en a une. PHP vous permet d’utiliser des structures telles que : Exemple 5-2. Méthode avancée <?php if ( boolean-expression ) { ?> <strong>Ceci est vrai.</strong> <?php } else { ?> <strong>Ceci est faux.</strong> <?php } ?> Cela fonctionne comme on peut s’y attendre, car PHP traite le texte entre ?> et <?php comme une fonction echo(), sans remplacer les variables éventuelles par leur valeur. 59 Chapitre 5. La syntaxe de base Le séparateur d’instruction Les instructions sont séparées comme en C ou en Perl par un point virgule à chaque fin d’instruction. La balise de fin (?>) implique la fin d’un instruction, et donc ajoute implicitement un point virgule. Les deux exemples suivants sont équivalents. <?php echo "Ceci est un test"; ?> <?php echo "Ceci est un test" ?> Commentaires Le PHP supporte les commentaires comme en C, C++ et Shell Unix. Par exemple: <?php echo "Ceci est un test"; // Ceci est un commentaire sur une ligne comme en C++ /* Ceci est un commentaire sur plusieurs lignes, comme en C et C++ */ echo "Ceci est encore un test"; echo "Enfin, le test final"; # Ceci est un commentaire comme en Shell Unix ?> Le premier type de commentaire ne commente que jusqu’à la fin de la ligne ou bien jusqu’à la fin du bloc, cela dépend du premier rencontré. <h1>Ceci est un <?php echo "simple";?> exemple.</h1> <p> La ligne du dessus affichera ’Ceci est un simple exemple’. Faites attention à ne pas emboîter les commentaires de type ’C’, ce qui arrive de temps en temps lorsque vous voulez commenter une grande partie de code. <?php /* echo "Ceci est un test"; /* Ce commentaire va poser un problème */ */ ?> 60 Chapitre 6. Les types 61 Chapitre 6. Les types Introduction PHP supporte les 8 types basiques suivants : PHP supporte quatres types scalaires : • booléen • entier • nombre à virgule flottante • chaîne de caractères PHP supporte deux types composés : • tableau • objet PHP supporte deux types spéciaux : • ressource • null Note : Dans ce manuel, vous rencontrerez souvant le type mixed. C’est un pseudo-type, qui indique que le paramètre peut indifféremment prendre plusieurs types. Habituellement, le type d’une variable n’est pas déclaré par le programmeur. Il est décidé au moment de l’exécution par le PHP, en fonction du contexte dans lequel la variable est utilisée. Si vous voulez forcer une variable à être convertie en un certain type, vous devez transtyper (cast) la variable ou utiliser la fonction settype(). Il est à noter qu’une variable peut se comporter de manière différente suivant les situations, en fonction du type qui lui est affecté. Pour plus d’informations, voir le paragraphe transtypage. Booléens C’est le type le plus simple. Un booléen exprime les valeurs de vrai TRUE ou FALSE. Vous pouvez utiliser les constantes ’TRUE’ et ’FALSE’ pour spécifier une valeur de type boolean. Généralement, vous les créerez avec un des operateurs qui retourne une valeur boolean, pour le passer à une structure de contrôle. <?php if ($action == "show_version"){ // == is an operator // qui retourne un booléen echo "La version est 1.23"; } // ceci n’est pas nécessaire if ($show_separators == true){ echo "<hr>\n"; } // ceci est plus pratique if ($show_separators){ echo "<hr>\n"; } ?> 62 Chapitre 6. Les types Note : Le type booéen a été introduit en PHP 4. Conversion en booléen Reportez-vous au chapitre "Définition du type" pour plus d’informations sur les conversions. Lors des conversions de valeurs de type boolean, les valeurs suivantes sont considérées comme fausse (FALSE) : • Le booléen FALSE • L’entier 0 (zéro) • Le nombre à virgule flottante 0.0 (zéro) • La chaîne vide, et la chaîne "0" • Le tableau vide (aucun élément) • L’objet vide (aucun élément) • La constante spéciale NULL Toutes les autres valeurs sont considérées comme vraies (TRUE (y compris les ressources). Avertissement -1 est considéré comme vrai! Entiers Un entier est un nombre de l’ensemble des entiers naturels Z : Z = {...., -2, -1, 0, 1, 2, ...}. Il est possible de spécifier les nombres entiers (integers) de toutes les manières suivantes : décimale (base 10), hexadécimale (base 16), octale (base 8) éventuellement précédé du signe moins (-). Pour utiliser la notation octale, vous devez préfixer le nombre avec un zéro; pour utiliser la notation hexadécimale, vous devez préfixer le nombre avec 0x. <?php $a = $a = $a = $a = 1234; -123; 0123; 0x12; # # # # # nombre entier nombre entier nombre entier nombre entier (équivalent à en base 10 négatif en base 8, octale (équivalent à 83 en base 10) en base 16, hexadécimale 18 en base 10) ?> La taille des entiers dépend de la plate-forme de support, mais la valeur maximale est généralement de 2 milliards et des poussières (c’est un entier signé de 32 bits). PHP ne supporte pas les entiers non signés. Note : En PHP, il n’existe pas de type fraction. 1/2 se transforme en nombre à virgule flottante 0.5. Dépassement de capacité des entiers Si un nombre est hors de l’intervalle de validité des entiers, il sera interprété comme un float. <?php $large_number = 2147483647; var_dump($large_number); // affiche : int(2147483647) 63 Chapitre 6. Les types $large_number = 2147483648; var_dump($large_number); // affiche : float(2147483648) ?> De même, si une fonction ou un opérateur retourne un entier qui est hors des limites de validité des entiers, il sera aussi automatiquement converti en float. <?php $million = 1000000; $large_number = 50000 * $million; var_dump($large_number); // affiche : float(50000000000) ?> Avertissement Malheureusement, il y a un bug dans le moteur (toujours présent en 4.0.6 et probablement résolu en 4.0.7) ce qui fait que PHP que fonctionne pas toujours bien lorsque des nombres négatifs sont utilisés. Lorsque les deux opérandes sont positifs, il n’y a pas de problèmes. Par exemple : -50000 * $million, conduit à -429496728. Conversion en entiers Pour explicitement convertir une valeur en integer, utilisez les opérateurs de transtypage (int) ou (integer). Cependant, dans la plupart des situations, vous n’en aurez pas besoin, car une valeur sera automatiquement convertie si un opérateur, un fonction ou tout autre élément du langage requiert un entier. Reportez-vous à la section définition de type pour plus d’informations sur les conversions. Depuis un booléen FALSE devient 0 (zéro), et TRUE devient 1 (un). Depuis un nombre à virgule flottante Lors de conversion entre nombre à virgule flottante et un entier, le nombre sera arrondi à la valeur inférieure s’il est positif, et supérieure s’il est négatif (conversion dite ’vers zéro’). Si le nombre est hors de l’intervalle de validité des entiers, (généralement +/- 2.15e+9 = 2^31), le résultat est indéfinit, car les nombres à virgules flottante n’ont pas assez de précision pour fournir une valeur exacte pour un entier. Avertissement Aucune alerte, même pas le plus petit message ne sera affiché dans ce cas. Avertissement Ne transformez jamais une fraction inconnue en entier, car cela peut conduire à des résultats irrationnels. <?php echo (int) ( (0.1+0.7) * 10 ); // affiche 7! ?> Pour plus d’informations, reportez-vous aux alertes liées aux nombres à virgule flottante. 64 Chapitre 6. Les types From strings Reportez-vous à la section des conversions de chaînes. Conversion d’autres types La conversion d’autres types en entier est indéfinie. Actuellement, PHP convertit d’abord la valeur en booléen. Attention Mais, ne vous fiez pas à ce comportement, car il est susceptible de changer sans préavis! Voir aussi : Nombres de grande taille et Nombres à virgules flottantes. Les nombres à virgule flottante Les nombres à virgule flottante (connus aussi sous le vocable de "double" ou "float" "nombre rééls") peuvent être spécifiés en utilisant la syntaxe suivante: <?php $a = 1.234; $a = 1.2e3; ?> Précision des nombres à virgule flottante Il est fréquent que de simples fractions décimales telles que 0.1 ou 0.7 ne puissent être converties au format interne binaire sans une légère perte de précision. Cela peut conduire à des résultats étonnants : par exemple, floor((0.1+0.7)*10) retournera 7 au lieu de 8 car le résultat de la représentation interne est 7.9999999999.... Tout ceci est lié au fait qu’il est impossible d’exprimer certaines fractions en un nombre fini de chiffres. Par exemple 1/3 s’écrira 0.3333333... en mode décimal. Ne faites donc jamais confiance aux nombres à virgule jusqu’à leur dernière décimale, et ne comparez jamais ces nombres avec l’opérateur d’égalité. Si vous avez besoin d’une précision particulière, reportez-vous au traitement des nombres de grande taille avec les librairies BC ou GMP. Les chaînes de caractères Les chaînes de caractères sont des séquences de caractères. En PHP, un caractère est un octet, et il y en 256 de possibles. PHP n’a pas (encore?) de support natif d’Unicode. Note : La taille n’est pas un problème majeur pour une chaîne. Elle peut devenir très grande sans problème. Il n’y a a pas à s’en faire pour cela. Syntax Une chaîne peut être spécifiée de trois manières différentes : • guillemets simples • guillemets doubles • syntaxe HereDoc 65 Chapitre 6. Les types guillemets simples Le moyen le plus simple de spécifier une chaîne de caractères est d’utiliser les guillemets simples : ’. Pour spécifier un guillemet simple littéral, vous devez l’échapper avec un anti-slash (\), comme dans de nombreux langages. Si un anti-slash doit apparaître dans votre chaîne ou bien en fin de chaîne, il faudra le doubler. Notez que si vous essayez d’échapper n’importe quel autre caractère, l’anti-slash sera conservé! Il n’y a pas besoin d’échapper d’autres caractères que le guillemets lui-même. Note : En PHP 3, une alerte sera affichée si cela arrive avec un niveau de rapport d’erreur de E_NOTICE. Note : Contrairement aux autres syntaxes, les variables présentes dans la chaîne ne seront PAS remplacées par leurs valeurs. <?php echo ’Ceci est une chaîne simple’; echo ’Vous pouvez inclure des nouvelles lignes dans une chaîne, comme ceci.’; echo ’Arnold a coutume de dire : "I\’ll be back"’; // affiche : ... "I’ll be back" echo ’Etes vous sÛr de vouloir effacer le dossier C:\\*.*?’; // affiche : Etes vous sÛr de vouloir effacer le dossier C:\*.*? echo ’Etes vous sÛr de vouloir effacer le dossier C:\*.*?’; // affiche : Etes vous sÛr de vouloir effacer le dossier C:\*.*? echo ’Je suis en train de mettre une nouvelle ligne comme ceci : \n’; // affiche : Je suis en train de mettre une nouvelle ligne comme ceci : \n ?> Guillemets doubles Si la chaîne est entourés de guillemets doubles, PHP va comprendre certaines séquences de caractères : Tableau 6-1. Les caractères spéciaux Séquence Valeur \n Nouvelle ligne (linefeed, LF ou 0x0A (10) en ASCII) \r Retour à la ligne(carriage return, CR ou 0x0D (13) en ASCII) \t Tabulation horizontale (HT ou 0x09 (9) en ASCII) \\ Antislash \$ Caractère $ \" Guillemets doubles \[0-7]{1,3} Une séquence de caractères qui permet de rechercher un nombre en notation octale. \x[0-9A-Fa-f]{1,2} Une séquence de caractères qui permet de rechercher un nombre en notation hexadécimale. Si vous essayez d’utiliser l’anti-slash sur n’importe quelle autre séquence, l’anti-slash sera affiché dans votre chaîne. Le plus important des chaînes à guillemets doubles est le fait que les variables qui s’y trouvent seront remplacées par leurs valeurs. Voir la section sur le traitement des variables dans les chaînes pour plus de détails. Syntaxe Heredoc Un autre moyen de délimiter les chaînes est d’utiliser la syntaxe de "Here doc" (en français, documentation ici): <«, suivi d’un identifiant arbitraire, puis de la chaîne. Cette séquence se termine par l’identifiant initial, placé en premier sur une 66 Chapitre 6. Les types nouvelle ligne. L’identifiant utilisé doit suivre les mêmes règles que les étiquettes PHP : il ne doit contenir uniquement que des caractères alpha-numériques, et des soulignés ("_"), et enfin, commencer par un caractère alphabétique ou un souligné. Avertissement Il est très important de noter que la ligne qui contient l’identifiant de fermeture ne doit contenir aucun autre caractère, hormis, éventuellement, un point-virgule ;. Cela signifie notamment que l’identifiant ne doit pas être indenté, et qu’il n’y a aucun caractère blanc entre le retour à la ligne et l’identifiant, ou bien entre l’identifiant et le ;. Le plus dur est peut être qu’il ne faut pas qu’il y ait un retour à la ligne ((\r) à la fin de cette ligne, mais seulement un form-feed (\n). Puisque Microsoft Windows utilise la séquence \r\n comme terminaison de ligne, la syntaxe heredoc risque de ne pas fonctionner là. Cependant, la plupart des éditeurs PHP fournissent une sauvegarde au format UNIX. La syntaxe Here doc se comporte exactement comme une chaîne à guillemets doubles, sans les guillemets doubles. Cela signifie que vous n’avez pas à échapper les guillemets (simples ou doubles) dans cette syntaxe. Les variables sont remplacées par leur valeur, et le même soin doit leur être apporté que dans les chaînes à guillemets doubles. Exemple 6-1. Exemple de chaîne HereDoc <?php $str = <«EOD Exemple de chaîne s’étalant sur plusieurs lignes avec la syntaxe heredoc EOD; /* Exemple plus complexe, avec des variables. */ class foo { var $foo; var $bar; function foo() { $this->foo = ’Foo’; $this->bar = array(’Bar1’, ’Bar2’, ’Bar3’); } } $foo = new foo(); $name = ’MonNom’; echo <«EOT Mon nom est "$name". J’affiche des $foo->foo. Maintenant, j’affiche un {$foo->bar[1]}. Ceci se traduit par un ’A’ majuscule: \x41 EOT; ?> Note : Le support Here doc a été ajouté en PHP 4. Traitement des variables dans les chaînes Lorsqu’une chaîne est spécifiée avec des guillemets doubles, ou en utilisant la syntaxe heredoc, les variables qu’elle contient sont remplacées par leur valeur. Il y a deux types de syntaxe, une simple et une complexe. La syntaxe simple est la plus courante, et la plus pratique : elle fournit un moyen d’utiliser les variables, que ce soit des chaînes, des tableaux ou des membres d’objets. La syntaxe complexe a été introduite en PHP 4 et peut être reconnue grâce aux accolades entourant les expressions. 67 Chapitre 6. Les types Syntaxe simple Dès qu’un signe dollar $ est rencontré, l’analyseur PHP va lire autant de caractère qu’il peut pour former un nom de variable valide. Entourez le nom de la variable avec des accolades pour indiquer explicitement son nom. <?php $boisson = ’vin’; echo "Du $boisson, du pain et du fromage!’; // OK, car "," n’est pas autorisé dans les noms de variables echo "Il a goÛté plusieurs $vins"; // Pas OK, car ’s’ peut entrer dans un nom de variable, et PHP recherche $boissons echo "Il a goÛté plusieurs ${vin}s"; // OK ?> Similairement, vous pouvez aussi utiliser un élément de tableau, ou un membre d’objet. Pour les éléments de tableau, le crochet fermant ’]’ marquera la fin du nom de la variable. Pour les membres d’objets, les mêmes règles que ci-dessus s’appliquent. Cependant, il n’existe pas de truc comme pour les variables simples. $fruits = array( ’fraise’ => ’rouge’ , ’banane’ => ’jaune’ ); echo "Une banane est $fruits[banane]."; // OK echo "Ce carré est large de $carre->largeur mètres."; // OK echo "Ce carré est large de $carre->largeur00 mètres.."; // pas OK // pour résoudre ce problème, voyez syntaxe complexe. Pour tout ce qui sera plus compliqué, voyez la syntaxe complexe. Syntaxe complexe La syntaxe est dite "complexe" car elle permet l’utilisation d’ expressions complexes, et non pas parcequ’elle serait obscure. Nuance. En fait, vous pouvez inclure n’importe quelle valeur qui est dans l’espace de nom avec cette syntaxe. Il suffit d’écrire une expression exactement comme si elle était hors de la chaîne, puis de l’entourer d’accolades {}. Puisque vous ne pouvez pas échapper les accolades, cette syntaxe ne commence qu’à partir du signe dollar, qui suit immédiatement l’accolade ouvrante. Par exemple, vous pouvez utiliser "{\$" pour obtenir un "{$" littéral. Voici quelques exemples : <?php $super = ’fantastique’; echo "C’est { $super}"; // ne fonctionne pas, // affiche "C’est { fantastique}" echo "C’est {$super}"; // fonctionne, // affiche "C’est fantastique" echo "Ce carré a {$square->width}00 centimètres de large."; echo "Ceci fonctionne : {$tableau[4][3]}"; echo "Ceci échoue : {$tableau[foo][3]}"; // pour la même raison que $tableau[bar] ne fonctionne pas hors d’une chaîne echo "Essayez plutôt comme ceci : {$tableau[’foo’][3]}"; echo "Vous pouvez même écrire {$objet->valeurs[3]->nom}"; echo "Voici la valeur de la variable nommée $name: {${$name}}"; // cela fonctionne, mais c’est vivement déconseillé. // Et pour finir, on peut combiner avec des fonctions $inv = ’Bordeaux’; echo "Je reprendrai bien un verre de cet excellent {${ strrev(’niv’) }}, hips"; ?> 68 Chapitre 6. Les types Accès aux caractères d’une chaîne Les caractères d’une chaîne sont accessibles en spécifiant leur offset (le premier caractère est d’offset 0) entre accolade, après le nom de la variable. Note : Pour assurer la compatibilité ascendante, vous pouvez toujours accéder aux caractères avec des crochets. Mais cette syntaxe est obsolète en PHP 4. Exemple 6-2. Exemples de chaînes <?php /* Affectation d’une chaîne. */ $str = "Ceci est une chaîne"; /* Concaténation. */ $str = $str . " avec un peu plus de texte"; /* Une autre méthode de concaténation. */ $str .= " et une nouvelle ligne à la fin.\n"; /* Cette chaîne finira comme : ’<p>Nombre: 9</p>’ */ $num = 9; $str = "<p>Nombre: $num</p>"; /* Celle-ci sera ’<p>Nombre: $num</p>’ */ $num = 9; $str = ’<p>Nombre: $num</p>’; /* Premier caractère d’une chaîne */ $str = ’Ceci est un test.’; $first = $str{0}; /* Dernier caractère d’une chaîne. */ $str = ’This is still a test.’; $last = $str{strlen($str)-1}; ?> Fonctions et opérateurs pratiques Les chaînes peuvent être concaténées avec l’opérateur ’.’ (point). Notez que l’opérateur d’addition ’+’ (plus) ne fonctionnera pas. Reportez-vous à la section opérateurs de chaînes. Il y a une grande quantité de fonctions pratiques pour modifier les chaînes. Reportez-vous à la section chaînes de caractères pour les fonctions les plus générales, à Expressions régulières Perl et Expressions régulières POSIX extendues pour les recherches et remplacements. Il y a aussi les fonctions sur les URL, ainsi que des fonctions de chiffrage (mcrypt et mhash). Finalement, si vous ne trouvez toujours pas votre bonheure, il y a les fonctions de types de caractères. Conversion de type Lorsqu’une chaîne de caractère est évaluée comme une valeur numérique, le résultat et le type de la variable sont déterminés comme suit. La chaîne de caractères est de type "double" si elle contient un des caractère ’.’, ’e’ ou ’E’. Sinon, elle est de type entier ("integer"). La valeur est définie par la première partie de la chaîne. Si la chaîne de caractères débute par une valeur numérique cette valeur sera celle utilisée. Sinon, la valeur sera égale à 0 (zéro). Lorsque la première expression est une chaîne de caractères, le type de la variable dépend de la seconde expression. <?php $foo = 1 + "10.5"; // $foo est du type float (11.5) 69 Chapitre 6. Les types $foo $foo $foo $foo $foo $foo $foo = = = = = = = 1 + "-1.3e3"; 1 + "bob-1.3e3"; 1 + "bob3"; 1 + "10 Small Pigs"; 1 + "10 Little Piggies"; "10.0 pigs " + 1; "10.0 pigs " + 1.0; // // // // // // // $foo $foo $foo $foo $foo $foo $foo est est est est est est est du du du du du du du type type type type type type type float (-1299) integer (1) integer (1) integer (11) integer (11) integer (11) float (11) ?> Pour plus d’informations sur les conversions de type, voir les pages de man à propos de la fonction strtod(3). Si vous voulez testez l’un des exemples de cette section, vous pouvez faire un copier/coller et l’insérer dans un script pour voir comment il se comporte. <?php echo "\$foo==$foo; type is " . gettype( $foo ) . "<br>\n"; ?> Les tableaux Un tableau PHP est en fait une association ordonnée (map). Une association est un type qui fait correspondre des valeurs à des clés. Ce type est optimisé de diverses façons, qui font que vous pouvez le manipuler comme un tableau à indices réels, une liste (vecteur), ou un table de hachage (qui est une implémentation d’association), dictionnaire, collection, pile, queue et encore d’autres. Comme une valeur peut elle-même être un tableau, vous pouvez simuler facilement un arbre. Les détails d’implémentation de ces structures sont hors du champs de ce manuel, mais vous trouverez ici un exemple de toutes ces structures. Syntaxe Créer un tableau array() Un tableau array peut être créé avec la fonction array(). Cette fonction prend en argument des structures key => value, séparées par des virgules. Une clé key est soit un entier positif ou bien une chaîne. Si une clé est la représentation standard d’un entier positif, elle sera interprété comme tel. (i.e. ’8’ sera interprété comme 8, tandis que ’08’ sera interprété comme ’08’). Une valeur peut être n’importe quoi. Omettre des clés Si vous omettez une clé lors de la spécification d’un tableau, l’indice maximum + 1 sera utilisé comme clé par défaut. Si aucun indice numérique n’a été généré, ce sera 0. Si vous spécifiez une qui a déjà été assigné, la nouvelle valeur écrasera la précédente. array( [key =>] value , ... ) // key is either string ou entier integer positif // value peut être n’importe quoi 70 Chapitre 6. Les types La syntaxe à crochets Vous pouvez aussi modifier un tableau existant en lui assignant simplement des valeurs. L’assignement de valeurs de tableau se fait en spécifiant la clé entre crochets. Si vous omettez la clé ("$tableau[]"), la valeur sera ajoutée à la fin du tableau. $arr[key] = value; $arr[] = value; // key est soit une chaîne, soit un entier // value peut être n’importe quoi Si $arr n’existe pas, il sera créé. Cela en fait une alternative pour créer un tableau. Pour modifier une valeur, assignez lui une nouvelle valeur. Pour supprimer une valeur, utilisez la fonction unset(). Fonctions pratiques Il y a toute une panoplie de fonctions pratiques pour travailler avec les tableau : array-functions. L’élément de langage foreach est spécifiquement dédiée aux tableau : elle permet de passer en revue simplement les valeurs d’un tableau. Exemples Le type tableau de PHP est très souple. Voici quelques exemples d’utilisation : <?php // ceci $a = array( ’couleur’ => ’rouge’ , ’gout’ => ’sucre’ , ’forme’ => ’rond’ , ’nom’ => ’pomme’ , 4 // cette clé sera 0 ); // est complétement équivalent à $a[’couleur’] = ’rouge’; $a[’gout’] = ’sucre’; $a[’forme’] = ’rond’; $a[’nom’] = ’pomme’; $a[] = 4; // cette clé sera 0 $b[] = ’a’; $b[] = ’b’; $b[] = ’c’; // va créer le tableau array( 0 => ’a’ , 1 => ’b’ , 2 => ’c’ ) // ou plus simplement array(’a’ , ’b’ , ’c’ ) ?< Exemple 6-3. Utilisation de array() <?php // Array comme correspondance $map = array( ’version’ => 4 , ’OS’ => ’Linux’ , ’langue’ => ’français’ , ’short_tags’ => TRUE // valeur strictement numériques $array = array( 7 , 8 , 0 , 156 , -10 ); 71 Chapitre 6. Les types ); // ceci est la même chose que $switching = array( , 5 => , 3 => , ’a’ => , , ’8’ => , ’02’ => , 0 => ); array( 0 => 7, 1 => 8, ...) 10 // clé = 0 6 7 4 11 // clé = 6 (index maximum : 5) 2 // clé = 8 (entier!) 77 // clé = ’02’ 12 // la valeur de la clé 10 sera remplacée par 12 // empty array $empty = array(); ?< Exemple 6-4. Collection <?php $couleurs = array(’rouge’,’bleu’,’vert’,’jaune’); foreach ( $couleurs as $couleur ){ echo "Aimez-vous la couleur $couleur?\n"; } /* Affiche : Aimez-vous la couleur rouge? Aimez-vous la couleur bleu? Aimez-vous la couleur vert? Aimez-vous la couleur jaune? */ ?> Notez qu’il n’est pas possible actuellement de modifier les valeurs d’un tableau avec une telle boucle. Une solution pour cela est : Exemple 6-5. Collection <?php foreach( $couleurs as $cle => $couleur ){ // ne marche pas //$couleur = strtoupper($couleur); //marche : $couleurs[$cle] = strtoupper($couleur); } print_r($couleur); /* Affiche : Array ( [0] => ROUGE [1] => BLEU [2] => VERT [3] => JAUNE ) */ ?> Cet exemple crée un tableau d’index minimal 1. 72 Chapitre 6. Les types Exemple 6-6. Tableau en 1 <?php $firstquarter = array(1 => ’Janvier’, ’Février’, ’Mars’); print_r($firstquarter); /* Affiche: Array ( [1] => ’Janvier’ [2] => ’Février’ [3] => ’Mars’ ) */ ?> Exemple 6-7. Remplissage d’un tableau <?php // remplis un tableau avec les noms de fichiers d’un dossier $handle = opendir(’.’); while ( $file = readdir($handle) ){ $files[] = $file; } closedir($handle); ?> Les tableaux sont ordonnés. Vous pouvez modifier l’ordre des valeurs avec de nombreuses fonctions de classement. Voyez les fonctions de tableaux. Exemple 6-8. Tri de tableaux <?php sort($files); print_r($files); ?> Comme une valeur de tableau peut être n’importe quoi, elle peut aussi être un autre tableau. Comme cela, vous pouvez avoir des tableaux multi-dimensionnels, ou récursifs. Exemple 6-9. Tableaux multi-dimensionnels, et récursifs <?php $fruits = array ( "fruits" => array ( "a" => "orange" , "b" => "banane" , "c" => "pomme" ) , "nombres" => array ( 1 , 2 , 3 , 4 , 5 , 6 ) , "trous" => array ( "premier" , 5 => "second" , "troisième" ) ); ?> 73 Chapitre 6. Les types Attention aux tableaux Pourquoi est ce que $foo[bar] est invalide? Dans vos vieux scripts, vous pouvez avoir utilisé la syntaxe suivante : <?php $foo[bar] = ’ennemi’; echo $foo[bar]; ?> Cela est mauvais, mais ca marche. Pourquoi est-ce mauvais? La raison est que PHP réclame une expression entre les crochets (comme indiqué dans la section sur la syntaxe des tableaux). Cela signifie que vous pouvez écrire quelque chose comme : <?php echo $arr[ foo(true) ]; ?> Ceci est un exemple d’utilisation de retour de fonction dans un index de tableau. PHP reconnait aussi les constantes, et vous pouvez avoir déjà rencontré E_*. <?php $error_descriptions[E_ERROR] = "Une erreur fatale est survenue"; $error_descriptions[E_WARNING] = "PHP a généré une alerte"; $error_descriptions[E_NOTICE] = "Ceci est juste une note grâcieuse"; ?> Notez que E_ERROR est aussi un identifiant vlaide, tout comme bar dans le premier exemple. Mais le dernier exemple revient à écrire : <?php $error_descriptions[1] = "Une erreur fatale est survenue"; $error_descriptions[2] = "PHP a généré une alerte"; $error_descriptions[8] = "Ceci est juste une note grâcieuse"; ?> car E_ERROR égale 1, etc. Alors, comment se fait-tile que $foo[bar] fonctionne? C’est parce que bar est attendu comme une constante. Cependant, dans ce cas, aucune constante n’a pour nom bar. PHP suppose alors que vous voulez dire bar littéralement, c’est-à-dire la chaîne "bar", mais que vous avez oublié les guillements. Alors, pourquoi est-ce mal? Dans le futur, l’équipe de développement peut vouloir ajouter une nouvelle constante et vous vous retrouverez dans la panade. Par exemple, vous ne pouvez déjà pas utiliser les constantes empty et default, car ce sont des mots reservés. Et, pour en mettre une autre couche, cette syntaxe est tout simplement obsolète, et risque de ne plus fonctionner du tout un jour ou l’autre. Note : Lorsque vous activez le rapport d’erreur avec error_reporting() avec E_ALL, PHP générera des notes à chaque fois que cette syntaxe est utilisée. Essayez donc error_reporting(E_ALL); dans vos scripts, pour voir). Note : Dans une chaîne à guillements doubles, une autre syntaxe est valide. Voyez la section sur Traitement des variables dans les chaînes pour plus de détails. 74 Chapitre 6. Les types Les objets Initialisation d’un objet Pour initialiser un objet, vous devez utiliser la commande "new" afin de créer linstance de l’objet. <?php class foo { function faire_foo () { echo "Faisant foo."; } } $bar = new foo; $bar->faire_foo(); ?> Ressources Une ressource (resource en anglais), est un type spécial, qui représente une référence sur une ressource externe. Les ressources sont créées par des fonctions dédiées. Reportez vous à l’annexe ressource pour une liste exhaustive des fonctions créant et utilisant ces ressources. Note : Le type ressource a été introduit en PHP 4. Libérer des ressources Grâce au système de comptabilisation des références introduit en PHP 4 (avec le moteur Zend), PHP détecte automatiquement qu’une ressource n’est plus utilisée (comme Java). Dans ce cas, toutes les ressources systèmes utilisées par cette ressource sont libérées automatiquement. Note : Les connexions persistantes représentent un cas particulier, elles ne seront PAS détruites. Voyez connexions persistantes. La valeur NULL La valeur spéciale NULL représente l’absence de valeur. Une variable avec la valeur NULL n’a pas de valeur. Syntaxe Il y a seulement une valeur de type NULL, et c’est la constante NULL, insensible à la casse. <?php $var = Null; ?> Note : La valeur NULL a été introduite en PHP 4. 75 Chapitre 6. Les types Définition du type PHP ne nécessite pas de déclaration explicite du type d’une variable. Le type d’une variable est déterminé par le contexte d’utilisation. Par exemple, si vous assignez une chaîne de caractères à la variable var, var devient une chaîne de caractère. Si vous assignez un nombre entier à var, elle devient un entier. Un exemple de convertisseur automatique de type est l’opérateur ’+’. Si un des opérandes est de type double, alors tous les opérandes sont évalués comme des variables de type double et le résultat est de type double. Sinon, tous les opérandes sont évalués comme des variables de type entier et le résultat sera du type entier. Il est à noter que cela NE CHANGE PAS le type des opérandes. Le seul changement est la manière dont les opérandes sont évaluées. <?php $foo $foo $foo $foo $foo ?> = "0"; // $foo est une chaîne de caractères (ASCII 48) += 2; // $foo est maintenant du type entier (2) = $foo + 1.3; // $foo est maintenant du type double (3.3) = 5 + "10 Petits cochons"; // $foo est du type entier (15) = 5 + "10 cochonnets"; // $foo est du type entier (15) Si les deux derniers exemples vous semblent obscurs ou si vous voulez forcer une variable a être évaluée avec un certain type, reportez-vous au paragraphe Conversion de type ci-dessous. Si vous voulez changer le type d’une variable, intéressez-vous à aux fonctions de conversion de chaînes. Si vous voulez forcer le type d’une variable, vous pouvez vous reporter à la section transtypage. Si vous voulez changer le type d’une variable, utilisez settype(). Pour tester les exemples de cette section, il suffit d’en faire un copier/coller, et d’insérer les lignes dans un script PHP. <?php echo "\$foo==$foo; le type est " . gettype( $foo ) . "<br>\n"; ?> Note : Le comportement de la conversion automatique est actuellement indéfinie. <?php $a = 1; $a[0] = "f"; ?> // $a est un entier // $a devient un tableau, et $a[0] contient "f" Bien que dans l’exemple ci-dessus, il semble évident que $a va devenir un tableau, dont le premier élément est ’f’, considérez l’exemple suivant : <?php $a = "1"; $a[0] = "f"; ?> // $a est une chaîne // Qu’est ce qu’une position dans une chaîne ? que se passe t il? Etant donné que PHP supporte l’indexation de chaîne avec des offsets identiques à celles des tableaux, l’exemple ci-dessus conduit à un problème : est ce que $a est un tableau, dont le premier élément est "f", ou bien est ce que "f" est le premier élément de la chaîne de caractères $a? Pour cette raison, aussi bien pour PHP 3.0.12 que PHP 4.0b3-RC4, le résultat de la conversion automatique est considéré comme indéfinie. Des solutions sont en cours de discussion. 76 Chapitre 6. Les types Transtypage La conversion de type en PHP fonctionne de la même manière qu’en C: le nom du type désiré est écrit entre parenthèses devant la variable à transtyper ("cast"). <?php $foo = 10; // $foo est un entier $bar = (double) $foo; // $bar est un double ?> Les conversions autorisées sont: • (int), (integer) - type entier • (bool), (boolean) - booléen • (real), (double), (float) - type double • (string) - ctype chaîne • (array) - type tableau • (object) - type objet Il est à noter que les tabulations et les espaces sont autorisés à l’intérieur des parenthèses, donc les lignes suivantes sont équivalentes: <?php $foo = (int) $bar; $foo = ( int ) $bar; ?> Le transtypage n’a pas toujours de résultat prévisible. Pour plus d’informations, voyez : • Conversion en booléen • Conversion en entier Avertissement Pour transformer facilement une variable en chaîne, entourez la simplement de guillements doubles. Lors de la conversion d’un tableau en chaîne, le résultat sera le mot Array (tableau, en anglais). Lors de la conversion d’un objet en chaîne, le résultat sera le mot Object (objet, en anglais). Dans les deux cas, une alerte sera affichée. Lorsque vous transtypez un scalaire ou une chaîne en tableau, la variable verra son contenu affecté au premier élément du tableau. <?php $var = ’ciao’; $arr = (array) $var; echo $arr[0]; // affiche ’ciao’ ?> Lorsque vous transtypez un scalaire ou une chaîne en objet, la valeur de la variable sera transformée en attribut de l’objet. L’attribut s’appellera ’scalar’: <?php $var = ’ciao’; $obj = (object) $var; 77 Chapitre 6. Les types echo $obj->scalar; // affiche ’ciao’ ?> 78 Chapitre 7. Les variables 79 Chapitre 7. Les variables Essentiel En PHP, les variables sont représentées par un signe dollar "$" suivi du nom de la variable. Le nom est sensible à la casse (ie : $x != $X). Les noms de variables suivent les mêmes règles de nommage que les autres entités PHP. Un nom de variable valide doit commencer par une lettre ou un souligné (_), suivi de lettres, chiffres ou soulignés. Exprimé sous la forme d’une expression régulière, cela donne : ’[a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*’ Note : Dans nos propos, une lettre peut être une des lettres minuscules (a à z) ou majuscules (A à Z), et les caractères ASCII de 127 à 255 (0x7f-0xff). <?php $var = "Jean"; $Var = "Paul"; echo "$var, $Var"; // affiche "Jean, Paul" $4site = ’pas encore’; // invalide : commence par un nombre $_4site = ’pas encore’; // valide : commence par un souligné $maïs = ’jaune’; // valide; ’ï’ est ASCII 239. ?> En PHP 3, les variables sont toujours assignées par valeur. C’est-à-dire, lorsque vous assignez une expression à une variable, la valeur de l’expression est recopiée dans la variable. Cela signifie, par exemple, qu’après avoir assigné la valeur d’une variable à une autre, modifier l’une des variables n’aura pas d’effet sur l’autre. Pour plus de détails sur ce genre d’assignation, reportez-vous à Expressions. PHP 4 permet aussi d’assigner les valeurs aux variables par référence. Cela signifie que la nouvelle variable ne fait que référencer (en d’autres terme, "devient un alias de", ou encore "pointe sur") la variable originale. Les modifications de la nouvelle variable affecteront l’ancienne, et vice versa. Cela signifie aussi qu’aucune copie n’est faite : l’assignation est donc beaucoup plus rapide. Cela se fera notamment sentir dans des boucles, ou lors d’assignation de grands objets (tableaux). Pour assigner par référence, ajoutez simplement un & (ET commercial) au début de la variable qui est assignée (la variable source). Dans l’exemple suivant, "Mon nom est Pierre" s’affichera deux fois : <?php $foo = ’Pierre’; $bar = &$foo; // $bar = "Mon nom est Pierre"; echo $foo; // echo $bar; ?> // Assigne la valeur ’Pierre’ à $foo Référence $foo avec $bar. // Modifie $bar... $foo est aussi modifiée Une chose importante à noter est que seules les variables nommées peuvent être assignées par référence. <?php $foo = 25; $bar = &$foo; $bar = &(24 * 7); function test() { return 25; } $bar = &test(); ?> // assignation valide . // assignation invalide : référence une expression sans nom // assignation invalide. 80 Chapitre 7. Les variables Variables prédéfinies PHP fourni un grand nombre de variables prédéfinies. Cependant, beaucoup de ces variables ne peuvent pas être présentées ici, car elles dépendent du serveur sur lequel elles tournent, de la version du serveur, et de la configuration du serveur, ou encore d’autres facteurs. Certaines de ces variables ne seront pas accessibles lorsque PHP fonctionne en exécutable. Malgré ces données, voici une liste de variables prédéfinies, qui seront accessibles avec une installation ad hoc de PHP3, fonctionnant en module, sous Apache (http://www.apache.org/) 1.3.6. Pour la liste complète des variables prédéfinies (et d’autres informations pratiques) reportez-vous (et usez) de phpinfo(). Note : Cette liste n’est pas exhaustive et ne le sera pas. C’est simplement un aperçu des variables prédéfinies qui peuvent être accessibles dans les scripts. Variables Apache Ces variables sont créées par le serveur Apache (http://www.apache.org/). Si vous utilisez un autre serveur web, il n’est pas sur que celui-ci vous fournira les mêmes variables. Il peut ne pas les fournir, en fournir d’autres. Cependant, un bon nombre de ces variables font partie de l’interface CGI 1.1 (http://hoohoo.ncsa.uiuc.edu/cgi/env.html), et on peut s’attendre à les retrouver. Notez que peu d’entre elles seront accessibles lorsque PHP est appelé en ligne de commande, (et elles n’auront alors peut être pas de sens) $GATEWAY_INTERFACE Numéro de révision de l’interface CGI du serveur : i.e. ’CGI/1.1’. $SERVER_NAME Le nom du serveur hôte qui éxécute le script suivant. Si le script est exécuté sur un hôte virtuel, ce sera la valeur définie pour cet hôte virtuel. $SERVER_SOFTWARE Chaîne d’identification du serveur, qui est donnée dans les en-têtes lors de la réponse aux requêtes. $SERVER_PROTOCOL Nom et révision du protocole de communication : i.e. ’HTTP/1.0’; $REQUEST_METHOD Méthode de requête utilisée pour accéder à la page; i.e. ’GET’, ’HEAD’, ’POST’, ’PUT’. $QUERY_STRING La chaîne de requête, si elle existe, qui est utilisée pour accéder à la page. $DOCUMENT_ROOT La racine sous laquelle le script courant est exécuté, comme défini dans la configuration du serveur. $HTTP_ACCEPT Contenu de l’en-tête Accept: de la requête courante, s’il y en a une. $HTTP_ACCEPT_CHARSET Contenu de l’en-tête Accept-Charset: de la requête courante, s’elle existe. Par exemple : ’iso-8859-1,*,utf-8’. $HTTP_ACCEPT_ENCODING Contenu de l’en-tête Accept-Encoding: de la requête courante, si elle existe. Par exemple : ’gzip’. $HTTP_ACCEPT_LANGUAGE Contenu de l’en-tête Accept-Language: de la requête courante, si elle existe. Par exemple : ’en’. $HTTP_CONNECTION Contenu de l’en-tête Connection: de la requête courante, si elle existe. Par exemple : ’Keep-Alive’. 81 Chapitre 7. Les variables $HTTP_HOST Contenu de l’en-tête Host: de la requête courante, si elle existe. $HTTP_REFERER L’adresse de la page (si elle existe) qui a conduit le client à la page courante. Cette valeur est affectée par le client, et tous les clients ne le font pas. $HTTP_USER_AGENT Contenu de l’en-tête User_Agent: de la requête courante, si elle existe. C’est une chaîne qui décrit le client HTML utilisé pour voir la page courante. Par exemple : Mozilla/4.5 [en] (X11; U; Linux 2.2.9 i586). Entre autres choses, vous pouvez utiliser cette valeur avec get_browser() pour optimiser votre page en fonction des capacités du client. $REMOTE_ADDR L’adresse IP du client qui demande la page courante. $REMOTE_PORT Le port utilisé par la machine cliente pour communiquer avec le serveur web. $SCRIPT_FILENAME Le chemin absolu jusqu’au script courant. $SERVER_ADMIN La valeur donnée à la directive SERVER_ADMIN (pour Apache), dans le fichier de configuration. Si le script est exécuté par un hôte virtuel, ce sera la valeur définie par l’hôte virtuel. $SERVER_PORT Le port de la machine serveur utilisé pour les communications. Par défaut, c’est ’80’. En utilisant SSL, par exemple, il sera remplacé par le numéro de port HTTP sécurisé. $SERVER_SIGNATURE Chaîne contenant le numéro de version du serveur et le nom d’hôte virtuel, qui sont ajoutés aux pages générées par le serveur, si cette option est activée. $PATH_TRANSLATED Chemin dans le système de fichier (pas le document root-) jusqu’au script courant, une fois que le serveur a fait une chemin traduction virtuel->réel. $SCRIPT_NAME Contient le nom du script courant. Cela sert lorsque les pages doivent s’appeler elles-mêmes. $REQUEST_URI L’URI qui a été fourni pour accéder à cette page. Par exemple : ’/index.html’. Variables d’environnement Ces variables sont importées dans l’espace de nom global de PHP, depuis l’environnement sous lequel PHP fonctionne. Beaucoup d’entre elles sont fournies par le shell qui exécute PHP et différents systèmes étant susceptibles de disposer de différents shells, une liste définitive est impossible à établir. Reportez-vous à la documentation de votre shell, pour connaître la liste des variables d’environnement prédéfinies. Les autres variables d’environment incluent les variables CGI, placées ici, quelquefois la méthode d’éxécution de PHP (CGI ou module). Variables PHP 82 Chapitre 7. Les variables Ces variables sont créées par PHP lui_même. Les variables $HTTP_*_VARS ne sont disponibles que si l’option de configuration track_vars a été activée. Lorsque c’est le cas, ces variables existent toujours, même si ce sont des tableaux vides. Cela évite les usurpations mal intentionnées de ces variables. Note : Depuis PHP 4.0.3, track_vars est toujours activé, quelle que soit la configuration. Si la directive register_globals est activée, alors ces variables seront aussi disponibles comme variables globales du script : c’est-à-dire, indépendamment des tableaux $HTTP_*_VARS. Cette fonctionnalité doit être utilisée avec précautions, et de préférence, désactivée. Si $HTTP_*_VARS est sécurisé, les équivalents globaux peuvent être écrasés par les données d’entrée de l’utilisateur, avec des intrusions possibles. Si vous ne pouvez pas désactiver register_globals, vous devez prendre toutes les dispositions possibles pour vous assurer que les données utilisées sont sÛres. $argv Tableau des arguments passées au script. Lorsque le script est appelé en ligne de commande, cela donne accès aux arguments, comme en langage C. Lorsque le script est appelé avec la méthode GET, ce tableau contiendra la chaîne de requête. $argc Contient le nombre de paramètres de la ligne de commande passés au script (si le script fonctionne en ligne de commande). $PHP_SELF Le nom du fichier du script en cour d’éxécution, par rapport au document root. Si PHP fonctionne en ligne de commande, cette variable n’est pas disponible. $HTTP_COOKIE_VARS Un tableau associatif des variables passées au script courant via les HTTP cookies. Uniquement possible si le suivi des variables a été activé avec la directive générale track_vars ou avec la directive locale <? php_track_vars ?>. $HTTP_GET_VARS Un tableau associatif des variables passées au script courant via les HTTP GET. Uniquement possible si le suivi des variables a été activé avec la directive générale track_vars ou avec la directive locale <? php_track_vars ?>. $HTTP_POST_VARS Un tableau associatif des variables passées au script courant via les HTTP POST. Uniquement possible si le suivi des variables a été activé avec la directive générale track_vars ou avec la directive locale <? php_track_vars ?>. $HTTP_POST_FILES Un tableau associatif contenant les informations sur les fichiers téléchargés avec la méthode HTTP POST. Reportez-vous au chapitre Téléchargement par méthode POST pour plus de détails sur le contenu de $HTTP_POST_FILES. $HTTP_POST_FILES n’est disponible que dans les versions 4.0.0 et plus récentes de PHP. $HTTP_ENV_VARS Un tableau associatif des variables passées au script par l’environnement parent. $HTTP_SERVER_VARS Un tableau associatif des variables passées au script par le serveur HTTP. Ces variables sont analogues aux variables décrites ci-dessus. Portée des variables 83 Chapitre 7. Les variables La portée d’une variable dépend du contexte dans lequel la variable est définie. Pour la majorité des variables, la portée concerne la totalité d’un script PHP. Mais, lorsque vous définissez une fonction, la portée d’une variable définie dans cette fonction est locale à la fonction. Par exemple: <?php $a = 1; include "b.inc"; ?> Ici, la variable $a sera accessible dans le script inclus b.inc. Cependant, dans les fonctions définies par l’utilisateur, une nouvelle définition de cette variable sera donnée, limitée à la fonction. Toute variable utilisée dans une fonction est par définition, locale. Par exemple : <?php $a = 1; /* portée globale */ function test() { echo $a; /* portée locale */ } test(); ?> Le script n’affichera rien à l’écran car la fonction echo() utilise la variable locale $a, et celle-ci n’a pas été assignée préalablement dans la fonction. Vous pouvez noter que ce concept diffère un petit peu du langage C dans lequel une variable globale est automatiquement accessible dans les fonctions, à moins d’être redéfinie localement dans la fonction. Cela peut poser des problèmes si vous redéfinissez des variables globales localement. En PHP, une variable globale doit être déclarée à l’intérieur de chaque fonction afin de pouvoir être utilisée dans cette fonction. Par exemple: <?php $a = 1; $b = 2; function somme() { global $a, $b; $b = $a + $b; } somme(); echo $b; Le script ci-dessus va afficher la valeur "3". En déclarant globales les variables $a et $b locales de la fonction somme(), toutes les références à ces variables concerneront les variables globales. Il n’y a aucune limite au nombre de variables globales qui peuvent être manipulées par une fonction. Une deuxième méthode pour accéder aux variables globales est d’utiliser le tableau associatif prédéfini $GLOBALS. Le précédent exemple peut être réécrit de la manière suivante: <?php $a = 1; $b = 2; function somme() { $GLOBALS["b"] = $GLOBALS["a"] + $GLOBALS["b"]; } somme(); echo $b; ?> Le tableau $GLOBALS est un tableau associatif avec le nom des variables globales comme clef et les valeurs des éléments du tableau comme valeur des variables. Une autre caractéristique importante de la portée des variables est la notion de variable static. Une variable statique a une portée locale uniquement, mais elle ne perd pas sa valeur lorsque le script appelle la fonction. Prenons l’exemple suivant: <?php function test() { $a = 0; 84 Chapitre 7. Les variables echo $a; $a++; } ?> Cette fonction est un peu inutile car à chaque fois qu’elle est appelée, elle initialise $a à 0 et affiche "0". L’incrémentation de la variable ($a++) ne sert pas à grand chose, car dès que la fonction est terminée la variable disparaît. Pour faire une fonction de comptage utile, c’est-à-dire qui ne perdra pas la trace du compteur, la variable $a est déclarée comme une variable statique: <?php function test() { static $a = 0; echo $a; $a++; } ?> Maintenant, à chaque fois que la fonction Test() est appelée, elle affichera une valeur de $a incrémentée de 1. Les variables statiques sont essentielles lorsque vous faites des appels récursifs à une fonction. Une fonction récursive est une fonction qui s’appelle elle-même. Il faut faire attention lorsque vous écrivez une fonction récursive car il est facile de faire une boucle infinie. Vous devez vérifier que vous avez bien une condition qui permet de terminer votre récursivité. La fonction suivante compte récursivement jusqu’à 10: <?php function test() { static $count = 0; $count++; echo $count; if ($count < 10) { test(); } $count--; } ?> Les variables dynamiques Il est pratique d’avoir parfois des noms de variables qui sont variables. C’est-à-dire un nom de variable qui est affectée et utilisée dynamiquement. Une variable classique est affecté avec l’instruction suivante: <?php $a = "bonjour"; ?> Une variable dynamique prend la valeur d’une variable et l’utilise comme nom d’une autre variable. Dans l’exemple ci-dessous, bonjour peut être utilisé comme le nom d’une variable en utilisant le "$$" précédent la variable. C’est-à-dire <?php $$a = "monde"; ?> A ce niveau, deux variables ont été définies et stockées dans l’arbre des symboles PHP: $a avec comme valeur "bonjour" et $bonjour avec comme valeur "monde". Alors, l’instruction <?php echo "$a ${$a}"; ?> 85 Chapitre 7. Les variables produira le même affichage que : <?php echo "$a $bonjour"; ?> c’est-à-dire : bonjour monde. Afin de pouvoir utiliser les variables dynamiques avec les tableaux, vous avez à résoudre un problème ambigu. Si vous écrivez $$a[1], le parseur a besoin de savoir si vous parler de la variable qui a pour nom $a[1] ou bien si vous voulez l’index [1] de la variable $$a. La syntaxe pour résoudre cette ambiguïté est la suivante: ${$a[1]} pour le premier cas, et ${$a}[1] pour le deuxième. Variables externes à PHP Formulaires HTML (GET et POST) Lorsqu’un formulaire est envoyé à un script PHP, toutes les variables du formulaire seront automatiquement disponibles dans le script. Par exemple, considérons le formulaire suivant: Exemple 7-1. Exemple avec un formulaire simple <form action="foo.php3" method="post"> Name: <input type="text" name="name"><br> <input type="submit"> </form> Lorsque ce formulaire est envoyé, le PHP va créer la variable $name, qui contiendra la valeur que vous avez entrée dans le champs Name: du formulaire. Le PHP permet aussi l’utilisation des tableaux dans le contexte de formulaire, mais seulement des tableaux à une seule dimension. Comme cela, vous pouvez rassembler des variables ou utiliser cette fonctionnalité pour récupérer les valeurs d’un choix multiple : Exemple 7-2. Variables complexes de formulaire <form action="array.php" method="post"> Name: <input type="text" name="personal[name]"><br> Email: <input type="text" name="personal[email]"><br> Beer: <br> <select multiple name="vin[]"> <option value="medoc">Médoc <option value="chablis">Chablis <option value="riesling">Riesling </select> <input type="submit"> </form> Si l’option "track_vars" est activée, soit par l’option de compilation track_vars, soit par la directive de configuration <? php_track_vars ?>, les variables transmises par les méthodes POST et GET pourront aussi être trouvées dans le tableau associatif global $HTTP_POST_VARS ou $HTTP_GET_VARS suivant la méthode utlisée. 86 Chapitre 7. Les variables Bouton "submit" sous forme d’image Lorsque vous envoyez le résultat d’un formulaire, vous pouvez utiliser une image au lieu du bouton "submit" standard en utilisant un tag : <input type=image src="image.gif" name="sub"> Lorsqu’un utilisateur clique sur l’image, le formulaire sera transmis au serveur avec deux variables de plus, sub_x et sub_y. Ces deux variables contiennent les coordonnées de l’endroit où l’utilisateur à cliqué. Les utilisateurs expérimentés remarqueront que les noms de variables sont transmis avec une virgule à la place du caractère "_", mais le PHP fait la conversion automatiquement. HTTP Cookies Le PHP supporte les cookies HTTP de manière totalement transparente, comme défini dans les Netscape’s Spec (http://www.netscape.com/newsref/std/cookie_spec.html). Les cookies sont un mécanisme permettant de stocker des données sur la machine cliente à des fins d’authentification de l’utilisateur. Vous pouvez établir un cookie grâce à la fonction setcookie(). Les cookies font partie intégrante du "header" HTTP, et donc la fonction setcookie() doit être appelée avant que le moindre affichage ne soit envoyé au navigateur. C’est la même restriction que pour la fonction header(). Tout cookie envoyé depuis le client sur le serveur sera automatiquement stocké sous forme de variable, comme pour la méthode POST ou GET. Si vous souhaitez assigner plusieurs valeurs à un seul cookie, il vous faut ajouter les caractères [] au nom de votre cookie. Par exemple : <?php setcookie ("MonCookie[]", "test", time()+3600); ?> Il est à noter qu’un cookie remplace le cookie précédent par un cookie de même nom tant que le "path" ou le domaine sont identiques. Donc, pour une application de caddie, vous devez implémenter un compteur et l’incrémenter au fur et à mesure. C’est-à-dire: Exemple 7-3. Exemple avec setcookie() <?php $compte++; SetCookie ("Compte", $compte, time()+3600); SetCookie ("Caddie[$compte]", $item, time()+3600); ?> Variables d’environnement Le PHP fait en sorte que les variables d’environnement soient accessibles directement comme des variables PHP normales. <?php echo $HOME; /* Affiche la valeur de la variable d’environnement HOME, si celle-ci est affectée. */ ?> Même si le PHP crée les variables lors de l’utilisation des méthodes GET, POST et cookie, il est de temps en temps préférable de transmettre explicitement la valeur de la variable afin d’être sÛr de la valeur. La fonction getenv() peut être utilisée pour récupérer la valeur des variables d’environnement. Vous pouvez aussi affecter une variable d’environnement grâce à la fonction putenv(). 87 Chapitre 7. Les variables Cas des points dans les noms de variables Typiquement, PHP ne modifie pas les noms des variables lorsqu’elles sont passées à un script. Cependant, il faut noter que les points (.) ne sont pas autorisés dans les noms de variables PHP. Pour cette raison, jetez un oeil sur : <?php $varname.ext; ?> /* nom de variable invalide */ Dans ce cas, l’analyseur croit voir la variable nommée $varname, suivie par l’opérateur de concaténation, et suivi encore par la chaîne non-guillemetée (une chaîne sans guillemets, et qui n’a pas de signification particulière). Visiblement, ce n’est pas ce qu’on attendait... Pour cette raison, il est important de noter que PHP remplacera automatiquement les points des noms de variables entrantes par des soulignés (underscore). Détermination du type des variables Parceque le PHP détermine le type des variables et les convertit (généralement) comme il faut, ce n’est pas toujours le type de variable que vous souhaitez. PHP inclut des fonctions permettant de déterminer le type d’une variable : gettype(), is_long(), is_double(), is_string(), is_array() et is_object(). 88 Chapitre 8. Les constantes 89 Chapitre 8. Les constantes Une constante est un identifiant (un nom) qui représente une valeur simple. Comme leur nom le suggère, cette valeur ne peut jamais être modifiée durant l’exécution du script (les constantes magiques __FILE__ et __LINE__ sont les seules exception). Le nom d’une constante est sensible à la casse, apr défaut. Par convention, les constantes sont toujours en majuscules. Les noms de constantes suivent les mêmes règles que n’importe quel nom en PHP. Un nom de constante valide commence par une lettre ou un souligné (_), suivi d’un nombre quelconque de lettre, chiffres ou soulignés. Sous forme d’expression régulière, cela peut s’exprimer comme ceci : [a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]* Note : Dans cette documentation, une lettre peut être un des caractères suivants : de a à z, de A à Z et tous les caractères ASCII de 127 à 255 (0x7f-0xff). Les constantes sont accessibles de manière globale. Syntaxe Vous pouvez définir une constante en utilisant la fonction define(). Une fois qu’une constante est définie, elle ne peut jamais être modifiée, ou détruite. Seuls les types de données scalaires peuvent être placés dans une constante : c’est à dire les types booléen, entier, double et chaîne de caractères (soit boolean, integer, double et string). Vous povuez accéder à la valeur d’une constante en spécifiant simplement son nom. Contrairement aux variables, vous ne devez PAS préfixer le nom de la constante avec $. Vous pouvez aussi utiliser la fonction constant(), pour lire dynamiquement la valeur d’une constante, si vous obtenez le nom de cette constante dynamiquement (retour de fonction, par exemple). Utilisez la fonction get_defined_constants() pour connaître la liste de toutes les fonctions définies. Note : Les constantes et les variables globales utilisent deux espaces de noms différents. Ce qui implique que TRUE et $TRUE sont généralement différents (en tous cas, ils peuvent avoir des valeurs différentes). Lorsque vous utilisez une constante non définie, PHP suppose que vous utilisez le nom de la constante. Une note sera générée. Utilisez la fonction defined() pour savoir si une constante existe ou pas. Il y a des différences entre les constantes et les variables : • Les constantes ne commencent pas par le signe ($); • Les constantes sont définies et accessibles à tout endroit du code, globalement. • Les constantes ne peuvent pas être redéfinies ou indéfinies une fois qu’elles ont été définies. • Les constantes ne peuvent contenir que des scalaires. Exemple 8-1. Definir une constante <?php define("CONSTANTE", "Bonjour le monde."); echo CONSTANTE; // affiche "Bonjour le monde." echo Constante; // affiche "Constante" et une note. ?> Constantes prédéfinies Les constantes prédéfinies sont toujours disponibles. En voici la liste : __FILE__ (insensible à la casse) 90 Chapitre 8. Les constantes Le nom du fichier qui est actuellement exécuté. Si cette constante est utilisée dans le cadre d’un fichier "inclus" (après utilisation de require()), alors le nom du fichier inclus est renvoyée, et non le nom du fichier parent. __LINE__ (insensible à la casse) Le numéro de la ligne qui est actuellement exécutée. Si cette constante est utilisée dans le cadre d’un fichier "inclus" (après utilisation de require()), c’est la position dans le fichier inclus qui est renvoyé. PHP_VERSION La chaîne de caractères de présentation de la version du PHP qui est actuellement utilisée. Par exemple ’4.0.0’. PHP_OS Nom du système d’exploitation qui est utilisé par la machine qui fait tourner le PHP. Parmi les valeurs possibles : "AIX", "Darwin" (MacOS), "Linux", "SunOS", "WIN32", "WINNT". Note : cette liste n’est pas exhaustive. TRUE La valeur vraie booléenne, TRUE. FALSE La valeur faux booléenne, FALSE. E_ERROR Dénote une erreur autre qu’une erreur d’analyse ("parse error") qu’il n’est pas possible de corriger. E_WARNING Dénote un contexte dans lequel le PHP trouve que quelque chose ne va pas. Mais l’exécution se poursuit tout de même. Ces alertes-là peuvent être récupérées par le script lui-même. Un exemple serait une expression régulière (regexp) invalide dans la fonction ereg(). E_PARSE L’analyseur a rencontré une forme syntaxique invalide dans le script. Correction de l’erreur impossible. E_NOTICE Quelque chose s’est produit, qui peut être ou non une erreur. L’exécution continue. Par exemple, le cas de guillemets doubles (") non refermés, ou bien la tentative d’accéder à une variable qui n’est pas encore affectée. E_ALL Toutes les constantes E_* rassemblées en une seule. Si vous l’utilisez avec error_reporting(), toutes les erreurs et les problèmes que PHP rencontrera seront notifiés. Les constantes E_* sont généralement utilisées avec la fonction error_reporting(). Vous pouvez définir d’autres constantes en utilisant la fonction define(). Il est à noter que ce sont des constantes, et non pas des macros comme en C. Seulement les données scalaires peuvent être représentées par des constantes. Exemple 8-2. Définition de constantes <?php define("CONSTANTE", "Bonjour le monde."); echo CONSTANTE; // affiche "Bonjour le monde." ?> Exemple 8-3. Utilisation des constantes __FILE__ et __LINE__ <?php function rapport_erreur($file, $line, $message) { echo "Une erreur est survenue dans le fichier $file à la ligne $line: $message."; } rapport_erreur(__FILE__,__LINE__, "Y a un problème!"); 91 Chapitre 8. Les constantes ?> 92 Chapitre 9. Les expressions 93 Chapitre 9. Les expressions Les expressions sont la partie la plus importante du PHP. En PHP, presque tout ce que vous écrivez est une expression. La manière la plus simple de définir une expression est : "tout ce qui a une valeur". Les formes les plus simples d’expressions sont les constantes et les variables. Lorsque vous écrivez "$a = 5", vous assignez la valeur ’5’ à la variable $a. Bien évidemment, ’5’ vaut 5 ou, en d’autres termes, ’5’ est une expresssion avec pour valeur 5 (dans ce cas, ’5’ est un intier constant). Après cette assignation, vous pouvez considérer que $a a pour valeur 5 et donc, écrire $b = $a, revient à écrire $b = 5. En d’autres termes, $a est une expression avec de valeur 5. Si tout fonctionne correctement, c’est exactement ce qui arrive. Un exemple plus complexe concerne les fonctions. Par exemple, considérons la fonction suivante : <?php function foo () { return 5; } ?> Considérant que vous êtes familier avec le concept de fonction, (si ce n’est pas le cas, jetez un oeil au chapitre concernant les fonctions), vous serez d’accord que $c = foo() est équivalent à $c = 5, et vous aurez tout à fait raison. Les fonctions sont des expressions qui ont la valeur de leur "valeur de retour". Si foo() renvoie 5, la valeur de l’expression ’foo()’ est 5. Habituellement, les fonctions ne font pas que renvoyer une valeur constante mais réalisent des traitements. Bien sur, les valeurs en PHP n’ont pas à être des valeurs numériques, comme c’est souvent le cas. PHP supporte 3 types de variables scalaires : les valeurs entières, les nombres à virgule flottante et les chaînes de caractères. (une variable scalaire est une variable que vous ne pouvez pas scinder en morceau, au contraire des tableaux par exemple). PHP supporte aussi deux types composés : les tableaux et les objets. Chacun de ces types de variables peuvent être affectés ou renvoyés par une fonction. Les utilisateurs de PHP/FI 2 ne verront aucun changement. Malgré tout, PHP va plus loin dans la gestion des expressions, comme le font d’autres langages. PHP est un langage orienté expression, dans le sens oú presque tout est une expression. Considérons l’exemple dont nous avons déjà parlé, ’$a = 5’. Il est facile de voir que il y a deux valeurs qui entrent en jeux ici, la valeur numérique constante ’5’ et la valeur de la variable $a qui est mis à jour à la valeur 5. Mais, la vérité est qu’il y a une autre valeur qui entre en jeu ici et c’est la valeur de l’assignement elle-même. L’assignement lui-même est assigné à une valeur, dans ce cas-là 5. En pratique, cela signifie que ’$a = 5’ est une expression qui a pour valeur 5. Donc, en écrire ’$b = ($a = 5)’ revient à écrire ’$a = 5; $b = 5;’ (un point virgule marque la fin d’une instruction). Comme les assignements sont analysés de droite à gauche, vous pouvez aussi bien écrire ’$b = $a = 5’. Un autre bon exemple du langage orienté expression est la pré-incrémentation et la post-incrémentation, (ainsi que la décrémentation). Les utilisateurs de PHP/FI 2 et ceux de nombreux autres langages sont habitués à la notation "variable++" et "variable--". Ce sont les opérateurs d’incrémentation et de décrémentation. En PHP/FI 2, l’instruction ’$a++’ n’a aucune valeur (c’est-à-dire que ce n’est pas une expression) et vous ne pouvez donc pas l’utiliser. PHP ajoute les possibilités d’incrémentation et de décrémentation comme c’est le cas dans le langage C. En PHP, comme en C, il y a deux types d’opérateurs d’incrémentation (pré-incrémentation et post-incrémentation). Les deux types d’opérateur d’incrémentation jouent le même rôle (c’est-à-dire qu’il incrémente la variable). La différence vient de la valeur de l’opérateur d’incrémentation. L’opérateur de pré-incrémentation, qui s’écrit ’++$variable’, évalue la valeur incrémentée (PHP incrémente la variable avant de lire la valeur de cette variable, d’oú le nom de ’pré-incrémentation’). L’opérateur de post-incrémentation, qui s’écrit ’$variable++’, évalue la valeur de la variable avant de l’incrémenter. (PHP incrémente la variable après avoir lu sa valeur, d’oú le nom de ’post-incrémentation’). Un type d’expression très commun est l’expression de comparaison. Ces expressions sont évaluées à 0 ou 1, autrement dit FALSE ou TRUE (respectivement). PHP supporte les opérateurs de comparaison > (plus grand que), => (plus grand ou égal), == (égal à), < (plus petit que), <= (plus petit ou égal). Ces expressions sont utilisées de manière courante dans les instructions conditionnelles, comme l’instruction if. Pour le dernier exemple d’expression, nous allons parler des combinaisons d’opérateurs/assignement. Vous savez que si vous voulez incrémenter la variable $a d’une unité, vous devez simplement écrire ’$a++’. Mais si vous voulez ajouter la valeur ’3’ à votre variable ? Vous pouvez écrire plusieurs fois ’$a++’, mais ce n’est pas la meilleure des méthodes. Un pratique plus courante est d’écrire ’$a = $a + 3’. L’expression ’$a + 3’ correspond à la valeur $a plus 3, et est de nouveau assignée à la variable $a. Donc le résultat est l’incrémentation de 3 unités. En PHP, comme dans de nombreux autres langages comme le C, vous pouvez écrire cela de manière plus concise, manière qui avec le temps se révélera plus claire et plus rapide à comprendre. Ajouter 3 à la valeur de la variable $a peut s’écrire ’$a += 3’. Cela signifie précisement : "on prend la valeur de la variable $a, on ajoute la valeur 3 et on assigne cette valeur à la variable $a". Et pour être plus concis et 94 Chapitre 9. Les expressions plus clair, cette expression est plus rapide. La valeur de l’expression ’$a += 3’, comme l’assignement d’une valeur quelconque, est la valeur assignée. Il est à noter que ce n’est pas 3 mais la combinaison de la valeur de la variable $a plus la valeur 3. (c’est la valeur qui est assignée à la variable $a). N’importe quel opérateur binaire peu utiliser ce type d’assignement, par exemple ’$a -= 5’ (soustraction de 5 de la valeur de la variable $a), ’$b *= 7’ (multiplication de la valeur de la variable $b par 7). Il y a une autre expression qui peut paraître complexe si vous ne l’avez pas vu dans d’autre langage, l’opérateur conditionnel ternaire: <?php $first ? $second : $third ?> Si la valeur de la première sous-expression est vraie, (différente de 0), alors la deuxième sous-expression est évaluée et constitue le résultat de l’expression conditonnelle. Sinon, c’est la troisème sous-expression qui est évaluée et qui constitue le résultat de l’expression. Les exemples suivants devraient vous permettre de mieux comprendre la pré- et post- incrémentation et le concept des expressions en général: <?php function double($i) { return $i*2; } $b = $a = 5; /* assigne la valeur 5 aux variables $a et $b */ $c = $a++; /* post-incrémentation de la variable $a et assignation de la valeur à la variable $c */ $e = $d = ++$b; /* Pré-incrémentation, et assignation de la valeur aux variables $d et $e */ /* à ce niveau, les variables $d et $e sont égales à 6 */ $f = double($d++); /* assignation du double de la valeur de $d à la variable $f ($f vaut 12), puis incrémentation de la valeur de $d */ $g = double(++$e); /* assigne deux fois la valeur de $e après incrémentation, 2*7 = 14 to $g */ $h = $g += 10; /* Tout d’abord, $g est incrémentée de 10, et donc $g vaut 24. Ensuite, la valeur de $g, (24) est assignée à la variable $h, qui vaut donc elle aussi 24. */ ?> Au début de ce chapitre, nous avons dit que nous allions décrire les différents types d’instructions, et donc, comme promis, nous allons voir que les expressions peuvent être des instructions. Mais, attention, toutes les expressions ne sont pas des instructions. Dans ce cas-là, une instruction est de la forme ’expr’ ’;’, c’est-à-dire, une expression suivie par un point-virgule. L’expression ’$b = $a = 5;’, ’$a = 5’ est valide, mais ce n’est pas une instruction en elle-même. ’$b = $a = 5’ est une instruction valide. La dernière chose qui mérite d’être mentionnée est la véritable valeur des expressions. Lorsque vous faîtes des tests sur une variable, dans une boucle conditionnelle par exemple, cela ne vous intéresse pas de savoir qu’elle est la valeur exacte de l’expression. Mais vous voulez seulement savoir si le résultat signifie TRUE ou FALSE (PHP n’a pas de type booléen). La véritable valeur d’une expression en PHP est calculée de la même manière qu’en Perl. Toute valeur numérique différente de 0 est considérée comme étant TRUE. Une chaîne de caractères vide et la chaîne de caractère 0 sont considérées comme FALSE. Toutes les autres valeurs sont vraies. Avec les types de variables non-scalaires (les tableaux et les objets), s’ils ne contiennent aucun élément, renvoient FALSE, sinon, ils renvoient TRUE. PHP propose une implémentation complète et détaillée des expressions. PHP documente toutes ses expressions dans le manuel que vous êtes en train de lire. Les exemples qui vont suivre devraient vous donner une bonne idée de ce qu’est une expression et comment construire vos propres expressions. Dans tout ce qui va suivre, nous écrirons expr pour indiquer toute expression PHP valide. 95 Chapitre 10. Les opérateurs 96 Chapitre 10. Les opérateurs Les opérateurs arithmétiques Vous rappelez-vous des opérations élémentaires apprises à l’école ? Tableau 10-1. Opérations élémentaires Exemple Nom Résultat $a + $b Addition Somme de $a et $b. $a - $b Soustraction Différence de $a et $b. $a * $b Multiplication Produit de $a et $b. $a / $b Division Quotient de $a et $b. $a % $b Modulo Reste de $a divisé par $b. L’opérateur de division ("/") retourne une valeur entière (le résultat d’une division entière) si les deux opérandes sont entiers (ou bien des chaînes converties en entier. Si l’un des opérandes est un nombre à virgule flottante, ou bien le résultat d’une opération qui retourne une valeur non entière, un nombre à virgule flottante sera retourné. Les opérateurs d’assignation L’opérateur d’assignation le plus simple est le signe "=". Le premier réflexe est de penser que ce signe veut dire "égal à". Ce n’est pas le cas. Il signifie que l’opérande de gauche se voit affecter la valeur de l’expression qui est à droite du signe égal. La valeur d’une expression d’assignation est la valeur assignée. Par exemple, la valeur de l’expression ’$a = 3’ est la valeur 3. Cela permet d’utiliser des astuces telles que : <?php $a = ($b = 4) + 5; // $a est maintenant égal à 9, et $b vaut 4. ?> En plus du simple opérateur d’assignation, il existe des "opérateurs combinés" pour tous les opérateurs arithmétiques et pour les opérateurs sur les chaînes de caractères. Cela permet d’utiliser la valeur d’une variable dans une expression et d’affecter le résultat de cette expression à cette variable. Par exemple: <?php $a = 3; $a += 5; // affecte la valeur 8 à la variable $a. // correspond à l’instruction ’$a = $a + 5’); $b = "Bonjour "; $b .= " tout le monde!"; // affecte la valeur "Bonjour tout le monde!" à // la variable $b // identique à $b = $b." tout le monde!"; ?> On peut noter que l’assignation copie le contenu de la variable originale dans la nouvelle variable (assignation par valeur), ce qui fait que les changements de valeur d’une variable ne modifieront pas la valeur de l’autre. Cela peut se revéler important lors de la copie d’un grand tableau durant une boucle. PHP 4 supporte aussi l’assignation par référence, en utilisant la syntaxe $var = &$othervar;, mais ce n’était pas possible en PHP 3. ’L’assignation par référence’ signifie que les deux variables contiennent les mêmes données, et que la modification de l’une affecte l’autre. D’un autre côté, la recopie est très rapide. 97 Chapitre 10. Les opérateurs Opérateurs sur les bits Les opérateurs sur les bits vous permettent de manipuler les bits dans un entier. Tableau 10-2. Les opérateurs sur les bits Exemple Nom Résultat $a & $b ET (AND) Les bits positionnés à 1 dans $a ET dans $b sont positionnés à 1. $a | $b OU (OR) Les bits positionnés à 1 dans $a OU $b sont sont positionnés à 1. $a ^ $b Xor Les bits positionnés à 1 dans $a OU dans $b sont positionnés à 1. ~ $a NON (Not) Les bits qui sont positionnés à 1 dans $a sont positionnés à 0, et vice versa. $a << $b Décalage à gauche Décale les bits de $a dans $b par la gauche (chaque décalage équivaut à une multiplication par 2). $a >> $b Décalage à droite Décalage des bits de $a dans $b par la droite (chaque décalage équivaut à une division par 2). Opérateurs de comparaison Les opérateurs de comparaison, comme leur nom l’indique, vous permettent de comparer deux valeurs. Tableau 10-3. Opérateurs de comparaison Exemple Nom Résultat $a == $b Egal Vrai si $a est égal à $b. $a === $b Identique Vrai si $a est égal à $b et qu’ils sont de même type (PHP 4 seulement). $a != $b Différent Vrai si $a est différent de $b. $a <> $b Différent Vrai si $a est différent de $b. $a < $b Plus petit que Vrai si $a est plus petit strictement que $b. $a > $b Plus grand Vrai si $a est plus grand strictement que $b. $a <= $b Inférieur ou égal Vrai si $a est plus petit ou égal à $b. $a >= $b Supérieur ou égal Vrai si $a est plus grand ou égal à $b. Un autre opérateur conditionnel est l’opérateur ternaire (":?"), qui fonctionne comme en langage C. <?php (expr1) ? (expr2) : (expr3); ?> Cette expression renvoie la valeur de l’expression expr2 si l’expression expr1 est vraie, et l’expression expr3 si l’expression expr1 est fausse. Opérateur de contrôle d’erreur PHP supporte un opérateur de contrôle d’erreur : c’est @. Lorsque cet opérateur est ajouté en préfixe d’une expression PHP, les messages d’erreur qui peuvent être générés par cette expression seront ignorés. 98 Chapitre 10. Les opérateurs Si l’option track_errors est activée, les messages d’erreurs générés par une expression seront sauvés dans la variable globale $php_errormsg. Cette variable sera écrasée à chaque erreur. Il faut alors la surveiller souvent pour pouvoir l’utiliser. <?php /* Erreur intentionnelle (le fichier n’existe pas): */ $my_file = @file (’non_persistent_file’) or die ("Impossible d’ouvrir le fichier : L’erreur est : ’$php_errormsg’"); // Cela fonctionne avec n’importe quelle expression, pas seulement les fonctions $value = @$cache[$key]; // la ligne ci-dessus n’affichera pas d’alerte si la clé $key du tableau n’existe pas ?> Note : L’opérateur @ ne fonctionne qu’avec les expressions. La règle générale de fonctionnement est la suivante : si vous pouvez prendre la valeur de quelquechose, vous pouvez le préfixer avec @. Par exemple, vous pouvez ajouter @ aux variables, fonctions, à include(), aux constantes, etc... Vous ne pourrez pas le faire avec des éléments de langage tels que les classes, if et foreach, etc... Note : La plupart des fonctions d’accès aux bases de données ne retournent pas d’erreur PHP. Il faut y accéder avec une fonction du type base_de_donnees_get_error(). Voir aussi error_reporting(). Opérateur d’exécutions PHP supporte un opérateur d’exécution : guillemets obliques ("“"). Notez bien la différence entre les guillemets simples (sur la touche 4), et ceux-ci (sur la touche de la livre anglaise). PHP essaiera d’exécuter le contenu de ces guillemets obliques comme une commande shell. Le résultat sera retourné (i.e. : il ne sera pas simplement envoyé à la sortie standard, il peut être assigné à une variable). <?php $output = ‘ls -al‘; echo "<pre>$output</pre>"; ?> Note : Cet opérateur est désactivé lorsque le safe mode est activé. Voir aussi system(), passthru(), exec(), popen() et escapeshellcmd(). Opérateurs d’incrémentation/Décrémentation PHP supporte les opérateurs de pré et post incrémentation et décrémentation, comme en C. Tableau 10-4. Opérateurs d’incrémentation/Décrémentation Exemple Nom Résultat ++$a Pré-incrémente Incrémente $a de 1, puis retourne $a. $a++ Post-incrémente Retourne $a, puis l’incrémente de 1. --$a Pré-décrémente Décrémente $a de 1, puis retourne $a. $a-- Post-décrémente Retourne $a, puis décrémente $a de 1. Voici un exempla simple 99 Chapitre 10. Les opérateurs <?php echo $a = echo echo echo $a = echo echo echo $a = echo echo echo $a = echo echo ?> "<h3>Post-incrémentation</h3>"; 5; "Devrait valoir 5: " . $a++ . "<br>\n"; "Devrait valoir 6: " . $a . "<br>\n"; "<h3>Pré-incrémentation</h3>"; 5; "Devrait valoir 6: " . ++$a . "<br>\n"; "Devrait valoir 6: " . $a . "<br>\n"; "<h3>Post-décrémentation</h3>"; 5; "Devrait valoir 5: " . $a-- . "<br>\n"; "Devrait valoir 4: " . $a . "<br>\n"; "<h3>Pré-décrémentation</h3>"; 5; "Devrait valoir 4: " . --$a . "<br>\n"; "Devrait valoir 4: " . $a . "<br>\n"; Les opérateurs logiques Tableau 10-5. Les opérateurs logiques Exemple Nom Résultat $a and $b ET (And) Vrai si $a ET $b sont vrais. $a or $b OU (Or) Vrai si $a OU $b est vrai $a xor $b XOR (Xor) Vrai si $a OU $b est vrai, mais pas les deux en même temps. ! $a NON (Not) Vrai si $a est faux. $a && $b ET (And) Vrai si $a ET $b sont vrais. $a || $b OU (Or) Vrai si $a OU $b est vrai. La raison pour laquelle il existe deux types de "ET" et de "OU" est qu’ils ont des priorités différentes. Voir le paragraphe précédence d’opérateurs. La précédence des opérateurs La priorité des opérateurs spécifie l’ordre dans lequel les valeurs doivent être analysées. Par exemple, dans l’expression 1 + 5 * 3, le résultat est 16 et non 18, car la multiplication ("*") à une priorité supérieure par rapport à à l’addition ("+"). Le tableau suivant dresse une liste de la priorité des différents opérateurs dans un ordre croissant de priorité. Tableau 10-6. Précédence des opérateurs Associativité Opérateurs gauche , gauche or gauche xor gauche and droite print gauche = += -= *= /= .= %= &= |= ^= ~= <<=>>= gauche ?: gauche || 100 Chapitre 10. Les opérateurs Associativité Opérateurs gauche && gauche | gauche ^ gauche & non-associative == != === non-associative < <= > >= gauche << >> gauche +-. gauche */% droite ! ~ ++ -- (int) (double) (string) (array) (object) @ droite [ non-associative new Opérateurs de chaînes Il y a deux opérateurs de chaînes. Le premier est l’opérateur de concaténation (’.’), qui retourne la concaténation de ses deux arguments. Le second est l’opérateur d’assignation concaténant (’.=’). Reportez-vous à Opérateurs d’assignations pour plus de détails. <?php $a = "Bonjour "; $b = $a . "Monde!"; // $b contient "Bonjour Monde!" $a = "Bonjour "; $a = $a . "Monde!"; // $a contient "Bonjour Monde!" ?> 101 Chapitre 11. Les structures de contrôle 102 Chapitre 11. Les structures de contrôle Tous les scripts PHP sont une suite d’instructions. Une instruction peut être une assignation, un appel de fonction, une instruction conditionnelle ou bien une instruction qui ne fait rien (une instruction vide). Une instruction se termine habituellement par un point virgule (";"). De plus, plusieurs instructions peuvent être regroupées en bloc, délimité par des accolades ("{}"). Un bloc est considéré comme une instruction. Les différents types d’instruction sont décrits dans ce chapitre. if L’instruction if est une des plus importantes instructions de tous les langages, PHP inclus. Elle permet l’exécution conditionnelle d’une partie de code. Les fonctionnalités de l’instruction if sont les mêmes en PHP qu’en C : <?php if (expression) commandes ?> Comme nous l’avons vu dans le paragraphe consacré aux expressions, expr est évaluée à sa vraie valeur. Si l’expression expr est TRUE, PHP exécutera l’instruction et si elle est FALSE, l’instruction sera ignorée. L’exemple suivant affiche la phrase a est plus grand que b si $a est plus grand que $b: <?php if ($a > $b) print "a est plus grand que b"; ?> Souvent, vous voulez que plusieurs instructions soient exécutées après un branchement conditionnel. Bien évidemment, il n’est pas obligatoire de répéter l’instruction conditionnelle autant de fois que vous avez d’instructions à exécuter. A la place, vous pouvez rassembler toutes les instructions dans un bloc. L’exemple suivant affiche a est plus grand que b, et assigne la valeur de la variable $a à la variable $b: <?php if ($a > $b) { print "a est plus grand que b"; $b = $a; } ?> Vous pouvez imbriquer indéfiniment des instructions if les unes dans les autres, ce qui permet une grande flexibilité dans l’exécution d’une partie de code suivant un grand nombre de conditions. else Souvent, vous voulez exécuter une instruction si une condition est remplie, et une autre instruction si cette condition n’est pas remplie. C’est à cela que sert else. else fonctionne après un if et exécute les instructions correspondantes au cas oú l’expression du if est FALSE. Dans l’exemple suivant, ce bout de code affiche a est plus grand que b si la variable $a est plus grande que la variable $a, et a est plus petit que b sinon: <?php if ($a > $b) { print "a est plus grand que b"; } else { print "a est plus petit que b"; } ?> 103 Chapitre 11. Les structures de contrôle Les instructions après le else ne sont exécutées que si l’expression du if est FALSE, et si elle n’est pas suivi par l’expression elseif. elseif elseif, comme son nom l’indique, est une combinaison de if et de else. Comme l’expression else, il permet d’exécuter une instruction aprè un if dans le cas oú le "premier" if est évalué comme FALSE. Mais, à la différence de l’expression else, il n’exécutera l’instruction que si l’expression condionnelle elseif est évaluée comme TRUE. L’exemple suivant affichera a est plus grand que b, a est égal à b ou a est plus petit que b: <?php if ($a > $b) print "a } elseif ($a print "a } else { print "a } ?> { est plus grand que b"; == $b) { est égal à b"; est plus petit que b"; Vous pouvez avoir plusieurs elseif qui s’imbriquent les uns dans les autres, après un if initial. Le premier elseif qui sera évalué à TRUE sera exécuté. En PHP, vous pouvez aussi écrire "else if" en deux mots et son comportement sera identique à la version en un seul mot. L’expression elseif est exécutée seulement si le if précédent et tout autre elseif précédent est évalués comme FALSE, et que votre elseif est évalué à TRUE. Syntaxe alternative Avertissement Cette syntaxe alternative est obsolète depuis PHP 4. Elle génère un code qui est tout simplement illisible, et il est très difficile de la combiner avec la syntaxe normale. Bien que cela ne soit pas à l’ordre du jour aujourd’hui, cette syntaxe risque de disrparaitre à terme. Soyez prévenus. Le PHP propose une autre manière de rassembler des instructions à l’intérieur d’un bloc, pour les fonctions de contrôle if, while, for, foreach et switch. Dans chaque cas, le principe est de remplacer l’accolade d’ouverture par deux points (:) et l’accolade de fermeture par, respectivement, endif;, endwhile;, endfor;, ou endswitch;. <?php if ($a == 5): ?> A vaut 5 <?php endif; ?> Dans l’exemple ci-desssus, le block HTML "A = 5" est inclus à l’intérieur d’un if en utilisant cette nouvelle syntaxe. Ce code HTML ne sera affiché que si la variable $a est égale à 5. Cette autre syntaxe fonctionne aussi avec le else et elseif. L’exemple suivant montre une structure avec un if, un elsif et un else utilisant cette autre syntaxe: <?php if ($a == 5): print "a égale 5"; print "..."; elseif ($a == 6): print "a égale 6"; 104 Chapitre 11. Les structures de contrôle print "!!!"; else: print "a ne vaut ni 5 ni 6"; endif; ?> Allez voir while, for, et if pour d’autres exemples. while La boucle while est le moyen le plus simple d’implémenter une boucle en PHP. Cette boucle se comporte de la même manière qu’en C. L’exemple le plus simple d’une boucle while est le suivant : <?php while (expression) commandes ?> La signification d’une boucle while est très simple. Le PHP exécute l’instruction tant que l’expression de la boucle while est évaluée comme TRUE. La valeur de l’expression est vérifiée à chaque début de boucle, et, si la valeur change durant l’exécution de l’instruction, l’exécution ne s’arrêtera qu’à la fin de l’itération (chaque fois que le PHP exécute l’instruction, on appelle cela une itération). De temps en temps, si l’expression du while est FALSE avant la première itération, l’instruction ne sera jamais exécutée. Comme avec le if, vous pouvez regrouper plusieurs instructions dans la même boucle while en les regroupant à l’intérieur de parenthèses ou en utilisant la syntaxe suivante: <?php while (expression): commandes ... endwhile; ?> Les exemples suivants sont identiques, et affichent tous les nombres de 1 à 10: <?php /* exemple 1 */ $i = 1; while ($i <= 10) { print $i++; /* La valeur affiche est $i avant l’incrémentation (post-incrémentation) */ } /* exemple 2 */ $i = 1; while ($i <= 10): print $i; $i++; endwhile; ?> do..while Les boucles do..while ressemblent beaucoup aux boucles while, mais l’expression est testée à la fin de chaque itération plutôt qu’au début. La principale différence par rapport à la boucle while est que la première itération de la boucle do..while est toujours exécutée (l’expression n’est testée qu’à la fin de l’itération), ce qui n’est pas le cas lorsque vous utilisez une boucle while (l’expression est vérifiée au début de chaque itération). 105 Chapitre 11. Les structures de contrôle Il n’y a qu’une syntaxe possible pour les boucles do..while: <?php $i = 0; do { print $i; } while ($i>0); ?> La boucle ci-dessus ne va être exécutée qu’une seule fois, car lorsque l’expression est évaluée, elle vaut FALSE (car la variable $i n’est pas plus grande que 0) et l’exécution de la boucle s’arrête. Les utilisateurs familiers du C sont habitués à une utilisation différente des boucles do..while , qui permet de stopper l’exécution de la boucle au milieu des instructions, en l’encapsulant dans un do..while(0) la fonction break. Le code suivant montre une utilisation possible: <?php do { if ($i < 5) { print "i n’est pas suffisamment grand"; break; } $i *= $factor; if ($i < $minimum_limit) { break; } print "i est bon"; ...process i... } while(0); ?> Ne vous inquiétez pas si vous ne comprenez pas tout correctement. Vous pouvez écrire des scripts très très puissants sans utiliser cette fonctionnalité. for Les boucles for sont les boucles les plus complexes en PHP. Elles fonctionnent comme les boucles for du langage C. La syntaxe des boucles for est la suivante: <?php for (expr1; expr2; expr3) statement ?> La première expression (expr1) est évaluée (exécutée), quoi qu’il arrive au début de la boucle. Au début de chaque itération, l’expression expr2 est évaluée. Si l’évaluation vaut TRUE, la boucle continue et l’instruction est exécutée. Si l’évaluation vaut FALSE, l’exécution de la boucle s’arrête. A la fin de chaque itération, l’expression expr3 est évaluée (exécutée). Les expressions peuvent éventuellement être laissées vides. Si l’expression expr2 est laissée vide, cela signifie que c’est une boucle infinie (PHP considère implicitement qu’elle vaut TRUE, comme en C). Cela n’est pas vraiment très utile, à moins que vous souhaitiez terminer votre boucle par l’instruction conditionnelle break. Considérons les exemples suivants. Tous affichent les chiffres de 1 à 10: <?php /* exemple 1 */ for ($i = 1; $i <= 10; $i++) { 106 Chapitre 11. Les structures de contrôle print $i; } /* exemple 2 */ for ($i = 1;;$i++) { if ($i > 10) { break; } print $i; } /* exemple 3 */ $i = 1; for (;;) { if ($i > 10) { break; } print $i; $i++; } /* exemple 4 */ for ($i = 1; $i <= 10; print $i, $i++) ; ?> Bien évidemment, le premier exemple est le plus simple de tous (ou peut être le quatrième), mais vous pouvez aussi pensez qu’utiliser une expression vide dans une boucle for peut être utile parfois. PHP supporte aussi la syntaxe alternative suivante pour les boucles for : <?php for (expr1; expr2; expr3): statement; ...; endfor; ?> Les autres langages ont l’instruction foreach pour accéder aux éléments d’un tableau. PHP 3 ne dispose pas d’une telle fonction; PHP 4 en dispose (voir foreach). En PHP 3, vous pouvez combiner while avec list() et each() pour obtenir le même résultat. Reportez-vous aux exemples de la documentation. foreach PHP 4 (mais pas PHP 3) inclut une commande foreach, comme en Perl ou d’autres langages. C’est un moyen simple de passer en revue un tableau. Il y a deux syntaxes possibles : la seconde est une extension mineure mais pratique de la première: <?php foreach(array_expression as $value) commandes foreach(array_expression as $key => $value) commandes ?> La première forme passe en revue le tableau array_expression. A chaque itération, la valeur de l’élément courant est assignée à $value et le pointeur interne de tableau est avancé d’un élément (ce qui fait qu’à la prochaine itération, on accédera à l’élément suivant). La deuxième forme fait exactement la même chose, mais c’est la clé de l’élément courant qui est assigné à la variable $key. Lorsque foreach démarre, le pointeur interne de fichier est automatiquement ramené au premier élément du tableau. Cela signifie que vous n’aurez pas à faire appel à reset() avant foreach. Note : De plus, notez que foreach travaille sur une copie du tableau spécifié, et pas sur le tableau lui-même. Par conséquent, le pointeur de tableau n’est pas modifié, comme il le serait avec le fonction each(), et les modifications faites dans le tableau ne seront pas prises en compte dans le tableau original. 107 Chapitre 11. Les structures de contrôle Note : foreach n’accepte pas l’opérateur de supppression des erreurs @. Vous pouvez remarquer que les exemples suivants fonctionnent de manière identique : <?php reset($arr); while (list(, $value) = each ($arr)) { echo "Valeur: $value<br>\n"; } foreach ($arr as $value) { echo "Valeur: $value<br>\n"; } ?> Les exemples suivants sont aussi fonctionnellement identiques : <?php reset($arr); while (list($key, $value) = each ($arr)) { echo "Clé: $key; Valeur: $value<br>\n"; } foreach ($arr as $key => $value) { echo "Clé: $key; Valeur: $value<br>\n"; } ?> Voici quelques exemples de plus : <?php /* exemple 1: valeurs seules */ $a = array (1, 2, 3, 17); foreach ($a as $v) { print "Valeur courante de \$a: $v.\n"; } /* exemple 2: valeurs (avec la clé correspondante) */ $a = array (1, 2, 3, 17); $i = 0; /* pour l’illustration uniquement */ foreach($a as $v) { print "\$a[$i] => $v.\n"; } /* exemple 3: clé et valeur */ $a = array ( "un" => 1, "deux" => 2, "trois" => 3, "dix-sept" => 17 ); foreach($a as $k => $v) { print "\$a[$k] => $v.\n"; } /* exemple 4: tableaux multi-dimensionnels */ $a[0][0] = "a"; $a[0][1] = "b"; $a[1][0] = "y"; $a[1][1] = "z"; foreach($a as $v1) { foreach ($v1 as $v2) { print "$v2\n"; } } 108 Chapitre 11. Les structures de contrôle /* exemple 5: tableaux dynamique */ foreach(array(1, 2, 3, 4, 5) as $v) { print "$v\n"; } ?> break L’instruction break permet de sortir d’une structure for, while, foreach ou switch. break accepte un argument numérique optionnel qui vous indiquera combien de structures emboitées ont été interrompues. <?php $i = 0; while ($i < 10) { if ($arr[$i] == "stop") { break; /* Vous pouvez aussi écrire ’break 1;’ ici. */ } $i++; } /* Utilisation de l’argument optionnel. */ $i = 0; while ( ++$i ) { switch ( $i ) { case 5: echo "à 5<br>\n"; break 1; /* Ne sort que du switch. */ case 10: echo "à 10; quitting<br>\n"; break 2; /* Sort du switch et du while. */ default: break; } } ?> continue L’instruction continue est utilisée dans une boucle afin d’éluder les instructions de l’itération courante afin de passer directement à l’itération suivante. continue accepte un argument numérique optionnel qui vous indiquera combien de structures emboitées ont été ignorées. <?php while (list ($cle, $valeur) = each ($arr)) { if (!($cle % 2)) { // évite les membres impairs continue; } fonction_quelconque($valeur); } $i = 0; while ($i++ < 5) { echo "Dehors<br>\n"; while (1) { echo " Milieu<br>\n"; while (1) { echo " Intérieur<br>\n"; continue 3; 109 Chapitre 11. Les structures de contrôle } echo "Ceci n’est jamais atteint.<br>\n"; } echo "Ceci non plus.<br>\n"; } ?> switch L’instruction switch équivaut à une série d’instructions if. En de nombreuses occasions, vous aurez besoin de comparer la même variable (ou expression) avec un grand nombre de valeurs différentes, et d’exécuter différentes parties de code suivant la valeur à laquelle elle est égale. C’est exactement à cela que sert l’instruction switch. Les deux exemples suivants sont deux manières différentes d’écrire la même chose, l’une en utilisant une séries de if, et l’autre en utilisant l’instruction switch: <?php if ($i == 0) { print "i égale 0"; } if ($i == 1) { print "i égale 1"; } if ($i == 2) { print "i égale 2"; } switch ($i) { case 0: print "i égale 0"; break; case 1: print "i égale 1"; break; case 2: print "i égale 2"; break; } ?> Il est important de comprendre que l’instruction switch exécute chacune des clauses dans l’ordre. L’instruction switch est exécutée ligne par ligne. Au début, aucun code n’est exécuté. Seulement lorsqu’un case est vérifié, PHP exécute alors les instructions correspondantes. PHP continue d’exécuter les instructions jusqu’à la fin du bloc d’instructions du switch, ou bien dès qu’il trouve l’instruction break. Si vous ne pouvez pas utiliser l’instruction break à la fin de l’instruction case, PHP continuera à exécuter toutes les instructions qui suivent. Par exemple : <?php switch ($i) { case 0: print "i égale 0"; case 1: print "i égale 1"; case 2: print "i égale 2"; } ?> 110 Chapitre 11. Les structures de contrôle Dans cet exemple, si $i est égal à 0, PHP va exécuter quand même toutes les instructions qui suivent. Si $i est égal à 1, PHP exécutera les deux dernières instructions. Et seulement si $i est égal à 2, vous obtiendrez le résultat escompté, c’est-à-dire, l’affiche de "i égal 2". Donc, l’important est de ne pas oublier l’instruction break (même s’il est possible que vous l’omettiez dans certaines circonstances). Dans une commande switch, une condition n’est évaluée qu’une fois, et le résultat est comparé à chaque case. Dans une structure elseif, les conditions sont évaluées à chaque comparaison. Si votre condition est plus compliquée qu’une simple comparaison, ou bien fait partie d’une boucle, switch sera plus rapide. La liste de commandes d’un case peut être vide, auquel cas PHP utilisera la liste de commandes du cas suivant. <?php switch ($i) { case 0: case 1: case 2: print "i est plus petit que 3 mais n’est pas négatif"; break; case 3: print "i égale 3"; } ?> Un case spécial est default. Ce cas est utilisé lorsque tous les case ont échoués. Il doit être le dernier cas listé. Par exemple : <?php switch ($i) { case 0: print "i break; case 1: print "i break; case 2: print "i break; default: print "i } ?> égale 0"; égale 1"; égale 2"; n’est ni égal à 2, ni à 1, ni à 0."; Une autre chose à mentionner est que l’instruction case peut être une expression à de type scalaire, c’est-à-dire nombre entier, nombre à virgule flottante et chaîne de caractères. Les tableaux sont sans intérêt dans ce contexte-là. La syntaxe alternative pour cette structure de contrôle est la suivante : pour plus d’informations, voir syntaxes alternatives). <?php switch ($i): case 0: print "i break; case 1: print "i break; case 2: print "i break; default: print "i endswitch; égale 0"; égale 1"; égale 2"; n’est ni égal à 2, ni à 1, ni à 0"; 111 Chapitre 11. Les structures de contrôle ?> declare L’élément de langage declare sert à ajouter des directives d’éxécutions dans un bloc de code. La syntaxe de declare est similaire à la syntaxe des autres fonctions de contrôle : <?php declare (directive) statement ?> L’expression directive permet de contrôler l’intervention du bloc declare. Actuellement, une seule directive est reconnue : la directive ticks (Voir plus bas pour plus de détails) sur les ticks). L’expression statement du bloc de declare sera exécutée. Comment elle sera exécutée, et quels effets cela aura dépend de la directive utilisée dans le bloc directive. Ticks Un tick est un événement qui intervient toutes les N commandes bas niveau, exécutées par l’analyseur dans le bloc de declare. La valeur de N est spécifiée avec la syntaxe ticks=N dans le bloc de directive declare. Un événement qui intervient à chaque tick est spécifié avec la fonction register_tick_function(). Reportez vous à l’exemple ci-dessous pour plus de détails. Notez que plus d’un événement peut intervenir par tick. <PRE> <?php // Un fonction qui enregistre l’heure à laquelle elle est appelée function profile($dump = FALSE){ static $profile; // Retourne les horaires stockés dans le profile, et l’efface if ($dump) { $temp = $profile; unset ($profile); return ($temp); } $profile[] = microtime (); } // Enregistre un gestionnaire de tick register_tick_function("profile"); // Initialise la fonction avant le bloc de déclaration profile(); // Exécute un bloc de code, et appele un tick toutes les deux secondes declare (ticks=2) { for ($x = 1; $x < 50; ++$x) { echo similar_text(md5($x), md5($x*$x)), "<br>"; } } ?> Pour voir le résultat : <?php // Affiche les données de la variable $profile print_r(profile(TRUE)); ?> </pre> 112 Chapitre 11. Les structures de contrôle Cet exemple profile le code PHP dans le bloc de déclaration, et enregistre l’heure de chaque commande bas niveau. Cette information peut être réutilisée pour débusquer les segments de code lents. Vous pouvez implémenter d’autres méthodes, mais les ticks sont plus rapides et plus efficaces. Les ticks sont bien pratiques pour débugger, implémenter un multi-tâches simple, des entrées sorties en tâche de fond, ou bien d’autres choses, avec PHP. Voir aussi register_tick_function() et unregister_tick_function(). require() La commande require() se remplace elle-même par le contenu du fichier spécifié, comme les préprocesseurs C le font avec la commande #include. Il est important de noter que lorsqu’un fichier est include() ou require(), les erreurs d’analyse apparaîtront en HTML tout au début du fichier, et l’analyse du fichier parent ne sera pas interrompue. Pour cette raison, le code qui est dans le fichier doit être placé entre les balises habituelles de PHP. require() n’est pas vraiment une fonction PHP : c’est plus une instruction du langage. Elle ne fonctionne pas comme les fonctions standards. Par exemple, require() est indépendante des structures de contrôle (cela ne sert à rien de la placer dans une condition, elle sera toujours exécutée). De plus, elle ne retourne aucune valeur. Lire une valeur retournée par un require() retourne une erreur d’analyse. Contrairement à include(), require() va toujours lire dans le fichier cible, même si la ligne n’est jamais exécutée. Si vous souhaitez une inclusion conditionnelle, utilisez include(). La condition ne va jamais affecter require(). Cependant, si la ligne de require() n’est jamais exécutée, le code du fichier ne le sera jamais non plus. Les boucles n’affectent pas le comportement de require(). Même si le code contenu dans le fichier source est appelé dans la boucle, require() n’est exécuté qu’une fois. Cela signifie qu’on ne peut pas mettre un require() dans une boucle, et s’attendre à ce qu’il inclue du code à chaque itération. Pour cela, il faut utiliser include(). <?php require(’header.inc’); ?> Attention : include() et require() ajoutent le contenu du fichier cible dans le script lui-même. Elles n’utilisent pas le protocole HTTP ou tout autre protocole. Toute variable qui est dans le champs du script sera accessible dans le fichier d’inclusion, et vice-versa. <?php require ("file.inc?varone=1&vartwo=2"); /* Ne fonctionne pas. */ $varone = 1; $vartwo = 2; require ("file.inc"); /* $varone et $vartwo seront accessibles à file.inc */ ?> Ne vous laissez pas abuser par le fait que vous pouvez requérir ou inclure des fichiers via HTTP en utilisant la fonctionnalité de gestion des fichiers distants ce qui est au dessus reste vrai. En PHP 3, il est possible d’exécuter une commande return depuis un fichier inclut, tant que cette commande intervient au niveau global du fichier inclus. Elle ne doit intervenir dans aucun bloc (entre accolade {}). En PHP 4, cette possibilité a été supprimée. Si vous en avez besoin, utilisez plutôt include(). 113 Chapitre 11. Les structures de contrôle include() La fonction include() inclus et évalue le fichier spécifié en argument. Il est important de noter que lorsqu’un fichier est include() ou require(), les erreurs d’analyse apparaîtront en HTML tout au début du fichier, et l’analyse du fichier parent ne sera pas interrompue. Pour cette raison, le code qui est dans le fichier doit être placé entre les balises habituelles de PHP. Cela se produit à chaque fois que la fonction include() est rencontrée. Donc, vous pouvez utiliser la fonction include() dans une boucle pour inclure un nombre infini de fois un fichier, ou même des fichiers différents. <?php $files = array (’premier.inc’, ’second.inc’, ’troisieme.inc’); for ($i = 0; $i < count($files); $i++) { include $files[$i]; } ?> include() diffère de require() car le fichier inclus est ré-évaluée à chaque fois que la commande est exécutée, tandis que require() est remplacée par le fichier cible lors de la première exécution, que son contenu soit utilisé ou non. De plus, cela se fait même s’il est placé dans une structure conditionnelle, comme dans un if). Parceque la fonction include() nécessite une construction particulière, vous devez l’inclure dans un bloc si elle est incluse dans une structure conditionnelle. <?php /* Ceci est faux, et ne fonctionnera pas comme on l’attend. */ if ($condition) include($file); else include($other); /* Ceci est CORRECT. */ if ($condition) { include($file); } else { include($other); } ?> En PHP 3, il est possible d’exécuter une commande return depuis un fichier inclus, tant que cette commande intervient au niveau global du fichier inclus. Elle ne doit intervenir dans aucun bloc (entre accolade {}). En PHP 4, cette possibilité a été supprimée. Cependant, PHP 4 vous autorise à retourner des valeurs d’un fichier inclus. Vous pouvez traiter include() comme une fonction normale, qui retourne une valeur. Mais cela génère une erreur d’analyse en PHP 3. Exemple 11-1. include() en PHP 3 et PHP 4 On suppose que le fichier test.inc existe, et est placé dans le même dossier que le fichier principal : <?php echo "Avant le retour<br>\n"; if (1) { return 27; } echo "Après le retour <br>\n"; ?> On suppose que le fichier main.html contient ceci : <?php $retval = include (’test.inc’); echo "Fichier inclus: ’$retval’<br>\n"; ?> 114 Chapitre 11. Les structures de contrôle Lorsque main.html est appelé en PHP 3, il va générer une erreur d’analyse (parse error) à la ligne 2; vous ne pouvez pas vous attendre à un retour sur une fonction include() en PHP 3. En PHP 4, cependant,le résultat sera : Avant le retour Ficher inclus : ’27’ Supposons maintenant que main.html a été modifié et contient maintenant le code suivant : <?php include (’test.inc’); echo "Retour dans le main.html<br>\n"; ?> En PHP 4, l’affichage sera : Avant le retour Retour dans le main.html Au contraire, PHP 3 affichera : Avant le retour 27Retour dans le main.html Parse error: parse error in /home/torben/public_html/phptest/main.html on line 5 L’erreur d’analyse ci-dessus est le résultat du fait que la commande return est dans un bloc qui n’est pas une fonction, dans test.inc. Lorsque le return est sorti du bloc, l’affichage devient : Avant le retour 27Retour dans le main.html Le ’27’ est du au fait que PHP 3 ne supporte pas le return dans ces fichiers. Il est important de noter que lorsqu’un fichier est include() ou require(), les erreurs d’analyse apparaîtront en HTML tout au début du fichier, et l’analyse du fichier parent ne sera pas interrompue. Pour cette raison, le code qui est dans le fichier doit être placé entre les balises habituelles de PHP. <?php include $varone $vartwo include ?> ("file.inc?varone=1&vartwo=2"); /* ne fonctionne pas. */ = 1; = 2; ("file.inc"); /* $varone et $vartwo sont accessibles dans file.inc */ Ne vous laissez pas abuser par le fait que vous pouvez requérir ou inclure des fichiers via HTTP en utilisant la fonctionnalité de gestion des fichiers distants ce qui est au dessus reste vrai. Voir aussi readfile(), require() et virtual(). require_once() La commande require_once() se remplace elle-même par le fichier spécifié, un peu comme les commandes de préprocesseur C #include, et ressemble sur ce point à require(). La principale différence est qu’avec require_once(), vous êtes assurés que ce code ne sera ajouté qu’une seule fois, évitant de ce fait les redéfinitions de variables ou de fonctions, génératrices d’alertes. Par exemple, si vous créez les deux fichiers d’inclusion utils.inc et foolib.inc 115 Chapitre 11. Les structures de contrôle Exemple 11-2. utils.inc <?php define(PHPVERSION, floor(phpversion())); echo "LES GLOBALES SONT SYMPAS\n"; function goodTea() { return "Le Earl Grey est délicieux!"; } ?> Exemple 11-3. foolib.inc <?php require ("utils.inc"); function showVar($var) { if (PHPVERSION == 4) { print_r($var); } else { dump_var($var); } } // Une série de fonctions ?> Puis, vous écrivez un script cause_error_require.php Exemple 11-4. cause_error_require.php <?php require("foolib.inc"); /* Ceci génère une erreur*/ require("utils.inc"); $foo = array("1",array("complex","quaternion")); echo "Ce code requiert utils.inc une deuxième fois, car il est requis \n"; echo "dans foolib.inc\n"; echo "Utilisation de GoodTea: ".goodTea()."\n"; echo "Affichage de foo: \n"; showVar($foo); ?> Lorsque vous exécutez le script ci-dessus, le résultat sera (sous PHP 4.01pl2): GLOBALS ARE NICE GLOBALS ARE NICE Fatal error: Cannot redeclare causeerror() in utils.inc on line 5 En modifiant foolib.inc et cause_errror_require.php pour qu’elles utilisent require_once() au lieu de require() et ne renommant pas le fichier en avoid_error_require_once.php, on obtient : Exemple 11-5. foolib.inc (corrigé) <?php require_once("utils.inc"); function showVar($var) { ?> 116 Chapitre 11. Les structures de contrôle Exemple 11-6. avoid_error_require_once.php <?php require_once("foolib.inc"); require_once("utils.inc"); $foo = array("1",array("complexe","quaternion")); ?> L’exécution de ce script, sous PHP 4.0.1pl2, donne : LES GLOBALES SONT SYMPA Ce code requiert utils.inc une deuxième fois, car il est requis dans foolib.inc Utilisation de GoodTea: Le Earl Grey est délicieux! Affichage de foo: Array ( [0] => 1 [1] => Array ( [0] => complexe [1] => quaternion ) ) Notez aussi que, de la même manière que les préprocesseurs traitent les #include, cette commande est exécutée au moment de la compilation, c’est-à-dire lorsque le script est analysée, et avant qu’il soit exécuté, et ne doit pas être utilisée pour insérer des données dynamiques liées à l’éxécution. Il vaut alors mieux utiliser include_once() ou include(). Pour plus d’exemples avec require_once() et include_once(), jetez un oeil dans le code de PEAR inclus dans la dernière distribution de PHP. Voir aussi : require(), include(), include_once(), get_required_files(), get_included_files(), readfile(), et virtual(). include_once() La commande include_once() inclut et évalue le fichier spécifié durant l’exécution du script. Le comportement est similaire à include(), mais la différence est que si le code a déjà été inclus, il ne le sera pas une seconde fois. Comme précisé dans la section require_once(), la fonction include_once() est utilisée de préférence lorsque le fichier doit être inclus ou évalué plusieurs fois dans un script, ou bien lorsque vous voulez être sÛr qu’il ne sera inclus qu’une seule fois, pour éviter des redéfinitions de fonction. Pour plus d’exemples avec require_once() et include_once(), jetez un oeil dans le code de PEAR inclus dans la dernière distribution de PHP. Voir aussi: require(), include(), require_once(), get_required_files(), get_included_files(), readfile(), et virtual(). 117 Chapitre 12. Les fonctions 118 Chapitre 12. Les fonctions Les fonctions utilisateur Une fonction peut être définie en utilisant la syntaxe suivante : <?php function foo ($arg_1, $arg_2, ..., $arg_n) { echo "Exemple de fonction.\n"; return $retval; } ?> Tout code PHP, correct syntaxiquement, peut apparaître dans une fonction et dans une définition de classe. En PHP 3, les fonctions doivent être définies avant qu’elles ne soient utilisées. Ce n’est plus le cas en PHP 4. PHP ne supporte pas le surchargement de fonction, ni la destruction ou la redéfinition de fonctions déjà déclarées. PHP 3 ne supporte pas un nombre variable d’arguments (voir valeurs par défault d’arguments pour plus d’informations). PHP 4 supporte les deux : voir liste variable d’arguments de fonction et les fonctions de références que sont func_num_args(), func_get_arg(), et func_get_args() pour plus d’informations. Les arguments de fonction Des informations peuvent être passées à une fonction en utilisant un tableau d’arguments, dont chaque élément est séparé par une virgule. Un élément peut être une variable ou une constante. PHP supporte le passage d’arguments par valeur (méthode par défaut), par référence. Les listes variables d’arguments sont supportées par PHP 4 et les versions plus récentes. Voir liste variable d’arguments de fonction et les fonctions utiles que sont func_num_args(), func_get_arg(), et func_get_args(). Fonctionnellement, on peut arriver au même résultat en passant un tableau comme argument : function takes_array($input) { echo "$input[0] + $input[1] = ", $input[0]+$input[1]; } Passage d’arguments par référence Par défaut, les arguments sont passés à la fonction par valeur (donc vous pouvez changer la valeur d’un argument dans la fonction, cela ne change pas sa valeur à l’extérieur de la fonction). Si vous voulez que vos fonctions puissent changer la valeur des arguments, vous devez passer ces arguments par référence. Si vous voulez qu’un argument soit toujours passé par référence, vous pouvez ajouter un ’&’ devant l’argument dans la déclaration de la fonction : function add_some_extra(&$string) { $string .= ’, et un peu plus.’; } $str = ’Ceci est une chaîne’; add_some_extra($str); echo $str; // affiche ’Ceci est une chaîne, et un peu plus.’ Si vous souhaitez passer une variable par référence à une fonction mais de manière ponctuelle, vous pouvez ajouter un ’&’ devant l’argument dans l’appel de la fonction: function foo ($bar) { $bar .= ’, et un peu plus.’; } $str = Ceci est une chaîne’; 119 Chapitre 12. Les fonctions foo ($str); echo $str; foo (&$str); echo $str; // affiche ’Ceci est une chaîne’ // affiche ’Ceci est une chaîne, et un peu plus.’ Valeur par défaut des arguments Vous pouvez définir comme en C++ des valeurs par défaut pour les arguments de type scalaire : function servir_apero ($type = "ricard") { return "Servir un verre de $type.\n"; } echo servir_apero(); echo servir_apero("whisky"); La fonction ci-dessus affichera : Servir un verre de ricard. Servir un verre de whisky. La valeur par défaut d’un argument doit obligatoirement être une constante, et ne peut être ni une variable, ni un membre de classe. Il est à noter que si vous utilisez des arguments avec valeur par défaut avec d’autres sans valeur par défaut, les premiers doivent être placés à la suite de tous les paramètres sans valeur par défaut. Sinon, cela ne fonctionnera pas. Considérons le code suivant : <?php function faireunyaourt ($type = "acidophilus", $flavour) { return "Préparer un bol de $type $flavour.\n"; } echo faireunyaourt ("framboise"); // ne fonctionne pas comme voulu ?> L’affiche du code ci-dessus est le suivant : Warning: Missing argument 2 in call to faireunyaourt() in /usr/local/etc/httpd/htdocs/PHP 3test/functest.html on line 41 Préparer un bol de framboise. Maintenant comparons l’exemple précédent avec l’exemple suivant : <?php function faireunyaourt ($flavour, $type = "acidophilus") { return "Préparer un bol de $type $flavour.\n"; } echo faireunyaourt ("framboise"); // fonctionne comme voulu ?> L’affichage de cet exemple est le suivant : Préparer un bol de acidophilus framboise. 120 Chapitre 12. Les fonctions Nombre d’arguments variable PHP 4 supporte les fonctions à nombre d’arguments variable. C’est très simple à utiliser, avec les fonctions func_num_args(), func_get_arg(), et func_get_args(). Aucune syntaxe particulière n’est nécessaire, et la liste d’argument doit toujours être fournie explicitement avec la définition de la fonction, et se comportera normalement. Les valeurs de retour Les valeurs sont renvoyées en utilisant une instruction de retour optionnelle. Tous les types de variables peuvent être renvoyés, tableaux et objets compris. <?php function carre ($num) { return $num * $num; } echo carre (4); // affiche ’16’. ?> Vous ne pouvez pas renvoyer plusieurs valeurs en même temps, mais vous pouvez obtenir le même résultat en renvoyant un tableau. <?php function petit_nombre() { return array (0, 1, 2); } list ($zero, $one, $two) = petit_nombre(); ?> Pour retourner une référence d’une fonction, utilisez l’opérateur & aussi bien dans la déclaration de la fonction que dans l’assignation de la valeur de retour. <?php function &retourne_reference() { return $uneref; } $newref =&retourne_reference(); ?> old_function L’instruction old_function vous permet de déclarer une fonction en utilisant une syntaxe du type PHP/FI2 (au détail près que vous devez remplacer l’instruction ’function’ par ’old_function’.) C’est une fonctionnalité obsolète et elle ne devrait être utilisée que dans le cadre de conversion de PHP/FI2 vers PHP 3 121 Chapitre 12. Les fonctions Avertissement Les fonctions déclarées comme old_function ne peuvent pas être appelées à partir du code interne du PHP. Cela signifie, par exemple, que vous ne pouvez pas les utiliser avec des fonctions comme usort(), array_walk(), et register_shutdown_function(). Vous pouvez contourner ce problème en écrivant une fonction d’encapsulation qui appellera la fonction old_function. Fonctions-variable PHP supporte le concept de fonctions variables. Cela signifie que si le nom d’une variable est suivi de parenthèses, PHP recherchera une fonction de même nom, et essaiera de l’exécuter. Cela peut servir, entre autre, pour faire des fonctions call-back, des tables de fonctions... Les fonctions-variables ne peuvent pas fonctionner avec les éléments de langage comme les echo(), unset(), isset() et empty(). C’est une des différences majeures entre les fonctions PHP et les éléments de langage. Exemple 12-1. Exemple de fonction variable <?php function foo() { echo "dans foo()<br>\n"; } function bar( $arg = ” ) { echo "Dans bar(); l’argument était ’$arg’.<br>\n"; } $func = ’foo’; $func(); $func = ’bar’; $func( ’test’ ); ?> 122 Chapitre 13. Les classes et les objets 123 Chapitre 13. Les classes et les objets Les classes : class Une classe est une collection de variables et de fonctions qui fonctionnent avec ces variables. Une classe est définie en utilisant la syntaxe suivante : <?php class Caddie { var $items; // Eléments de notre panier // Ajout de $num articles de type $artnr au panier function add_item ($artnr, $num) { $this->items[$artnr] += $num; } // Suppression de $num articles du type $artnr du panier function remove_item ($artnr, $num) { if ($this->items[$artnr] > $num) { $this->items[$artnr] -= $num; return TRUE; } else { return FALSE; } } } ?> L’exemple ci-dessus définit la classe Caddie qui est composée d’un tableau associatif contenant les articles du panier et de deux fonctions, une pour ajouter et une pour enlever des éléments au panier. Attention Les notes suivantes ne sont valable que pour PHP 4. Le nom stdClass est utilisé en interne par Zend et ne doit pas être utilisé. Vous ne pouvez pas nommer une classe stdClass en PHP. Les noms de fonctions __sleep et __wakeup sont magiques en PHP. Vous ne pouvez pas utiliser ces noms de fonctions dans vos classes, à moins que vous ne souhaitiez utiliser la magie qui y est associée. PHP se réserve l’usage de tous les noms de fonctions commençants par __, pour sa propre magie. Il est vivement recommandé de ne pas utilser des noms de fonctions commençants par __, à moins que vous ne souhaitiez utiliser la magie qui y est associée. Note : En PHP 4, seuls les initialiseurs constants pour les variables var sont autorisés. Utilisez les constructeurs pour les initialisations variables, ou utilisant des expressions. <?php /* Aucune de ces syntaxes ne fonctionnera en PHP 4 */ class Caddie { var $date_du_jour = date("d/m/Y"); var $name = $firstname; var $owner = ’Fred ’ . ’Jones’; var $items = array("DVD", "Télé","Magnétoscope"); } /* Voici comment cela doit se faire désormais. */ class Caddie { var $date_du_jour; var $name; var $owner; var $items; function Caddie() { $this->date_du_jour = date("d/m/Y"); $this->name = $GLOBALS[’firstname’]; /* etc... */ } } ?> 124 Chapitre 13. Les classes et les objets Les classes forment un type de variable. Pour créer une variable du type désiré, vous devez utiliser l’opérateur new. <?php $cart = new Caddie; $cart->add_item("10", 1); $another_cart = new Cart; $another_cart->add_item("0815", 3); ?> L’instruction ci-dessus crée l’objet $cart de la class Caddie. La fonction add_idem() est appelée afin d’ajouter l’article numéro 10 dans le panier. 3 articles numéro 0815 sont ajoutés au cart $another_cart. $cart et $another_cart disposent des fonctions add_item(), remove_item() et de la variable items. Ce sont des fonctions et variables distinctes. Vous pouvez vous représenter les objets comme des dossiers sur votre disque dur. Vous pouvez avoir deux fichiers "lisez-moi.txt" sur votre disque dur, tant qu’ils ne sont pas dans le même répertoire. De même que vous devez alors taper le chemin complet jusqu’au fichier, vous devez spécifier le nom complet de la méthode avant de l’employer : en termes PHP, le dossier racine est l’espace de nom global, et le séparateur de dossier est ->. Par exemple, les noms $cart->items et $another_cart->items représentent deux variables distinctes. Notez que le nom de la variable est alors $cart->items, et non pas $cart->$items : il n’y a qu’un seul signe $ dans un nom de variable. <?php // correct, $ unique $cart->items = array("10" => 1); // incorrect, car $cart->$items devient $cart->"" $cart->$items = array("10" => 1); // correct, mais risque de ne pas se comporter comme prévu // $cart->$myvar devient $ncart->items $myvar = ’items’; $cart->$myvar = array("10" => 1); ?> A l’intérieur d’une définition de classe, vous ne savez pas le nom de la variable à partir duquel l’objet sera accessible dans le script. On ne peut prévoir que l’objet créé sera affecté à la variable $cart ou $another_cart. Donc, vous ne pouvez pas utiliser la syntaxe $cart->items. Mais pour pouvoir accéder à aux méthodes et membres d’un objet, vous pouvez utiliser la variable spéciale $this, qui peut s’interpréter comme ’moi-même’, ou bien ’l’objet courant’. Par exemple, ’$this->items[$artnr] += $num;’ peut se lire comme ’ajouter $num au compteur $artnr de mon propre tableau de compteur’ ou bien ’ajouter $num au compteur $artnr du tableau de compteurs de l’objet courant’. extends : héritage Souvent, vous aurez besoin d’une classe avec des méthodes et fonctions similaires à une autre classe. En fait, il est bon de définir des classes génériques, qui pourront être réutilisées et adaptées à tous vos projets. Pour faciliter cela, une classe peut être une extension d’une autre classe. La classe dérivée hérite alors de toutes les méthodes et variables de la classe de base (cet héritage a ça de bien que personne ne meurt pour en profiter), mais peut définir ses propres fonctions et variables, qui s’ajouteront. Une classe ne peut hériter que d’une seule autre classe, et l’héritage multiple n’est pas supporté. Les héritages se font avec le mot clé ’extends’. <?php class Caddie_nomme extends Caddie { var $owner; function set_owner ($name) { $this->owner = $name; } } ?> L’exemple ci-desssus définit la classe Caddie_nomme qui possède les même variables que la classe Caddie et la variable $owner en plus, ainsi que la fonction set_owner(). Vous créez un panier nominatif de la même manière que précédemment, 125 Chapitre 13. Les classes et les objets et vous pouvez alors affecter un nom au panier ou en connaître le nom. Vous pouvez de toutes les façons utiliser les même fonctions que sur un panier classique. <?php $ncart = new Caddie_nomme; // Création d’un panier nominatif $ncart->set_owner ("kris"); // Affectation du nom du panier print $ncart->owner; // Affichage du nom du panier $ncart->add_item ("10", 1); // (héritage des fonctions de la classe père) ?> Constructor : constructeur Attention En PHP 3 et PHP 4, les constructeurs se comportent différemment. La sémantique de PHP 4 est fortement recommandée. Le constructeur est la fonction qui est appelée automatiquement par la classe lorsque vous créez une nouvelle instance d’une classe a l’aide de l’opérateur new. La fonction constructeur a le même nom que la classe. En PHP 3, une fonction devient le constructeur si elle porte le même nom que la classe. En PHP 4, une fonction devient un constructeur si elle porte le même nom que la classe dans laquelle elle est définit. La différence est subtile, mais cruciale. <?php class Auto_Caddie extends Caddie { function Auto_Caddie () { $this->add_item ("10", 1); } } // Cette syntaxe est valable en PHP 3 et 4 ?> L’exemple ci-dessus définit la classe Auto_Caddie qui hérite de la classe Caddie et définit le construteur de la classe. Ce dernier initialise le panier avec 1 article de type numéro 10 dès que l’instruction "new" est appelée. La fonction constructeur peut prendre ou non des paramètres optionnels, ce qui la rend beaucoup plus pratique. Pour pouvoir utiliser cette classe sans paramètre, tous les paramètres du constructeurs devraient être optionnels, en fournissant une valeur par défaut, comme ci-dessous. // Cette syntaxe est valable en PHP 3 et 4 class Constructor_Cart extends Cart { function Constructor_Cart ($item = "10", $num = 1) { $this->add_item ($item, $num); } } // Création du caddie $default_cart = new Constructor_Cart; // Création d’un vrai caddie $different_cart = new Constructor_Cart ("20", 17); Attention En PHP 3, les classes dérivées et les constructeurs ont un certains nombre de limitations. Les exemples suivants doivent être lus avec beaucoup d’attention pour comprendre ces limitations. class A { function A() { echo "Je suis le constructeur de A.<br>\n"; } } class B extends A { function C() { 126 Chapitre 13. Les classes et les objets "Je suis une fonction standard.<br>\n"; } } // Aucun constructeur n’est appelé en PHP 3!! $b = new B; En PHP 3, aucun constructeur ne sera appelé dans l’exemple ci-dessus. La règle en PHP 3 est : ’Un constructeur est une fonction qui a le même nom que la classe’. Le nom de la classe est B, et il n’y a pas de fonctions qui s’appelle B() dans la classe B. Rien ne se passe. Ceci est corrigé en PHP 4, avec l’introduction d’une nouvelle règle : Si une classe n’a pas de constructeur, le constructeur de la classe de basse est appelé, s’il existe. L’exemple ci-dessus affichera ’Je suis le constructeur de A.<br>’ en PHP 4. class A { function A() { echo "Je suis le constructeur de A.<br>\n"; } function B() { echo "Je suis une fonction standard appelée B dans la classe A.<br>\n"; echo "Je ne suis pas le constructeur de A.<br>\n"; } } class B extends A { function C() { "Je suis une fonction standard.<br>\n"; } } // Cette syntaxe va appeler B() comme constructeur. $b = new B; En PHP 3, la fonction B() de la classe A va soudaiement devenir le constructeur de la classe B, bien qu’il n’ai pas été prévu pour. La règle de PHP 3 est ’Un constructeur est une fonction qui a le même nom que la classe’. PHP 3 ne se soucie guère si la fonction est définie dans la classe B ou si elle a été héritée. Ceci est corrigé en PHP 4, avec l’introduction d’une nouvelle règle : ’Un constructeur est une classe de même nom, définit dans la classe elle-même’. Donc, en PHP 4, la classe B n’a pas de constructeur par elle-même, et le constructeur de la classe A aura été appelé, affichant : ’Je suis le constructeur de A.<br>’. Attention Ni PHP 3 ni PHP 4 n’appelle automatiquement le constructeur de la classe supérieure depuis le constructeur de la classe dérivée. Il est de votre responsabilité de propager l’appel des constructeurs. Note : Il n’y a pas de destructeurs en PHP 3 et PHP 4. Vous pouvez utiliser la fonction register_shutdown_function() à la place, pour simuler un destructeur. Les destructeurs sont des fonctions qui sont appelées lorsqu’un objet est détruit, soit avec la fonction unset() soit par simple sortie d’une fonction (cas des variables locales). Il n’y a pas de destructeurs en PHP. Opérateur :: Attention La documentation suivante n’est valable que pour PHP 4. Parfois, il est pratique de faire référence aux fonctions est variables d’une classe de base, ou bien d’utiliser des méthodes de classes qui n’ont pas encore d’objets créés. L’opérateur :: est là pour ces situations. <?php class A { 127 Chapitre 13. Les classes et les objets function example() { echo "Je suis la fonction originale A::example().<br>\n"; } } class B extends A { function example() { echo "Je suis la fonction redéfinie B::example().<br>\n"; A::example(); } } // Il n’y a pas d’objets de classe A. // L’affichage est : // Je suis la fonction originale A::example().<br> A::example(); // Création d’un objet de la classe B. $b = new B; // L’affichage est : // Je suis la fonction redéfinie B::example().<br> // Je suis la fonction originale A::example().<br> $b->example(); ?> Les exemples ci-dessus appellent la fonction example() dans la classe A, mais il n’y a pas encore d’objet de classe A, alors il n’est pas possible d’écrire $a->example(). A la place, on appelle la fonction example() comme une fonction de classe, c’est-à-dire avec le nom de la classe elle-même, et sans objet. Il y a des fonctions de classe, mais pas de variables de classe. En fait, il n’y a aucun objet au moment de l’appel de la fonction. Donc, une fonction de classe ne peut accéder à aucune variable (mais elle peut accéder aux variables locales et globales). Il faut proscire l’utilisation de $this. Dans l’exemple ci-dessus, la classe B redéfinit la fonction example(). La définition originale dans la classe A est remplacée par celle de B, et n’est plus accessible depuis B, à moins que vous n’appeliez spécifiquement la fonction example() de la classe A avec l’opérateur ::. Ecrivez A::example() pour cela (en fait, il faudrait écrire parent::example(), comme expliqué dans la section suivante). Dans ce contexte, il y a un objet courant, qui peut avoir d’autres variables objets. De ce fait, lorsqu’il est utilisé depuis une méthode d’un objet, vous pouvez utiliser $this. parent Il arrive que vous ayez à écrire du code qui faire référence aux variables et fonctions des classes de base. C’est particulièrement vrai si votre classe dérivée est une spécialisation de votre classe de base. Au lieu d’utiliser le nom litéral de votre classe de base dans votre code, vous pouvez utiliser le mot réservé parent, qui représente votre classe de base (celle indiqué par extends, dans la déclaration de votre classe). En faisant cela, vous éviter d’appeler le nom de votre classe de base directement dans votre code. Si votre héritage change, vous n’aurez plus qu’à modifier le nom de la classe dans la déclaration extends de votre classe. <?php class A { function example() { echo "Je suis A::example() et je fournis une fonctionnalité de base.<br>\n"; } } class B extends A { function example() { echo "Je suis B::example() et je fournis une fonctionnalité supplémentaire.<br>\n"; parent::example(); } } $b = new B; // Cette syntaxe va appeler B::example(), qui, à sont tour, va appeler A::example(). $b->example(); ?> 128 Chapitre 13. Les classes et les objets Sauvegarde d’objets - cas des sessions Note : En PHP 3, les objets perdent leur association de classe à travers le processus de sauvegarde et relecture. Le type de la variable après relecture est bien objet mais il n’a plus de méthode ou de nom de classe. Cela rend la focntionnalité plutôt inutile (l’objet est devenu un tableau avec une syntaxe étrange). Attention La documentation suivante n’est valable que pour PHP 4. serialize() retourne une chaîne représentant une valeur qui peut être stockée dans les sessions de PHP, ou une base de données. unserialize() peut relire cette chaîne pour recréer la valeur originale. serialize() va sauver toutes les variables d’un objet. Le nom de la classe sera sauvé mais par les méthodes de cet objet. Pour permettre à unserialize() de lire un objet, la classe de cet objet doit être définie. C’est-à-dire, si vous avez un objet $a de la classe A dans une page php1.php, et que vous le linéarisez avec serialize(), vous obtiendrez une chaîne qui fait référence à la classe A, et contient toutes les valeurs de $a. Pour pouvoir le relire avec la fonction unserialize() dans une page page2.php, il faut que la définition de la classe A soit présente dans cette deuxième page. Cela peut se faire de manière pratique en sauvant la définition de la classe A dans un fichier séparé, et en l’incluant dans les deux pages page1.php et page2.php. <?php classa.inc: class A { var $one = 1; function show_one() { echo $this->one; } } ?> page1.php: <?php include("classa.inc"); $a = new A; $s = serialize($a); // enregistrez $s où la page2.php pourra le trouver. $fp = fopen("store", "w"); fputs($fp, $s); fclose($fp); ?> page2.php: <?php // Ceci est nécessaire pour que unserialize() fonctionne correctement include("classa.inc"); $s = implode("", @file("store")); unserialize($s); // maintenant, utilisez la méthode show_one de l’objet $a. $a->show_one(); ?> Si vous utilisez les sessions et la fonction session_register() pour sauver des objets, ces objets seront linéarisés automatiquement avec la fonction serialize() à la fin de chaque script, et relus avec unserialize() au début du prochain script. Cela signifie que ces objets peuvent apparaître dans n’importe quelle page qui utilise vos sessions. Il est vivement recommandé d’inclure la définition de classe dans toutes vos pages, même si vous n’utilisez pas ces classes dans toutes vos pages. Si vous l’oubliez et qu’un tel objet est présent, il perdra sa classe, et deviendra un objet de classe stdClass sans aucune fonction, et donc, plutôt inutile. Si, dans l’exemple ci-dessus, $a devient un objet de session avec l’utilisation de session_register("a"), vous devez pensez à inclure le fichier classa.inc dans toutes vos pages, et pas seulement page1.php et page2.php. 129 Chapitre 13. Les classes et les objets Les fonctions magiques __sleep et __wakeup serialize() s’assure que votre classe a une méthode avec le nom magique __sleep. Si c’est le cas, cette fonction est appelée avant toute linéarisation. Elle peut alors nettoyer l’objet et on s’attend à ce qu’elle retourne un tableau avec la liste des noms de variables qui doivent être sauvées. Le but de cette fonction __sleep est de fermer proprement toute connexion à une base de données, de valider les requêtes, de finaliser toutes les actions commencées. Cette fonction est aussi pratique si vous ave de très grands objets qui n’ont pas besoin d’être sauvé entièrement. A l’inverse, unserialize() s’assure de la présence de la fonction magique __wakeup. Si elle existe, cette fonction reconstruit toutes les ressources d’un objet. Le but de cette fonction __wakeup est de rétablit toutes les connexions aux bases de données, et de recréer les variables qui n’ont pas été sauvées. Références dans un constructeur Créer des références dans un constructeur peut conduire à des résultats étranges. Ce tutorial vous guide pour éviter ces problèmes. <?php class foo { function foo($name) { // crée une référence dans le tableau global $globalref global $globalref; $globalref[] = &$this; // donne le nom de la variable $this->setName($name); // et l’affiche $this->echoName(); } function echoName() { echo "<br>",$this->Name; } function setName($name) { $this->Name = $name; } } ?> Vérifions maintenant qu’il y a une différence entre $bar1 qui a été créé avec = et $bar2 qui a été créé avec l’opérateur de référence =& : <?php $bar1 = new foo(’crée dans le constructeur’); $bar1->echoName(); $globalref[0]->echoName(); /* affiche : crée dans le constructeur crée dans le constructeur crée dans le constructeur */ $bar2 =&new foo(’crée dans le constructeur’); $bar2->echoName(); $globalref[1]->echoName(); /* affiche : crée dans le constructeur crée dans le constructeur crée dans le constructeur */ ?> 130 Chapitre 13. Les classes et les objets Apparament, il n’y a pas de différence, mais en fait, il y en a une significative : $bar1 et $globalref[0] ne sont pas référencées, ces deux variables sont différentes. Cela est du au fait que l’opérateur "new"ne retourne par de référence, mais retourne une copie. Note : Il n’y a aucune perte de performance (puisque PHP 4 utilise un compteur de référence) à retourner des copies au lieu de références. Au contraire, il est souvent mieux de travailler sur les copies plutôt que sur les références, car créer une référence prend un peu plus de temps que de créer une copie qui ne prend virtuellement pas de temps (à moins de créer un tableau géant ou un objet monstreux, auquel cas il est préférable de passer par des références). Pour prouver ceci, regardez le code suivant : <?php // maintenant, nous allons changer de nom. Qu’attendez-vous? // Vous pouvez vous attendre à ce que les deux variables $bar // et $globalref[0] changent de nom... $bar1->setName(’modifié’); // comme prédit, ce n’est pas le cas $bar1->echoName(); $globalref[0]->echoName(); /* affiche : crée dans le constructeur modifié */ // quelle est la différence entre $bar2 et $globalref[1] $bar2->setName(’modifié’); // Heureusement, elles sont non seulement égales, mais // elles représentent la même variable. // donc $bar2->Name et $globalref[1]->Name sont les mêmes $bar2->echoName(); $globalref[1]->echoName(); /* affiche : modifié modifié */ ?> Un dernier exemple pour bien comprendre. <?php class a { function a($i) { $this->value = $i; // Essayez de comprendre on n’a pas besoin de // référence ici $this->b = new b($this); } function createRef() { $this->c = new b($this); } function echoValue() { echo "<br>","class ",get_class($this),’: ’,$this->value; } } class b { function b(&$a) { $this->a = &$a; } function echoValue() { echo "<br>","class ",get_class($this),’: ’,$this->a->value; } } // Essayez de comprendre pourquoi une copie simple va // conduire à un résultat indésirable à // la ligne marquée d’une étoile $a =&new a(10); $a->createRef(); 131 Chapitre 13. Les classes et les objets $a->echoValue(); $a->b->echoValue(); $a->c->echoValue(); $a->value = 11; $a->echoValue(); $a->b->echoValue(); // * $a->c->echoValue(); /* output: class a: 10 class b: 10 class b: 10 class a: 11 class b: 11 class b: 11 */ ?> 132 Chapitre 14. Les références 133 Chapitre 14. Les références Qu’est ce qu’une référence? En PHP, les références sont destinées à appeler le contenu d’une variable avec un autre nom. Ce n’est pas comme en C : ici, les références sont des alias dans la table des symboles. Le nom de la variable et son contenu ont des noms différents, ce qui fait que l’on peut donner plusieurs noms au même contenu. On peut faire l’analogie avec les fichiers sous Unix, et leur nom de fichier : les noms des variables sont les entrées dans un repertoire, tandis que le contenu de la variable est le contenu même du fichier. Faire des références en PHP revient alors à faire des liens sous Unix. Que font les références ? Les références vous permettent de faire pointer deux variables sur le même contenu. Par exemple, lorsque vous faites : <?php $a =& $b ?> cela signifie que $a et $b pointent sur la même variable. Note : $a et $b sont complètement égales ici : ce n’est pas $a qui pointe sur $b, ou vice versa. C’est bien $a et $b qui pointent sur le même contenu. La même syntaxe peut être utilisée avec les fonctions qui retournent des références, et avec l’opérateur new (PHP 4.0.4 et plus récent): <?php $bar =& new fooclass(); $foo =& find_var ($bar); ?> Note : A moins d’utiliser la syntaxe ci-dessus, le résultat de $bar = new fooclass() ne sera pas la même variable que $this dans le constructeur, ce qui signifie que si vous avez utilisé la référence $this dans le constructeur, vous devez assigner la référence, ou bien obtenir deux objets différents. Le deuxième intérêt des références est de pouvoir passer des variables par référence. On réalise ceci en faisant pointer des variables locales vers le contenu des variables de fonction. Exemple : <?php function foo(&$var) { $var++; } $a=5; foo($a); ?> $a vaut 6. Cela provient du fait que dans la fonction foo, la variable $var pointe sur le même contenu que $a. Voir aussi les explications détaillées dans passage par référence. Le troisième intérêt des références est de retourner des valeurs par référence. Ce que les références ne sont pas Comme précisé ci-dessus, les références ne sont pas des pointeurs. Cela signifie que le script suivant ne fera pas ce à quoi on peut s’attendre : <?php function foo(&$var) { $var =& $GLOBALS["baz"]; } 134 Chapitre 14. Les références foo($bar); ?> Il va se passer que $var dans foo() sera lié à $bar, mais il sera aussi relié à $GLOBALS["baz"]. Il n’y a pas moyen de lier $bar à quelque chose d’autre en utilisant le mécanisme de référence, car $bar n’est pas accessible dans la fonction foo() (certes, il est représenté par $var et $var possède la même valeur, mais n’est pas relié par la table des symboles). Passage par référence Vous pouvez passer des variables par référence, de manière à ce que la fonction modifie ses arguments. La syntaxe est la suivante : <?php function foo(&$var) { $var++; } $a=5; foo ($a); // $a vaut 6 maintenant ?> Notez qu’il n’y a pas de signe de référence dans l’appel de la fonction, uniquement sur sa définition. La définition de la fonction est suffisante pour passer correctement des arguments par référence. Les objets suivants peuvent être passés par référence : • Une variable, i.e. foo($a) • Un nouvel objet, i.e. foo(new foobar()) • Une référence, retournée par une fonction : <?php function &bar() { $a = 5; return $a; } foo(bar()); ?> Voir aussi des détails dans retourner des références. Toutes les autres expressions ne doivent pas être passées par référence, car le résultat sera indéfini. Par exemple, les passages par référence suivants sont invalides : <?php function bar() // Notez l’absence de & { $a = 5; return $a; } foo(bar); foo($a = 5) // Expression, pas une variable foo(5) // Constante, pas une variable ?> Ces fonctionnalités sont valables à partir de PHP 4.0.4. 135 Chapitre 14. Les références Retourner des références Retourner des références est toujours utile lorsque vous voulez utiliser une fonction pour savoir à quoi est liée une variable. Lorsque vous retournez une variable par paramètre, utilisez le code suivant <?php function &find_var($param) { // ...code... return $found_var; } $foo =& find_var ($bar); $foo->x = 2; ?> Dans cet exemple, la propriété de l’objet est retournée dans find_var et lui sera affectée, et non pas à la copie, comme cela sera le cas avec une syntaxe par référence. Note : Contrairement au passage de paramètre, vous devez utiliser & aux deux endroits, à la fois pour indiquer que vous retournez par référence (pas une copie habituelle), et pour indiquer que vous assignez aussi par référence (pas la copie habituelle). Détruire une référence Lorsque vous détruisez une référence, vous ne faites que casser le lien entre le nom de la variable et son contenu. Cela ne signifie pas que le contenu est détruit. Par exemple, <?php $a = 1; $b =& $a; unset ($a); ?> Cet exemple ne détruira pas $b, mais juste $a. Encore une fois, on peut comparer cette action avec la fonction unlink d’Unix. Repérer une référence De nombreuses syntaxes de PHP sont implémentées via le mécanisme de référence, et tout ce qui a été vu concernant les liaisons entre variables s’applique à ces syntaxes. Par exemple, le passage et le retour d’arguments par référence. Quelques autres exemples de syntaxes : Références globales Lorsque vous déclarez une variable global $var, vous créez en fait une référence sur une variable globale. Ce qui signifie que <?php $var =& $GLOBALS["var"]; ?> Et que, si vous détruisez la variable $var, la variable globale ne sera pas détruite. 136 Chapitre 14. Les références $this Dans une méthode d’objet $this est toujours une référence sur l’objet courant. 137 Partie III. Caractéristiques Chapitre 15. Gestion des erreurs 138 Chapitre 15. Gestion des erreurs Il y a plusieurs types d’erreur et d’alerte. Tableau 15-1. Types d’erreur PHP Valeur Constante Description 1 E_ERROR Erreur fatale d’exécution Note 2 E_WARNING Alerte d’exécution ( erreur non-fatale ) 4 E_PARSE Erreur de compilation 8 E_NOTICE Notes d’exécution (moins critique que les alertes) 16 E_CORE_ERROR Erreurs qui surviennent lors de PHP 4 seulement l’initialisation de PHP 32 E_CORE_WARNING Alertes qui surviennent lors de l’initialisation de PHP PHP 4 seulement 64 E_COMPILE_ERROR Erreur fatale de compilation PHP 4 seulement 128 E_COMPILE_WARNING Alerte de compilation (erreur PHP 4 seulement non fatale) 256 E_USER_ERROR Erreur générée par l’utilisateurPHP 4 seulement 512 E_USER_WARNING Alerte générée par l’utilisateurPHP 4 seulement 1024 E_USER_NOTICE Note générée par l’utilisateur PHP 4 seulement E_ALL Toutes les erreurs ci dessus Les valeurs ci-dessus (numériques ou symbolique) sont utilisée pour construire un champs de bit, qui spécifie quelles erreurs rapporter. Vous pouvez utiliser les opérateurs de bits pour combiner ces valeurs et masquer uniquement celle qui vous interesse Notez que seuls, ’|’, ’~’, ’!’, et ’&’ seront utilisables dans php.ini, et qu’aucun opérateur ne sera utilisable dans php3.ini. En PHP 4, la valeur par défaut de error_reporting est à E_ALL & ~E_NOTICE, ce qui signifie que toutes les erreurs et alertes seront affichées, mais pas les notes. En PHP 3, la valeur par défaut est (E_ERROR | E_WARNING | E_PARSE), c’est à dire la même chose. Notez bien que ces constantes ne sont pas supportées dans le fichier php3.ini de PHP 3, la valeur de error_reporting doit être numériques, c’est à dire 7. La valeur initiale peut être modifiée dans le fichier .ini, avec la directive error_reporting, dans le fichier de configuration d’Apache httpd.conf, avec la directive php_error_reporting (php3_error_reporting pour PHP 3), et enfin, dans le script même, en utilisant la fonction error_reporting(). Avertissement Lorsque vous portez votre code ou vos serveurs de PHP 3 en PHP 4 vous devez vérifier les options et les appels à error_reporting(). Sinon, vous courrez le risque d’inactiver certains types d’erreurs et notamment E_COMPILE_ERROR. Cela peut conduire à des documents vides, sans aucun retour d’erreur. Toutes les expressions PHP peuvent être appelée avec le préfixe "@", qui annule le rapport d’erreur pour cette expression en particulier. Si une erreur survient durant une telle expression, et que l’option de suivi des erreurs est activée, vous pourrez trouver le message d’erreur dans la variable globale, $php_errormsg. Note : Le préfixe opérateur @ ne supprimera pas les messages liés aux erreurs d’analyse. 139 Chapitre 15. Gestion des erreurs Avertissement Actuellement, le préfixe @, opérateur de rapport d’erreur désactive tous les rapports, y compris les erreurs critiques qui interrompent le script. Entre autre, cela signifique que si vous utilisez @ pour supprimer des erreurs dans une fonction qui n’existe pas, ou qui a été mal orthographiée, le script sera terminé sans aucune indication. Ci dessous, voici un exemple de gestion des erreurs avec PHP. On définit une fonction de gestion des erreurs qui enregistre les informations dans un fichier (au format XML), et email le développeur en cas d’erreur critique. Exemple 15-1. Utiliser le contrôle d’erreur dans un script <?php // Nous effectuons nous même notre contrôle d’erreur. error_reporting(0); // Fonction de gestion des erreurs utilisateur function usererrorhandler($errno, $errmsg, $filename, $linenum, $vars) { // timestamp pour dater l’erreur $dt = date("Y-m-d H:i:s (T)"); // definit un tableau associatif avec les chaînes d’erreur // en realité, les seules entrées que nous considérerons // seront 2,8,256,512 et 1024 $errortype = array( 1 => "Erreur", 2 => "Alerte", 4 => "Erreur d’analyse", 8 => "Note", 16 => "Erreur interne", 32 => "Alerte interne", 64 => "Erreur de compilation", 128 => "Alerte de compilation", 256 => "Erreur utilisateur", 512 => "Alerte utilisateur", 1024=> "Note utilisateur" ); // ensemble d’erreur pour lesquelles une trace sera conservée $user_errors = array(E_USER_ERROR, E_USER_WARNING, E_USER_NOTICE); $err = "<errorentry>\n"; $err .= "\t<datetime>".$dt."</datetime>\n"; $err .= "\t<errornum>".$errno."</errnumber>\n"; $err .= "\t<errortype>".$errortype[$errno]."</errortype>\n"; $err .= "\t<errormsg>".$errmsg."</errormsg>\n"; $err .= "\t<scriptname>".$filename."</scriptname>\n"; $err .= "\t<scriptlinenum>".$linenum."</scriptlinenum>\n"; if (in_array($errno, $user_errors)) $err .= "\t<vartrace>".wddx_serialize_value($vars,"Variables")."</vartrace>\n"; $err .= "</errorentry>\n\n"; // pour test // echo $err; // sauve l’erreur dans le fichier, et emaile moi si l’erreur est critique error_log($err, 3, "/usr/local/php4/error.log"); if ($errno == E_USER_ERROR) mail("[email protected]","Critical User Error",$err); } function distance($vect1, $vect2) { if (!is_array($vect1) || !is_array($vect2)) { trigger_error("Paramètres incorrects : arrays attendus", E_USER_ERROR); return NULL; } if (count($vect1) != count($vect2)) { trigger_error("Les vecteurs doivent être de la même taille", E_USER_ERROR); return NULL; } for ($i=0; $i<count($vect1); $i++) { $c1 = $vect1[$i]; $c2 = $vect2[$i]; 140 Chapitre 15. Gestion des erreurs $d = 0.0; if (!is_numeric($c1)) { trigger_error("La coordonnée $i du vecteur 1 n’est pas un nombre. Remplacée par zéro", E_USER_WARNING); $c1 = 0.0; } if (!is_numeric($c2)) { trigger_error("La coordonnée $i du vecteur 2 n’est pas un nombre. Remplacée par zéro", E_USER_WARNING); $c2 = 0.0; } $d += $c2*$c2 - $c1*$c1; } return sqrt($d); } $old_error_handler = set_error_handler("userErrorHandler"); // Constante indéfinie, génére une alerte $t = I_AM_NOT_DEFINED; // definition de quelques "vecteurs" $a = array(2,3,"bla"); $b = array(5.5, 4.3, -1.6); $c = array(1,-3); // génère une erreur utilisateur $t1 = distance($c,$b)."\n"; // génère une autre erreur utilisateur $t2 = distance($b,"i am not an array")."\n"; // génère une alerte $t3 = distance($a,$b)."\n"; ?> Ceci est un exemple simple, qui montre comment utiliser les fonctions de Gestions des erreurs. Voir aussi error_reporting(), error_log(), set_error_handler(), restore_error_handler(), trigger_error(), user_error() 141 Chapitre 16. Création d’images 142 Chapitre 16. Création d’images PHP n’est pas limité à la création de fichier HTML. Il peut aussi servir à créer des images GIF, PNG, JPG, wbmp et xpm, à la volée, aussi bien pour les émettre que pour les sauver. Il faut alors compiler PHP avec la librairie GD. GD et PHP requièrent aussi d’autres librairies, suivant le format d’images que vous voulez supporter. GD a cessé de supporter le format GIF depuis la version 1.6. Exemple 16-1. Création d’images GIF avec PHP <?php header("Content-type: image/png"); $string=implode($argv," "); $im = imagecreatefrompng("images/button1.png"); $orange = imagecolorallocate($im, 220, 210, 60); $px = (imagesx($im)-7.5*strlen($string))/2; imagestring($im,3,$px,9,$string,$orange); imagepng($im); imagedestroy($im); ?> Cet exemple sera appelé depuis une page HTML avec une balise telle que: <img src="button.php3?text">. Le script ci-dessus récupère le texte de la chaîne $string et l’ajoute sur l’image de fond"images/button1.gif". Le résultat est alors envoyé au client. C’est un moyen très pratique d’éviter d’avoir à redessiner des boutons à chaque fois que le texte du bouton change. Avec ce script, il est généré dynamiquement. 143 Chapitre 17. Authentification HTTP avec PHP 144 Chapitre 17. Authentification HTTP avec PHP Les fonctions d’authentification HTTP de PHP ne sont disponibles que si PHP est exécuté comme module Apache, et non pas sous la forme d’un CGI. Sous cette forme, il est possible d’utiliser la fonction header() pour demander une authentification ("Authentication Required" ) au client, générant ainsi l’apparition d’une fenêtre de demande d’utilisateur et de mot de passe. Une fois que les champs ont été remplis, l’URL sera de nouveau appelée, avec les variables $PHP_AUTH_USER, $PHP_AUTH_PW et $PHP_AUTH_TYPE contenant respectivement le nom d’utilisateur, le mot de passe et le type d’authentification. Actuellement, seule l’authentification simple ("Basic") est supportée. Reportez vous à la fonction header() pour plus d’informations. Voici un exemple de script qui force l’authentification du client pour accéder à une page : Exemple 17-1. Exemple d’authentication HTTP <?php if(!isset($PHP_AUTH_USER)) { Header("WWW-Authenticate: Basic realm=\"My Realm\""); Header("HTTP/1.0 401 Unauthorized"); echo "Texte à envoyer si le client appuie sur le bouton d’annulation\n"; exit; } else { echo "Bonjour $PHP_AUTH_USER.<P>" echo "Vous avez entré le mot de passe $PHP_AUTH_PW.<P>" } ?> Au lieu d’afficher simplement les variables globales $PHP_AUTH_USER et $PHP_AUTH_PW, vous préférerez sÛrement vérifier la validité du nom d’utilisateur et du mot de passe. Par exemple, en envoyant ces informations à une base de données, ou en recherchant dans un fichier dbm. Méfiez vous des navigateurs buggés, tels que Internet Explorer. Ils semblent très suceptibles concernant l’ordre des entêtes. Envoyer l’entête d’authentification (WWW-Authenticate) avant le code de HTTP/1.0 401 semble lui convenir jusqu’à présent. Pour éviter que quelqu’un écrive un script qui révèle les mots de passe d’une page, à la quelle on a accédé par une authentification traditionnelle, les variables globales PHP_AUTH ne seront pas assignées si l’authentification externe a été activée pour cette page. Dans ce cas, la variable $REMOTE_USER peut être utilisée pour identifier l’utilisateur à l’extérieur. Notez cependant que les manipulations ci-dessus n’empêchent pas quiconque qui possède une page non authentifiée de voler les mots de passes des pages protégées, sur le même serveur. Netscape et Internet Explorer effaceront le cache d’authentification client si ils recoivent une réponse 401. Cela permet de déconnecter un utilisateur, pour le forcer à ré-entrer son nom de compte et son mot de passe. Certains programmeurs l’utilisent pour donner un délai d’éxpiration, ou alors, fournissent un bouton de déconnexion. Exemple 17-2. Authentification HTTP avec nom d’utilisateur/mot de passe forcé <?php function authenticate() { Header( "WWW-Authenticate: Basic realm=\"Test Authentication System\""); Header( "HTTP/1.0 401 Unauthorized"); echo "Vous devez entrer un nom d’utilisateur valide et un mot de passe correct pour accéder à cette ressource\n"; exit; } if(!isset($PHP_AUTH_USER) || ($SeenBefore == 1 && !strcmp($OldAuth, $PHP_AUTH_USER)) ) { authenticate(); } else { echo "Bienvenue $PHP_AUTH_USER<BR>"; echo "Old: $OldAuth"; echo "<FORM ACTION=\"$PHP_SELF\" METHOD=POST>\n"; echo "<INPUT TYPE=HIDDEN NAME=\"SeenBefore\" VALUE=\"1\">\n"; echo "<INPUT TYPE=HIDDEN NAME=\"OldAuth\" VALUE=\"$PHP_AUTH_USER\">\n"; echo "<INPUT TYPE=Submit VALUE=\"Re Authenticate\">\n" echo "</FORM>\n"; 145 Chapitre 17. Authentification HTTP avec PHP } ?> Ce comportement n’est pas nécessaire par le standard d’authentification HTTP Basic. Les tests avec Lynx ont montré qu’il n’affectait pas les informations de session lors de la réception d’un message de type 401, ce qui fait que passer ces informations entre le serveur et le client, et donnera l’accès à la ressource. Cependant, l’utilisateur peut utiliser la touche ’_’ pour détruire les anciennes autentifications. Notez aussi que tout ceci ne fonctionne pas sous Microsoft IIS et que les limitations de PHP en version CGI sont dues aux limitations de IIS. 146 Chapitre 18. Cookies 147 Chapitre 18. Cookies PHP supporte les cookies de manière transparente. Les cookies sont un mécanisme d’enregistrement d’informations sur le client, et de lecture de ces informations. Ce système permet d’authentifier et de suivre les visiteurs. Vous pouvez envoyer un cookie avec la commande setcookie(). Les cookies font partie de l’entête HTTP, ce qui impose que setcookie() soit appelé avant tout affichage sur le client. Ce sont les mêmes limitations que pour header(). Tous les cookies qui sont envoyés au client seront automatiquement retournés au script PHP, et transformés en variable, exactement comme pour GET et POST. Si vous souhaitez affecter plusieurs valeurs à un seul cookie, ajoutez[] au nom du cookie. Pour plus details, reportez vous à la fonction setcookie(). 148 Chapitre 19. Gestion des chargements de fichier 149 Chapitre 19. Gestion des chargements de fichier Chargements de fichiers par méthode POST PHP est capable de recevoir des fichiers émis par un navigateur conforme à la norme RFC-1867 (c’est-à-dire Netscape Navigator 3 ou supérieur, Microsoft Internet Explorer 3 avec un patch de Microsoft, ou supérieur sans le patch). Cette fonctionnalité permet de charger des fichiers textes ou binaires. Avec l’authentification et les fonctions de manipulation des fichiers, vous avez un contrôle total sur le chargement et la gestion des fichiers chargés. Notez bien que PHP supporte aussi le chargement par la méthode PUT comme dans le navigateur Netscape Composer et les clients Amaya du W3C. Reportez-vous au chapitre sur le support de la méthode PUT. Un écran de chargement de fichiers peut être constitué en créant un formulaire de la manière suivante : Exemple 19-1. Formulaire de chargement de fichier <FORM ENCTYPE="multipart/form-data" ACTION="_URL_" METHOD="POST"> <INPUT TYPE="hidden" name="MAX_FILE_SIZE" value="1000"> Envoyez ce fichier : <INPUT NAME="userfile" TYPE="file"> <INPUT TYPE="submit" VALUE="Send File"> </FORM> Le paramètre _URL_ doit pointer sur un fichier PHP. L’option MAX_FILE_SIZE cachée doit précéder le nom du fichier à charger, et représente la taille maximale du fichier à charger. La valeur est donnée en octets. Dans ce script, les valeurs suivantes doivent être définies pour assurer un chargement correct : En PHP 3, les variables suivantes seront définies dans le script de destination, en cas de téléchargement réussi, et en supposant que register_globals est activé dans le fichier php.ini. Si track_vars est activé, elles seront aussi disponibles dans le dossier $HTTP_POST_VARS. Notez que les noms des variables suivantes supposent que nom du fichier téléchargé est ’userfile’, comme présenté dans l’exemple ci-dessus. • $userfile - Le nom temporaire du fichier qui sera chargé sur la machine serveur. • $userfile_name - Le nom du fichier original sur le système de l’envoyeur. • $userfile_size - La taille du fichier envoyé en octets. • $userfile_type - Le type MIME du fichier, si le navigateur a fourni cette information. Par exemple, "image/gif". Notez que "$userfile" prend la valeur qui est passée dans le champs INPUT de type TYPE=file. Dans l’exemple ci-dessus, nous avons choisi de l’appeler "userfile". En PHP 4, le comportement est légèrement différent, car c’est la variable d’environnement $HTTP_POST_FILES, qui contiendra les informations sur les fichiers téléchargés. Ces informations sont disponibles dans si l’option track_vars est activée, mais track_vars est toujours activée dans les versions de PHP supérieures à la version 4.0.2. Le contenu du tableau $HTTP_POST_FILES décrit ci-dessous. Notez que l’on suppose ici que le nom du fichier téléchargé est ’userfile’, comme présenté dans l’exemple ci-dessus : $HTTP_POST_FILES[’userfile’][’name’] Le nom du fichier original sur la machine source. $HTTP_POST_FILES[’userfile’][’type’] Le type MIME du fichier, si le navigateur a fourni cette information. Par exemple, "image/gif". $HTTP_POST_FILES[’userfile’][’size’] La taille du fichier envoyé, en octets. $HTTP_POST_FILES[’userfile’][’tmp_name’] Le nom temporaire du fichier qui sera chargé sur la machine serveur. Les fichiers seront enregistrés par défaut dans le dossier des fichiers temporaires, à moins qu’un autre dossier n’ait été fourni avec la directive de configuration upload_tmp_dir du fichier php.ini. Le dossier par défaut du serveur peut être modifié grâce à la variable d’environnement TMPDIR, de l’utilisateur qui exécute PHP. Sa modification avec putenv() depuis un script PHP ne fonctionnera pas. Cette variable d’environnement peut aussi être utilisée pour s’assurer que d’autres opérations fonctionnent avec les fichiers téléchargés. 150 Chapitre 19. Gestion des chargements de fichier Exemple 19-2. Validation de fichiers téléchargés Les exemples suivants fonctionnent sur les versions de PHP 3 supérieures à la version 3.0.16, et supérieures à la version 4.0.2 pour PHP 4. Reportez-vous à la section des fonctions pour étudier is_uploaded_file() et move_uploaded_file(). <?;php if (is_uploaded_file($userfile)) { copy($userfile, "/dossier/des/fichiers/telecharges/"); } else { echo "Attaque potentielle par fichier téléchargé : fichier ’$userfile’."; } /* ...ou... */ move_uploaded_file($userfile, "/dossier/des/fichiers/telecharges"); ?> Pour les versions plus anciennes de PHP, vous devrez faire quelque chose comme ceci : <?;php /* Test du fichier téléchargé. */ function is_uploaded_file($filename) { if (!$tmp_file = get_cfg_var(’upload_tmp_dir’)) { $tmp_file = dirname(tempnam(”, ”)); } $tmp_file .= ’/’ . basename($filename); /* L’utilisateur peut avoir un slash final dans php.ini... */ return (ereg_replace(’/+’, ’/’, $tmp_file) == $filename); } if (is_uploaded_file($userfile)) { copy($userfile, "/place/to/put/uploaded/file"); } else { echo "Attaque potentielle par fichier téléchargé : fichier ’$userfile’."; } ?> Note : Cela ne fonctionnera PAS avec les versions de PHP 4 supérieure à 4.0.2. Cela repose sur des fonctionnalités internes à PHP qui ont évolué après cette version. Le script PHP qui reçoit le fichier chargé doit pouvoir gérer le fichier de manière appropriée. Vous pouvez utiliser la variable $file_size pour recaler tous les fichiers qui sont trop gros ou trop petits. Vous pouvez utiliser la variable $file_type pour recaler les fichiers qui n’ont pas le bon type. Quelques soient les actions, ce script doit pouvoir supprimer le fichier du dossier temporaire, ou le déplacer ailleurs. Le fichier sera automatiquement effacé du fichier temporaire à la fin du script, s’il n’a pas été déplacé ou renommé. Erreurs classiques La variable MAX_FILE_SIZE ne peut pas spécifier une taille de fichier plus grande que la taille qui a été fixée par upload_max_filesize, dans le fichier php3.ini, ou par php3_upload_max_filesize dans les directives Apache. La valeur par défaut est 2 mégaoctets. Ne pas valider les fichiers que vous manipulez peut donner l’accès aux utilisateurs à des fichiers sensibles dans d’autres dossiers! Attention : il semble que CERN httpd supprime tout ce qui est après le premier caractère dans l’en-tête MIME. Tant que c’est le cas, CERN httpd ne pourra pas effectuer de chargement. 151 Chapitre 19. Gestion des chargements de fichier Chargement multiples de fichiers Il est possible de charger plusieurs fichiers en même temps, et de recevoir les informations adéquates organisées sous forme de tableau. Pour ce faire, il faut utiliser la même syntaxe d’envoi dans le code HTML que pour les sélections ou boîtes à cocher multiples. Note : Le support du chargement multiple de fichier a été ajouté dans la version 3.0.10. Exemple 19-3. Chargement multiple de fichier <form action="file-upload.html" method="post" enctype="multipart/form-data"> Send these files:<br> <input name="userfile[]" type="file"><br> <input name="userfile[]" type="file"><br> <input type="submit" value="Send files"> </form> Lorsque le formulaire ci-dessus a étéF envoyé, les tableaux $userfile, $userfile_name, et $userfile_size seront initialisés (ainsi que $HTTP_POST_VARS). Chaque tableau sera de type numérique, et contiendra les valeurs appropriées pour le chargement des fichiers. Par exemple, supposons que les noms de fichier /home/test/review.html et /home/test/xwp.out soient envoyés. Dans ce cas, $userfile_name[0] va contenir review.html, et $userfile_name[1] contiendra xwp.out. Similairement, $userfile_size[0] contiendra la taille de review.html, etc... $userfile[’name’][0], $userfile[’tmp_name’][0], $userfile[’size’][0], et $userfile[’type’][0] sont aussi affectés. Chargement par méthode PUT PHP supporte la méthode HTTP PUT utilisée par les navigateurs tels que Netscape Composer et W3C Amaya. Les requêtes de type PUT sont beaucoup plus simples que les chargements de fichiers, et elles ressemblent à : PUT /path/filename.html HTTP/1.1 Normalement, cela signifie que le client distant va sauver les données qui suivent dans le fichier: /path/filename.html de votre disque. Ce n’est évidemment pas très sécurisé de laisser Apache ou PHP écraser n’importe quel fichier de l’arborescence. Pour éviter ceci, il faut d’abord dire au serveur que vous voulez qu’un script PHP donné gère la requête. Avec Apache, il y a une directive pour cela : Script. Elle peut être placée n’importe où dans le fichier de configuration d’Apache. En général, les webmestres la place dans le bloc <Directory>, ou peut être dans le bloc <Virtualhost>. La ligne suivante fera très bien l’affaire : Script PUT /put.php3 Elle indique à Apache qu’il doit envoyer les requêtes de chargement par méthode PUT au script put.php3. Bien entendu, cela présuppose que vous avez activé PHP pour qu’il prenne en charge les fichiers de type .php3, et que PHP est actif. Dans le fichier put.php3 file vous pouvez mettre ceci : <?php copy($PHP_UPLOADED_FILE_NAME,$DOCUMENT_ROOT.$REQUEST_URI); ?> 152 Chapitre 19. Gestion des chargements de fichier Ce script va copier le fichier chargé par le client distant à l’endroit désiré. Vous aurez probablement à effectuer quelques tests et des authentifications d’utilisateur, avant d’effectuer cette copie. Le seul piège est que lorsque PHP reçoit un chargement par méthode PUT, il va enregistrer le fichier dans le dossier temporaire, tout comme avec la méthode POST-method. A la fin de la requête, le fichier sera effacé. Ce qui fait que ce script doit placer le fichier chargé quelque part. Le nom du fichier temporaire est placé dans la variable globale $PHP_PUT_FILENAME, et la destination prévue est placée dans $REQUEST_URI (ces noms peuvent changer d’une configuration d’Apache à l’autre). Cette destination est celle qui est demandée par le client, et vous n’avez pas à obéir aveuglément au client. Vous pourriez par exemple, déplacer le fichier dans un dossier de chargement. 153 Chapitre 20. Utilisation des fichiers à distance 154 Chapitre 20. Utilisation des fichiers à distance Aussi longtemps que le support de la fonction d’ouverture générique de fichiers ("URL fopen wrapper") est actif lorsque vous configurez PHP (il est inutile de passer explicitement l’option --disable-url-fopen-wrapper pour faire la configuration), vous pouvez utiliser des URLs (HTTP et FTP) avec la plupart des fonctions qui utilisent un nom de fichier comme paramètre, ceci incluant les expressions require() et include(). Note : Vous ne pouvez pas utiliser les fichiers distants dans les expressions include() et require() avec Windows. Par exemple, vous pouvez suivre l’exemple suivant pour ouvrir un fichier sur un serveur web distant, analyser les résultats pour extraire les informations dont vous avez besoin, et ensuite l’utiliser dans une requête de base de données, ou simplement éditer les informations dans le style de votre site. Exemple 20-1. Connaître le titre d’une page distante <?;php $file = fopen("http://www.php.net/", "r"); if (!$file) { echo "<p>Impossible d’ouvrir le fichier distant.\n"; exit; } while (!feof($file)) { $line = fgets($file, 1024); /* Cela ne fonctionne que site le titre est écrit sur une ligne.*/ if (eregi("<title>(.*)</title>", $line, $out)) { $title = $out[1]; break; } } fclose($file); ?> Vous pouvez aussi écrire des fichiers sur un serveur FTP aussi longtemps que vous êtes connecté avec un utilisateur ayant les bons droits d’accès, alors que le fichier n’existait pas encore. Pour vous connecter avec un utilisateur autre qu’anonyme, vous devez spécifier un nom d’utilisateur (et certainement le mot de passe) dans l’URL, comme par exemple ’ftp://user:[email protected]/path/to/file’. (Vous pouvez utiliser le même type de syntaxe pour accéder aux fichiers via HTTP lorsqu’ils nécessitent une authentification basique.) Exemple 20-2. Stocker des données sur un serveur distant <?;php $file = fopen("ftp://ftp.php.net/incoming/outputfile", "w"); if (!$file) { echo "<p>Impossible d’ouvrir un fichier distant en écriture.\n"; exit; } /* Ecriture des données. */ fputs($file, "$HTTP_USER_AGENT\n"); fclose($file); ?> Note : Remarque: Vous pouvez avoir l’idée,à partir de l’exemple ci-dessus, d’utiliser la même technique pour écrire sur un log distant, mais comme mentionné ci-dessus vous ne pouvez qu’écrire sur un nouveau fichier en utilisant les fonctions fopen() avec une URL. Pour faire des log distribués, nous vous conseillons de regarder la partie syslog(). 155 Chapitre 21. Gestion des connexions 156 Chapitre 21. Gestion des connexions Note : Les informations suivantes ne sont valables qu’à partir de la version 3.0.7. Le statut des connexions est conservé en interne par PHP. Il y a trois états possibles : • 0 - NORMAL (normal) • 1 - ABORTED (annulé) • 2 - TIMEOUT (périmé) Lorsqu’un script PHP est en cours d’exécution, son état est NORMAL. Si le client distant se déconnecte, le statut devient ABORTED. En général, une telle déconnexion provient d’un arrêt temporaire. Si la durée maximale d’exécution de PHP est dépassée, (voir set_time_limit()), le script prend le statut TIMEOUT. Vous pouvez en outre, décider si vous voulez que la déconnexion d’un client provoque l’arrêt de votre script. Il est parfois pratique de terminer le script, même si le client n’est plus là pour recevoir les informations. Cependant, par défaut, le script sera interrompu, et terminé dès que le client se déconnecte. Ce comportement peut être modifié avec la directive ignore_user_abort dans le fichier php.ini ou bien avec la directive Apache ignore_user_abort du fichier Apache httpd.conf ou avec la fonction ignore_user_abort(). Si vous ne demandez pas à PHP d’ignorer la déconnexion, et que l’utilisateur se déconnecte, le script sera terminé. La seule exception est si vous avez enregistré une fonction de fermeture, avec register_shutdown_function(). Avec une telle fonction, lorsque l’utilisateur interromp sa requête, à la prochaîne exécution du script, PHP va s’apercevoir que le dernier script n’a pas été terminé, et il va déclencher la fonction de fermeture. Cette fonction sera aussi appelée à la fin du script, si celui-ci se termine normalement. Pour pouvoir avoir un comportement différent suivant l’état du script lors de sa finalisation, vous pouvez exécutez des commandes spécifiques à la déconnexion grâce à la commande connection_aborted(). Cette fonction retournera TRUE si la connexion a été annulée. Votre script peut aussi éxpirer après un laps de temps. Par défaut, le délai est de 30 secondes. Cette valeur peut être changée en utilisant la directive PHP max_execution_time dans le fichier php.ini ou avec la directive php3_max_execution_time, dans le fichier Apache .conf ou encore avec la fonction set_time_limit(). Lorsque le délai éxpire, le script est terminé, et comme pour la déconnexion du client, une fonction de finalisation sera appelée. Dans cette fonction, vous pouvez savoir si c’est le délai d’éxpiration qui a causé la fin du script, en appelant la fonction connection_timeout(). Cette fonction retournera vrai si le délai d’éxpiration a été dépassé. Une chose à noter et que les deux cas ABORTED et TIMEOUT peuvent être appelés en même temps. Ceci est possible si vous demandez à PHP d’ignorer les déconnexions des utilisateurs. PHP va quand même noter le fait que l’utilisateur s’est déconnecté, mais le script va continuer. Puis, lorsqu’il atteint la limite de temps, le script va éxpirer. A ce moment là, les deux fonctions connection_timeout() et connection_aborted() vont retourner TRUE. Vous pouvez aussi vérifier les deux états en un seul appel avec la fonction connection_status(). Cette fonction va retourner un champs de bits, avec les états. Si les deux états sont actifs, l’état retourné prendra la valeur 3. 157 Chapitre 22. Connexions persistantes aux bases de données 158 Chapitre 22. Connexions persistantes aux bases de données Les connexions persistantes aux bases de données SQL sont des connexions qui ne se referment pas à la fin du script. Lorsqu’une connexion persistante est demandée, PHP s’assure qu’il n’y a pas une autre connexion identique (qui serait ouverte précédemment, avec le même nom d’hôte, d’utilisateur et le même mot de passe), et si une telle connexion existe, elle est utilisée. Sinon, elle est créée. Une connexion identique est une connexion qui a ouvert le même hôte, avec le même nom et même mot de passe (si ils sont nécessaires). Ceux qui ne sont pas rompus aux techniques des serveurs web et leur distribution de la charge de travail, se font parfois une fausse idée de ces connexions persistantes. En particulier, les connexions persistantes ne permettent pas l’ouverture de plusieurs sessions avec le même lien, ne permettent pas la réalisation de transactions efficaces et ne font pas le café. En fait, pour être extrêmement clair sur le sujet, les connexions persistantes ne vous donnent aucune fonctionnalité de plus que les connexions non persistantes. Alors pourquoi? Cela s’explique par la manière avec laquelle les serveurs web fonctionnent. Il y a trois manières d’utiliser PHP pour générer des pages. La première est d’utiliser PHP comme un CGI (Common Interface Gateway). Lorsque PHP fonctionne de cette manière, une instance de l’interpréteur PHP est créée puis détruit pour chaque page demandée. Etant donné qu’il est détruit après chaque requête, toutes les ressources acquises (comme une connexion à une base SQL), sont purement et simplement détruites. La deuxième méthode, et de loin, la plus prisée, est d’exécuter PHP sous la forme d’un module sur un serveur multi-process, ce qui revient à dire : Apache. Un tel serveur a typiquement un processus parent qui coordonne un ensemble de processus fils, qui servent les fichiers. Lorsque les requêtes parviennent depuis un client, elles sont transmises à un fils disponible. Cela signifie que si un client fait une deuxième requête, il peut être servi par un processus client différent du premier. Les connexions persistantes vous permettent alors de ne vous connecter à une base SQL que la première fois. Lors des connexions ultérieures, les processus fils pourront réutiliser la connexion ouverte précédemment. La dernière méthode est d’utiliser PHP sous la forme d’un module de serveur multi-threads. Actuellement, PHP 4 support ISAPI, WSAPI, et NSAPI (sous Windows), qui permettent tous d’utiliser PHP comme un module sur un serveur multi-thread tel que Netscape FastTrack, Microsoft’s Internet Information Server (IIS), et O’Reilly’s WebSite Pro. Le comportement est essentiellement le même que pour les serveurs multi-process décrit précédemment. Notez que SAPI n’est pas possible avec PHP 3. Si les connexions persistantes n’ont aucune fonctionnalité de plus, à quoi servent-elles? La réponse est extrêmement simple : efficacité. Les connexions persistantes sont un bon moyen d’accélérer les accès à une base SQL si le traitement de connexion à la base est long. Ce temps dépend de nombreux facteurs : le type de base de données, cette base est-elle sur le même serveur ou pas, quelle est la charge du serveur de base de données, etc... Si le temps de connexion est long, les connexions persistantes seront bien utiles, car une fois ouverte par un processus fils, la connexion est réutilisable sans avoir à se reconnecter. Si vous avez 20 processus fils, il suffit d’avoir 20 connexions persistantes ouvertes, une par fils. Notez que les connexions persistantes ont quelques inconvénients si vous hébergez une base de données, dont le nombre maximal de connexion risque d’être atteint par les connexions persistantes. Si votre base de données accepte jusqu’à 16 connections simultanées et que, 17 processus essaient de se connecte, le dernier restera sur la touche. Si il y a des erreurs dans les scripts qui ne permettent pas de fermer la connexion (par exemple, une boucle infinie), votre serveur sera rapidement engorgé. Vérifier la documentation de votre base de données pour savoir comment elle traite les connexions inactives ou abandonnées. Résumons nous : les connexions persistantes ont été définies pour avoir les mêmes fonctionnalités que les connexions non persistantes. Les deux types de connexions sont parfaitement interchangeables, et n’affecteront pas le comportement de votre script : uniquement son efficacité. 159 Chapitre 23. Safe mode 160 Chapitre 23. Safe mode Le "Safe Mode" est le mode de sécurité de PHP : une solution au problème de partage de PHP sur un serveur. Ce système pêche au niveau de l’architecture car il n’est pas correct de tenter de résoudre ce problème au niveau de PHP, mais les solutions alternatives basées sur le serveur web et l’OS ne sont pas réalistes. De nombreux acteurs, notamment les fournisseurs d’hébergement, utilise le "Safe Mode". Les directives de configuration qui contrôlent le safe mode sont : safe_mode = Off open_basedir = safe_mode_exec_dir = safe_mode_allowed_env_vars = PHP_ safe_mode_protected_env_vars = LD_LIBRARY_PATH disable_functions = Lorsque safe mod est actif, PHP vérifie que le propriétaire du script courant est le même que le propriétaire de fichier qui seront manipulé par ce script. Par exemple, si on a la situation suivante : -rw-rw-r--rw-r--r- 1 rasmus 1 root rasmus root 33 Jul 1 19:20 script.php 1116 May 26 18:01 /etc/passwd Exécuter le script script.php <?php readfile(’/etc/passwd’); ?> générera cette erreur, si le safe mode est activé : Warning: SAFE MODE Restriction in effect. The script whose uid is 500 is not allowed to access /etc/passwd owned by uid 0 in /docroot/script.php on line 2 Si vou utilisez la directive open_basedir au lieu du safe mode, alors les manipulations seront limitées aux fichiers situés dans les dossiers spécifiés. Par exemple : <Directory /docroot> php_admin_value open_basedir /docroot </Directory> Si vous exécutez le script script.php ci-dessus avec la configuration d’open_basedir le résultat sera l’affichage suivant : Warning: open_basedir restriction in effect. File is in wrong directory in /docroot/script.php on line 2 Vous pouvez aussi désactiver individuellement les fonctions. Par exemple, en ajoutant cette ligne dans le fichier php.ini : disable_functions readfile,system toute utilisation des fonctions readfile() et system() générera l’affichage suivant : Warning: readfile() has been disabled for security reasons in /docroot/script.php on line 2 161 Partie IV. Index des fonctions I. Apache 162 Apache ascii2ebcdic (PHP 3>= 3.0.17) Transforme une chaîne ASCII en EBCDIC int ascii2ebcdic (string ascii_str) ascii2ebcdic() est une fonction spéficique à Apache, qui n’est disponible que sur les OS qui gèrent le format EBCDIC (OS/390, BS2000). Elle traduit la chaîne ASCII ascii_str en son équivalent EBCDIC (avec protection des données binaires) et retourne le résultat. Voir aussi ebcdic2ascii() ebcdic2ascii (PHP 3>= 3.0.17) Transforme une chaîne EBCDIC en ASCII int ebcdic2ascii (string ebcdic_str) ebcdic2ascii() est une fonction spéficique à Apache, qui n’est disponible que sur les OS qui gèrent le format EBCDIC (OS/390, BS2000). Elle traduit la chaîne EBCDIC ebcdic_str en son équivalent ASCII (avec protection des données binaires) et retourne le résultat. Voir aussi ascii2ebcdic() apache_lookup_uri (PHP 3>= 3.0.4, PHP 4 >= 4.0b1) Effectue une requête partielle pour l’URI spécifiée et renvoie toutes les informations. class apache_lookup_uri (string filename) apache_lookup_uri() effectue une requête partielle pour l’URI spécifiée. Cette requête permet de récupérer toutes les informations importantes à propos de la ressource concernée. Les propriétés de la classe renvoyée sont les suivantes : status the_request status_line method content_type handler uri filename path_info args boundary no_cache no_local_copy allowed send_bodyct bytes_sent byterange clength unparsed_uri mtime request_time Note : apache_lookup_uri() ne fonctionne que lorsque le PHP est installé sous la forme d’un module Apache. 163 Apache apache_note (PHP 3>= 3.0.2, PHP 4 >= 4.0b1) Affiche ou affecte le paramètre "apache request notes". string apache_note (string note_name, string [note_value]) apache_note() est une fonction spécifique au serveur Apache. Cette fonction affecte ou renvoie la valeur de la variable contenue dans la table notes d’Apache. Si la fonction est appelée avec un argument, elle renvoie la valeur courante de la variable note_name. Si apache_note() est appelée avec deux arguments, apache_note() affecte à la note note_value la valeur note_name et apache_note() retournera la valeur précédente de la variable note_name. getallheaders (PHP 3, PHP 4 >= 4.0b1) Récupère toutes les en-têtes des requêtes HTTP. array getallheaders () getallheaders() renvoie un tableau associatif de toutes les en-têtes HTTP de la requête courante. Note : Vous pouvez récupérer la valeur d’une variable d’une CGI en la lisant à partir des variables d’environnement, ce qui fonctionne aussi bien dans le cas d’une installation en module ou d’une installation en CGI. Utilisez la fonction phpinfo() pour avoir une liste de toutes les variables d’environnement disponibles. Exemple 1. Exemple avec getallheaders() <?php $headers = getallheaders(); while (list($entete, $valeur) = each($headers)) { echo "$entete: $valeur<br>\n"; } ?> Cet exemple est un exemple d’affichage de toutes les en-têtes de la requête courante. Note : getallheaders() ne fonctionne que si PHP est installé comme module Apache. virtual (PHP 3, PHP 4 >= 4.0b1) Effectue une sous-requête Apache int virtual (string filename) virtual() est une fonction spécifique au serveur Apache. Elle est équivalente à la directive "<!-#include virtual...-->" lorsque vous utilisez le module include d’Apache. Cette fonction effectue une sous-requête Apache. C’est très utile lorsque vous utilisez des scripts CGI, des fichiers .shtml ou n’importe quel type de fichier qui doit être analysé par le serveur Apache. Il est à noter que lors de l’utilisation avec des scripts CGI, ces derniers doivent générer une en-tête valide, c’est-à-dire, au minimum une en-tête "Content-Type". Pour les fichiers PHP, il est conseillé d’utiliser les fonctions include() et require(). virtual() ne peut pas être utilisé pour inclure un fichier qui est lui-même un fichier PHP. 164 II. Tableaux Ces fonctions vous permettent de manipuler et de traiter les tableaux de nombreuses façons. Les tableaux sont très efficaces dès qu’il s’agit de stocker, gérer et traiter des données en groupe. Les tableaux simples et multi-dimensionnels sont supportés et peuvent être créés par l’utilisateur, ou par une fonction. Il y a des fonctions spécifiques qui remplissent des tableaux à partir de résultats de requêtes, et de nombreuses fonctions retournent un tableau. Voir aussi is_array(), explode(), implode(), split() et join(). 165 Tableaux array (unknown) Crée un tableau array array ([mixed ...]) array() retourne un tableau créé avec les paramètres passés. On peut attribuer un index particulier à une valeur avec l’opérateur =?>. Note : array() est un élément de langage utilisé pour représenter des tableaux litéraux, et non pas une fonction au sens strict du terme. La syntaxe "index => valeur", séparée par des virgules, définit les index et leur valeur. Un index peut être une chaîne ou un nombre. Si l’index est omis, un index numérique sera automatiquement généré (commençant à 0). Si l’index est un entier, le prochain index généré prendra la valeur d’index la plus grande + 1. Notez que si deux index identiques sont définis, le dernier remplacera le premier. L’exemple suivant montre comment créer un tableau à deux dimensions, comment spécifier les index d’un tableau associatif, et comment générer automatiquement des index numériques. Exemple 1. Exemple avec array() <?php $fruits = array ( "fruits" => array ("a" => "orange", "b" => "banane", "c" => "pomme"), "numbres" => array (1, 2, 3, 4, 5, 6), "trous" => array ("premier", 5 => "deuxième", "troisième") ); ?> Exemple 2. Index automatique d’un tableau avec array() <?php $array = array( 1, 1, 1, 1, print_r($array); ?> 1, 8=>1, 4=>1, 19, 3=>13); qui affichera : Array ( [0] [1] [2] [3] [4] [8] [9] ) => => => => => => => 1 1 1 13 1 1 19 Notez bien que l’index ’3’ est défini deux fois, et conserve finalement sa dernière valeur de 13. L’index ’4’ est défini après l’index ’8’, et l’index généré suivant (valeur 19) est 9, puisque le plus grand index est alors 8. Cet exemple crée un tableau dont les index commencent à 1. 166 Tableaux Exemple 3. Tableau d’index commençant à 1 <?php $firstquarter = array(1 => ’Janvier’, ’Février’, ’Mars’); print_r($firstquarter); ?> qui affichera : Array ( [1] => ’Janvier’ [2] => ’Février’ [3] => ’Mars’ ) Voir aussi list(). array_count_values (PHP 4 >= 4.0b4) Compte le nombre de valeurs dans un tableau array array_count_values (array input) array_count_values() retourne un tableau contenant les valeurs du tableau input comme clés et leurs fréquence comme valeur. Exemple 1. Exemple avec array_count_values() <?php $array = array(1, "bonjour", 1, "monde", "bonjour"); array_count_values($array); // retourne array(1=>2, "bonjour"=>2, "monde"=>1) ?> Note : array_count_values() a été ajoutée en PHP 4.0. array_diff (PHP 4 >= 4.0.1) Calcule la différence entre deux tableaux array array_diff (array array1, array array2 [, array ...]) array_diff() retourne un tableau qui contient toutes les valeurs du tableau array1 qui sont absentes de tous les autres arguments. Notez que les clés sont préservées. 167 Tableaux Exemple 1. Exemple avec array_diff() <?php $array1 = array ("a" => "vert", "rouge", "bleu", "rouge"); $array2 = array ("b" => "vert", "jaune", "rouge"); $result = array_diff ($array1, $array2); ?> $result contient array("bleu");. Les valeurs multiples dans $array1 seront toutes traitées de la même façon. Voir aussi array_intersect(). array_filter (PHP 4 >= 4.0.6) Filtre les éléments d’un tableau array array_filter (array input [, mixed callback]) array_filter() retourne un tableau contenant les éléments du tableau input, filtrés grâce à la fonction callback. Si input est un tableau associatif, les clés sont préservées. Exemple 1. Exemple avec array_filter() <?php function pair($var) { return ($var % 2 == 1); } function impair($var) { return ($var % 2 == 0); } $array1 = array("a"=>1, "b"=>2, "c"=>3, "d"=>4, "e"=>5); $array2 = array(6, 7, 8, 9, 10, 11, 12); $tableau_pair = array_filter($array1, "pair"); $tableau_impair = array_filter($array2, "impair"); ?> Cet exemple montre comment extraire les nombres pairs dans $tableau_impair : ce dernier contient array ("a"=>1, "c"=>3, "e"=>5);, et les nombres impairs dans $tableau_pair : ce dernier contient array (6, 8, 10, 12);, Voir aussi array_map() et array_reduce(). array_flip (PHP 4 >= 4.0b4) Remplace les clés par les valeurs, et les valeurs par les clés array array_flip (array trans) array_flip() retourne un tableau dont les clés sont les valeurs du précédent tableau, et les valeurs sont les clés. array_flip() ne fonctionne que sur des entiers et des chaînes, et affichera une erreur s’il détecte une clé ou une valeur de type invalide (tableau, objet, booléen, nombre à virgule flottante). Si une valeur n’est pas unique, seule la dernière clé sera utilisée comme valeur, et toutes les autres seront perdues. array_flip() retourne FALSE en cas d’échec. 168 Tableaux Exemple 1. Exemple avec array_flip() <?php $trans = array_flip ($trans); $original = strtr ($str, $trans); ?> Exemple 2. array_flip() example : collision <?php $trans = array ("a" => 1, "b" => 1, "c" => 2); $trans = array_flip ($trans); // et $trans vaut : array(1 => "b", 2 => "c"); ?> Note : array_flip() a été ajoutée en PHP 4.0. array_intersect (PHP 4 >= 4.0.1) Calcule l’intersection de tableaux array array_intersect (array array1, array array2 [, array ...]) array_intersect() retourne un tableau contenant toutes les valeurs de array1 qui sont présentes dans tous les autres arguments. Notez que les clés sont préservées. Exemple 1. Exemple avec array_intersect() <?php $array1 = array ("a" => "vert", "rouge", "bleu"); $array2 = array ("b" => "vert", "jaune", "rouge"); $result = array_intersect ($array1, $array2); ?> $result contient array ("a" => "vert", "rouge");. Voir aussi array_diff(). array_keys (PHP 4 >= 4.0b1) Retourne toutes les clés d’un tableau array array_keys (array input, mixed [search_value]) array_keys() retourne les clés numériques et littérales du tableau input. Si l’option search_value est spécifiée, seules les clés ayant cette valeur seront retournées. Sinon, toutes les clés de input sont retournées. 169 Tableaux Exemple 1. Exemple avec array_keys() <?php $array = array(0 => 100, "couleur" => "rouge"); array_keys($array); // retourne array(0, "couleur") $array = array("bleu", "rouge", "vert", "bleu", "bleu"); array_keys($array, "bleu"); // retourne array(0, 3, 4) $array = array( "couleur" => array("bleu", "rouge", "vert"), "taille" => array("petit", "moyen", "grand") ); array_keys($array); // retourne array("couleur", "taille") ?> Note : array_keys() a été ajoutée en PHP 4. Ci-dessous, voici une implémentation qui fonctionnera sous PHP 3: Exemple 2. Implémentation de array_keys() pour les utilisateurs de PHP 3 <?php function array_keys ($arr, $term="") { $t = array(); while (list($k,$v) = each($arr)) { if ($term && $v != $term) continue; $t[] = $k; } return $t; } ?> Voir aussi array_values(). array_map (PHP 4 >= 4.0.6) Applique sur fonction sur des tableaux array array_map (mixed callback, array arr1 [, array ...]) array_map() retourne un tableau contenant tous les éléments du tableau arr1, après leur avoir appliqué la fonction callback. Le nombre de paramètres de la fonction callback doit être égal au nombre de tableaux passés dans la fonction array_map(). Exemple 1. Exemple avec array_map() <?php function cube($n) { return $n*$n*$n; } $a = array(1, 2, 3, 4, 5); $b = array_map("cube", $a); ?> Avec cet exemple, la variable $b contiendra array (1, 8, 27, 64, 125);. 170 Tableaux Exemple 2. array_map() - utilisation de plusieurs tableaux <?php function parle_espagnol($n, $m) { return "Le nombre $n se dit $m en espagnol"; } function map_espagnol($n, $m) { return array($n => $m); } $a = array(1, 2, 3, 4, 5); $b = array("uno", "dos", "tres", "cuatro", "cinco"); $c = array_map("parle_espagnol", $a, $b); print_r($c); // Affichera : // Array // ( // [0] => Le nombre 1 se dit uno en espagnol // [1] => Le nombre 2 se dit dos en espagnol // [2] => Le nombre 3 se dit tres en espagnol // [3] => Le nombre 4 se dit cuatro en espagnol // [4] => Le nombre 5 se dit cinco en espagnol // ) $d = array_map("map_espagnol", $a , $b); print_r($d); // Affichera : // Array // ( // [0] => Array // ( // [1] => uno // ) // // [1] => Array // ( // [2] => dos // ) // // [2] => Array // ( // [3] => tres // ) // // [3] => Array // ( // [4] => cuatro // ) // // [4] => Array // ( // [5] => cinco // ) // // ) ?> Généralement, lorsque vous utilisez plusieurs tableaux, ils doivent être de même longueur, car la fonction de callback est appliqué à un élément de chaque tableau. Si les tableaux sont de taille inégale, les plus petits seront complétés avec des éléments vides. Une utilisation interessante de cette fonction est de construire des tableaux de tableaux, grâce à la fonction de callback NULL. 171 Tableaux Exemple 3. array_map() - création d’un tableau de tableaux <?php $a = array(1, 2, 3, 4, 5); $b = array("un", "deux", "trois", "quatre", "cinq"); $c = array("uno", "dos", "tres", "cuatro", "cinco"); $d = array_map(null, $a, $b, $c); print_r($d); // affichera : // Array // ( // [0] => Array // ( // [0] => 1 // [1] => un // [2] => uno // ) // // [1] => Array // ( // [0] => 2 // [1] => deux // [2] => dos // ) // // [2] => Array // ( // [0] => 3 // [1] => trois // [2] => tres // ) // // [3] => Array // ( // [0] => 4 // [1] => quatre // [2] => cuatro // ) // // [4] => Array // ( // [0] => 5 // [1] => cinq // [2] => cinco // ) // // ) ?> Voir aussi array_filter() et array_reduce(). array_merge (PHP 4 >= 4.0b1) Rassemble plusieurs tableaux array array_merge (array array1, array array2 [, array ...]) array_merge() rassemble les éléments de plusieurs tableaux ensembles, en ajoutant les valeurs de l’un à la fin de l’autre. Le résultat est un tableau. 172 Tableaux Si les tableaux ont des clés en commun, la dernière valeur rencontrée écrasera l’ancienne. Pour les valeurs numériques, cela n’arrive pas, car alors, les valeurs sont ajoutées en fin de tableau. Exemple 1. Exemple avec array_merge() <?php $array1 = array ("couleur" => "rouge", 2, 4); $array2 = array ("a", "b", "couleur" => "vert", "forme" => "trapézoïde"); array_merge ($array1, $array2); ?> Le résultat sera array("couleur" => "vert", 2, 4, "a", "b", "forme" => "trapézoîde"). Note : array_merge() a été ajoutée dans PHP 4.0. array_merge_recursive (PHP 4 >= 4.0.1) Combine plusieurs tableaux ensembles, récursivement array array_merge_recursive (array array1, array array2 [, array ...]) array_merge_recursive() rassemble tous les éléments de plusieurs tableaux ensembles, en ajoutant les éléments de l’un à la suite des éléments du précédent. array_merge_recursive() retourne le tableau résultant. Si les tableaux passés en arguments ont les mêmes clés (chaînes de caractères), les valeurs sont alors rassemblées dans un tableau, de manière récursive, de façon à ce que, si l’une de ces valeurs est un tableau elle-même, la fonction la rassemblera avec les valeurs de l’entrée courante. Cependant, si deux tableaux ont la même clé numérique, la dernière valeur n’écrasera pas la précédente, mais sera ajoutée à la fin du tableau. Exemple 1. Exemple avec array_merge_recursive() <?php $ar1 = array ("couleur" => array ("favorie" ?> "rouge"), 5); $ar2 = array (10, "couleur" ?> array ("favorie" ?> "vert", "rouge")); $result = array_merge_recursive ($ar1, $ar2); ?> Le résultat sera array("couleur" => array("favorie" => array ("rouge", "vert"), "bleu"), 5, 10). Voir aussi array_merge(). array_multisort (PHP 4 >= 4.0b4) Tri multi-dimensionnel boolean array_multisort (array ar1 [, mixed arg [, mixed ... [, array ...]]]) array_multisort() sert à trier simultanément plusieurs tableaux, ou bien à trier un tableau multi-dimensionnel, suivant l’une ou l’autre de ses dimensions. Les clés sont préservées. 173 Tableaux Les tableaux passés en arguments sont traités comme les colonnes d’une table, triées par lignes (un peu comme la clause SQL ORDER BY). Le premier tableau est la clé primaire de tri. Les valeurs du premier tableau qui sont égales, sont triées grâce au tableau suivant, et ainsi de suite... La structure des arguments de array_multisort() est un peu inhabituelle, mais elle est plus souple. Le premier argument DOIT être un tableau, mais les arguments suivants peuvent être des tableaux ou une ou deux options de tri, prises dans les valeurs suivantes : Options de tri : • SORT_ASC - Tri en ordre ascendant • SORT_DESC - Tri en ordre descendant Options de type de tri: • SORT_REGULAR - Comparaison normale des valeurs • SORT_NUMERIC - Comparaison numérique des valeurs • SORT_STRING - Comparaison alphabétique des valeurs Une seule option de tri de chaque type peut être appliquée après un tableau. Une option ne s’applique qu’au tableau précédent. Tous les autres sont mis par défaut à SORT_ASC et SORT_REGULAR. array_multisort() retourne TRUE en cas de succès, FALSE sinon. Exemple 1. Trier plusieurs tableaux <?php $ar1 = array ("10", 100, 100, "a"); $ar2 = array (1, 3, "2", 1); array_multisort ($ar1, $ar2); ?> Dans cet exemple, après le tri, le premier tableau contient 10, "a", 100, 100; Le deuxième tableau contient 1, 1, "2", 3. Les entrées du second tableau correspondant aux valeurs jumelles du premier tableau (100 et 100), sont aussi triées. Exemple 2. Classer un tableau multidimensionnel <?php $ar = array (array ("10", 100, 100, "a"), array (1, 3, "2", 1)); array_multisort ($ar[0], SORT_ASC, SORT_STRING, $ar[1], SORT_NUMERIC, SORT_DESC); ?> Dans cet exemple, après le tri, le premier tableau contient 10, 100, 100, "a" (tri alphabétique, ordre croissant); Le deuxième tableau contient 1, 3, "2", 1 (tri numérique, ordre décroissant). array_pad (PHP 4 >= 4.0b4) Complète un tableau jusqu’à la longueur spécifiée, avec une valeur. array array_pad (array input, int pad_size, mixed pad_value) 174 Tableaux array_pad() retourne une copie du tableau input complété jusqu’à la taille de pad_size avec la valeur pad_value. Si pad_size est positif, alors le tableau est complété à droite, s’il est négatif, il est complété à gauche. Si la valeur absolue de pad_size est plus petite que la taille du tableau input, alors le tableau n’est pas complété. Exemple 1. Exemple avec array_pad() <?php $input = array(12, 10, 9); $result = array_pad($input, // Le résultat est array (12, $result = array_pad($input, // Le résultat est array (-1, $result = array_pad($input, // pas complété ?> 5, 0); 10, 9, 0, 0) -7, -1); -1, -1, -1, 12, 10, 9) 2, "noop"); array_pop (PHP 4 >= 4.0b1) Dépile un élément de la fin d’un tableau mixed array_pop (array array) array_pop() dépile et retourne le dernier élément du tableau array, le raccourcissant d’un élément. Si array est vide, ou n’est pas un tableau, array_pop() retourne NULL. Exemple 1. Exemple avec array_pop() <?php $stack = array("orange", "pomme", "framboise"); $fruit = array_pop($stack); ?> Après ceci, $stack n’a plus que 2 éléments: "orange" et "pomme", tandis que $fruit contient "framboise". Voir aussi array_push(), array_shift() et array_unshift(). Note : array_pop() a été ajoutée en PHP 4.0. array_push (PHP 4 >= 4.0b1) Empile un ou plusieurs éléments à la fin d’un tableau int array_push (array array, mixed var [, mixed ...]) array_push() considère array comme une pile, et empile les variables passées en paramètres à la fin de array. La longueur du tableau array augmente d’autant. Cela a le même effet que : <?php $array[] = $var; 175 Tableaux ?> repeté pour chaque var. array_push() retourne le nouveau nombre d’éléments du tableau. Exemple 1. Exemple avec array_push() <?php $stack = array (1, 2); array_push($stack, "+", 3); ?> Cet exemple fait que $stack a 4 éléments: 1, 2, "+", et 3. Voir aussi array_pop(), array_shift() et array_unshift(). Note : array_push() a été ajoutée en PHP 4.0. array_reverse (PHP 4 >= 4.0b4) Renverse l’ordre des éléments d’un tableau array array_reverse (array array [, boolean preserve_keys]) array_reverse() prend le tableau array et retourne un nouveau tableau qui contient les mêmes éléments mais dans l’ordre inverse, en préservant les clés si le paramètre preserve_keys vaut TRUE. Exemple 1. Exemple avec array_reverse() <?php $input = array ("php", 4.0, array ("rouge", "vert")); $result = array_reverse ($input); $result_keyed = array_reverse ($input, TRUE); ?> Au final, $result et $result_keyed contiennent tous les deux array ("rouge", "vert"), 4.0, "php", dans cet ordre. Mais $result_keyed[0] vaut toujours "php". Note : array_reverse() a été ajoutée en PHP 4.0 Beta 3. Note : Le second paramètre preserve_keys a été ajouté en PHP 4.0.3. array_reduce (PHP 4 >= 4.0.5) Réduit itérativement un tableau mixed array_reduce (array input, mixed callback [, int initial]) 176 Tableaux array_reduce() applique itérativement la fonction callback aux éléments du tableau input, de manière à réduire le tableau à une valeur simple. Si l’argument optionnel intial est disponible, il sera utilisé pour initialiser le processus, ou bien comme valeur finale si le tableau est vide. Exemple 1. Exemple avec array_reduce() <?php function rsum($v, $w) { $v += $w; return $v; } function rmul($v, $w) { $v *= $w; return $v; } $a = array(1, 2, 3, 4, 5); $x = array(); $b = array_reduce($a, "rsum"); $c = array_reduce($a, "rmul", 10); $d = array_reduce($x, "rsum", 1); ?> Dans cet exemple, $b contiendra 15, $c contiendra 1200 (= 1*2*3*4*5*10), et $d contiendra 1. Voir aussi array_filter() et array_map(). array_rand (PHP 4 >= 4.0.0) Prend une ou plusieurs valeurs, au hasard dans un tableau mixed array_rand (array input [, int num_req]) array_rand() est pratique lorsque vous voulez sélectionner une ou plusieurs valeurs au hasard dans un tableau. Le paramètre input est un tableau, et num_req spéficie le nombre de valeurs que vous voulez obtenir (par défaut, c’est 1). Si vous ne demandez qu’une entrée, array_rand() retourne l’index de la valeur. Sinon, elle retourne un tableau d’index. Cela vous permet de faire une sélection au hasard de clés, ou bien de valeurs. N’oubliez pas d’appeler srand() pour initialiser le générateur de nombres aléatoires. Exemple 1. Exemple avec array_rand() <?php srand ((double) microtime() * 10000000); $input = array ("Neo", "Morpheus", "Trinitée", "Cypher", "Tank"); $rand_keys = array_rand ($input, 2); print $input[$rand_keys[0]]."\n"; print $input[$rand_keys[1]]."\n"; ?> array_shift (PHP 4 >= 4.0b1) Dépile un élément au début d’un tableau mixed array_shift (array array) 177 Tableaux array_shift() extrait la première valeur d’un tableau et la retourne, en raccourcissant le tableau d’un élément, et en déplacant tous les éléments vers le bas. Si array est vide, ou n’est pas un tableau, array_shift() retourne NULL. Exemple 1. Exemple avec array_shift() <?php $args = array("-v", "-f"); $opt = array_shift($args); ?> Cet exemple aura pour résultat que $args ne contiendra plus que "-f", et $opt contient "-v". Voir aussi array_unshift(), array_push() et array_pop(). Note : array_shift() a été ajoutée en PHP 4.0. array_slice (PHP 4 >= 4.0b1) Extrait une portion de tableau array array_slice (array array, int offset, int [length]) array_slice() retourne une série d’ élément du tableau array commençant à l’offset offset et représentant length éléments. Si offset est positif, la série commencera à cet offset dans le tableau array. Si offset est négatif, cette série commencera à l’offset offset mais en commençant à la fin du tableau array. Si length est fourni et positif, alors la série retournée aura autant d’éléments. Si length est fourni et négatif, alors la série contiendra les éléments depuis l’offset offset jusqu’à length éléments en partant de la fin. Si length est omis, la séquence lira tous les éléments du tableau, depuis l’offset précisé jusqu’à la fin du tableau. Exemple 1. Exemple avec array_slice() <?php $input = array("a", "b", "c", "d", "e"); $output = array_slice($input, 2); // retourne "c", "d", et "e" // les trois exemples suivants sont équivalents $output = array_slice($input, 2, 2); // retourne "c", "d" $output = array_slice($input, 2, -1); // retourne "c", "d" // Equivalent à : $offset = 2; $length = -1; $output = array_slice($input, 2, count($input) - $offset + $length); // retourne "c", "d" $output = array_slice($input, -2, 1); // retourne "d" $output = array_slice($input, 0, 3); // retourne "a", "b", et "c" ?> Voir aussi array_splice(). Note : array_slice() a été ajoutée en PHP 4.0. 178 Tableaux array_splice (PHP 4 >= 4.0b1) Efface et remplace une portion de tableau array array_splice (array input, int offset [, int length, array [replacement]]) array_splice() supprime les éléments désignés par offset et length du tableau input et les remplace par les éléments du tableau replacement, si ce dernier est présent. Si offset est positif, la série commencera à cet offset dans le tableau input. Si offset est négatif, cette série commencera à l’offset offset mais en commençant à la fin du tableau input. Si length est donné et positif, alors la série aura autant d’éléments. Si length est donné et négatif, les éléments seront pris dans l’ordre inverse. Si length est omis, la séquence lira tous les éléments du tableau, depuis l’offset offset jusqu’à la fin du tableau. Conseil : pour supprimer tous les éléments du tableau depuis offset jusqu’à la fin, même si un tableau de remplacement replacement est spécifié, utilisez count(count($input)) à la place de length. Si replacement est précisé, alors les éléments supprimés sont remplacés par les éléments de ce tableau. Si l’offset et length sont tels que la taille du tableau ne change pas, alors les éléments du tableau de remplacement replacement sont insérés à partir de l’offset offset. Conseil : si le tableau de remplacement ne contient qu’un seul élément, il n’est pas obligatoire de forcer le type en tableau avec array(), à moins que cette variable ne soit elle-même un tableau. Les codes suivants sont équivalents : <?php array_push($input, $x, $y) array_pop($input) array_shift($input) array_unshift($input, $x, $y) $a[$x] = $y ?> array_splice($input, array_splice($input, array_splice($input, array_splice($input, array_splice($input, count($input), 0, array($x, $y)) -1) 0, 1) 0, 0, array($x, $y)) $x, 1, $y) array_splice() retourne le tableau des éléments supprimés. Exemple 1. Exemples avec array_splice() <?php // cas simple $input = array("rouge", "vert", "bleu", "jaune"); array_splice($input, 2); // $input est array("rouge", "vert") // nombre d’éléments négatif $input = array("rouge", "vert", "bleu", "jaune"); array_splice($input, 1, -1); // $input est array("rouge", "jaune") // avec un élément de remplacement $input = array("rouge", "vert", "bleu", "jaune"); array_splice($input, 1, count($input), "orange"); // $input est array("rouge", "orange") // cas complexe $input = array("rouge", "vert", "bleu", "jaune"); array_splice($input, -1, 1, array("noir", "marron")); // $input est array("rouge", "vert", // "bleu", "noir", "marron") ?> Voir aussi array_slice(). Note : array_splice() a été ajoutée en PHP 4.0. 179 Tableaux array_sum (PHP 4 >= 4.0.4) Calcule la somme des valeurs du tableau mixed array_sum (array arr) array_sum() retourne la somme des valeurs du tableau, sous forme d’un entier ou d’un nombre à virgule flottante. Exemple 1. Exemple avec array_sum() <?php $a = array(2,4,6,8); echo "somme(a) = ".array_sum($a)."\n"; // affiche : somme(a) = 20 $b = array("a"=>1.2,"b"=>2.3,"c"=>3.4); echo "somme(b) = ".array_sum($b)."\n"; // affiche : somme(b) = 6.9 ?> array_unique (PHP 4 >= 4.0.1) Dédoublonne un tableau array array_unique (array array) array_unique() prend le tableau array et retourne un nouveau tableau, complètement dédoublonné. Notez que les clés sont préservées. array_unique() conserve la clé de la première valeur rencontrée, et ignore toutes les suivantes. Exemple 1. Exemple avec array_unique() <?php $input = array ("a" => "vert", "rouge", "b" => "vert", "bleu", "rouge"); $result = array_unique ($input); print_r($result); // Cela va afficher : //Array //( // [a] => vert // [0] => rouge // [1] => bleu //) ?> Notez aussi que array_unique() tient compte du type de la valeur. Cela ne porte généralement pas à conséquence, sauf si votre tableau contient des nombres, qui peuvent être de différents types. Cela conduit à des résultats déroutants. 180 Tableaux Exemple 2. array_unique() et les types de valeurs <?php $input = array(4,"3",3,"4",4,4); $result = array_unique($input); print_r($result); // Cela va afficher : //Array //( // [0] => 3 // [1] => 3 // [2] => 4 // [3] => 4 //) ?> array_unshift (PHP 4 >= 4.0b1) Empile un ou plusieurs éléments au début d’un tableau int array_unshift (array array, mixed var [, mixed ...]) array_unshift() ajoute les éléments passés en argument au début du tableau array. Notez que les éléments sont ajoutés comme un tout, et qu’ils restent dans le même ordre. array_unshift() retourne le nouveau nombre d’éléments du tableau array. Exemple 1. Exemples avec array_unshift() <?php $queue = array("p1", "p3"); array_unshift($queue, "p4", "p5", "p6"); ?> Le résultat de cet exemple est que $queue aura 5 éléments, à savoir: "p4", "p5", "p6", "p1", et "p3". Voir aussi array_shift(), array_push(), et array_pop(). Note : array_unshift() a été ajoutée en PHP 4.0. array_values (PHP 4 >= 4.0b1) Retourne les valeurs d’un tableau array array_values (array input) array_values()retourne les valeurs du tableau input. 181 Tableaux Exemple 1. Exemples avec array_values() <?php $array = array("taille" => "XL", "couleur" => "or"); array_values($array); // // retourne array("XL", "or") ?> Note : array_values() a été ajoutée en PHP 4. Ci-dessous, voici une implémentation pour ceux qui utilisent toujours PHP 3. Exemple 2. Implémentation de array_values() pour les utilisateurs PHP 3 <?php function array_values($arr){ $t = array(); while (list($k, $v) = each($arr)){ $t[] = $v; } return $t; } ?> array_walk (PHP 3>= 3.0.3, PHP 4 >= 4.0b1) Exécute une fonction sur chacun des membres d’un tableau. int array_walk (array arr, string func, mixed userdata) array_walk() exécute la fonction func avec chaque élément du tableau arr. Les éléments sont passés en tant que premier argument de la fonction func. func doit être une fonction définie par l’utilisateur, et non pas une fonction native PHP. Vous ne pouvez pas utiliser array_walk() directement avec str2lower(), il faut absolument passer par une fonction utilisateur. Si func a besoin de plus d’un argument, une alerte sera générée pour chaque appel de func. Ces alertes sont supprimées en ajoutant le suffixe ’@’ avant l’appel de array_walk() ou simplement en utilisant error_reporting(). Note : Si func doit travailler avec les véritables valeurs du tableau, spécifiez que le premier paramètre de func doit être passé par référence. Alors, les éléments seront directement modifiés dans le tableau. Note : Passer les clés et userdata à func a été ajouté en PHP 4.0. En PHP 4, reset() doit être appelé si nécessaire, car array_walk() ne réinitialise pas automatiquement le tableau. Exemple 1. Exemple avec array_walk() <?php $fruits = array ("d"=>"citron", "a"=>"orange", "b"=>"banane", "c"=>"pomme"); function test_alter (&$item1, $key, $prefix) { $item1 = "$prefix: $item1"; } function test_print ($item2, $key) { echo "$key. $item2<br>\n"; } array_walk ($fruits, ’test_print’); 182 Tableaux reset ($fruits); array_walk ($fruits, ’test_alter’, ’fruit’); reset ($fruits); array_walk ($fruits, ’test_print’); ?> Voir aussi each() et list(). arsort (PHP 3, PHP 4 >= 4.0b1) Trie un tableau en ordre inverse void arsort (array array) arsort() trie un tableau de telle manière que la corrélation entre les index et les valeurs soit conservée. L’usage principal est lors de tri de tableaux associatifs où l’ordre des éléments est important. Exemple 1. Exemple avec arsort() <?php $fruits = array("d"=>"papaye","a"=>"orange","b"=>"banane","c"=>"ananas"); arsort ($fruits); for (reset ($fruits); $key = key ($fruits); next ($fruits)) { echo "fruits[$key] = ".$fruits[$key]."\n"; } ?> Cet exemple va afficher: fruits[d] = papaye fruits[a] = orange fruits[b] = banane fruits[c] = ananas Les fruits ont été triés en ordre alphabétique inverse, et leurs index respectifs ont été conservés. Voir aussi array-multisort(), asort(), krsort(), ksort(), natsort(), natcasesort(), rsort(), sort(), uasort(), uksort() et usort(). asort (PHP 3, PHP 4 >= 4.0b1) Trie un tableau en ordre void asort (array array) asort() trie un tableau de telle manière que la corrélation entre les index et les valeurs soit conservée. L’usage principal est lors de tri de tableaux associatifs où l’ordre des éléments est important. Exemple 1. Exemple avec asort() <?php $fruits = array( "d"=>"papaye", "a"=>"orange", "b"=>"banane", "c"=>"ananas"); asort($fruits); for(reset($fruits); $key = key($fruits); next($fruits)) { echo "fruits[$key] = ".$fruits[$key]."\n"; } ?> Cet exemple va afficher: fruits[c] = ananas fruits[b] = banane fruits[a] = orange fruits[d] = papaye Les fruits ont été triés par ordre alphabétique, et leurs index respectifs ont été conservés. 183 Tableaux Voir aussi array-multisort(), arsort(), krsort(), ksort(), natsort(), natcasesort(), rsort(), sort(), uasort(), uksort() et usort(). compact (PHP 4 >= 4.0b1) Crée un tableau contenant les variables et leur valeur array compact (string|array varname [, mixed ...]) compact() accepte différents paramètres. Les paramètres peuvent être des variables contenant des chaînes, ou un tableau de chaînes, qui peut contenir d’autres tableaux de noms, que compact() traitera récursivement. Pour chacun des arguments, compact() recherche une variable avec une variable de même nom dans la table courante des symboles, et l’ajoute dans le tableau, de manière à avoir la relation nom => ’valeur de variable’. En bref, c’est le contraire de la fonction extract(). compact() retourne le tableau ainsi créé. Exemple 1. Exemple avec compact() <?php $ville = "San Francisco"; $etat = "CA"; $evenement = "SIGGRAPH"; $location_vars = array("ville", "etat"); $result = compact("evenement", $location_vars); ?> Après cette opération, $result sera le tableau suivant : array(("evenement" => "SIGGRAPH", "ville" => "San Francisco", "etat" => "CA"). Voir aussi extract(). Note : compact() a été ajoutée en PHP 4.0. count (PHP 3, PHP 4 >= 4.0b1) Compte le nombre d’éléments d’un tableau int count (mixed var) count() retourne le nombre d’éléments dans var, qui est généralement un tableau (et tout le reste n’aura qu’un élément). count() retourne 1 si la variable n’est pas un tableau. count() retourne 0 si la variable n’est pas créée. Avertissement count() peut retourner 0 pour une variable qui n’a pas été affectée, ou pour un tableau vide. Utilisez plutôt isset() pour tester si la variable existe. 184 Tableaux Exemple 1. Exemple avec count() <?php $a[0] = 1; $a[1] = 3; $a[2] = 5; $result = count ($a); //$result == 3 ?> Voir aussi sizeof(), isset() et is_array(). current (PHP 3, PHP 4 >= 4.0b1) Transforme une variable en tableau mixed current (array array) Chaque tableau entretient un pointeur interne, qui est initialisé lorsque le premier élément est inséré dans le tableau. current() ne fait que retourner l’élément courant pointé par le pointeur interne du tableau array. current() ne déplace pas le pointeur. Si le pointeur est au-delà du dernier élément de la liste, current() retourne FALSE. Avertissement Si le tableau des éléments vides ou des zéros (0 ou "", la chaîne vide) alors current() retournera FALSE pour ces éléments. Il est donc impossible de déterminer si vous êtes réellement à la fin de la liste en utilisant la fonction current(). Pour passer en revue proprement un tableau qui peut contenir des éléments vides ou des zéros, utilisez la fonction each(). Voir aussi end(), next(), prev() et reset(). each (PHP 3, PHP 4 >= 4.0b1) Retourne chaque paire clé/valeur d’un tableau array each (array array) each() retourne la paire (clé/valeur) courante du tableau array et avance le pointeur de tableau. Cette paire est retournée dans un tableau de 4 éléments, avec les clés 0, 1, key, et value. Les éléments 0 et key contiennent le nom de la clé et, et 1 et value contiennent la valeur. Si le pointeur interne de fichier est au-delà de la fin du tableau, each() retourne FALSE. Exemple 1. Exemples avec each() <?php $foo = array("bob", "fred", "jussi", "jouni", "egon", "marliese"); $bar = each($foo); ?> $bar contient maintenant les paires suivantes: • • • 0 => 0 1 => ’bob’ key => 0 185 Tableaux • value => ’bob’ <?php $foo = array ("Robert" => "Bob", "Seppo" => "Sepi"); $bar = each ($foo); ?> $bar contient maintenant les paires suivantes: 0 => ’Robert’ 1 => ’Bob’ • key => ’Robert’ • value => ’Bob’ • • each() est utilisé conjointement avec list() pour étudier tous les éléments d’un tableau; par exemple, $HTTP_POST_VARS: Exemple 2. Affichage de $HTTP_POST_VARS avec each() <?php echo "Valeurs transmises par la méthode POST:<br>"; reset ($HTTP_POST_VARS); while (list ($key, $val) = each ($HTTP_POST_VARS)) { echo "$key => $val<br>"; } ?> Après chaque each(), le pointeur de tableau est déplacé au dernier élément, ou sur le dernier élément, lorsqu’on arrive à la fin. Voir aussi key(), list(), current(), reset(), next() et prev(). end (PHP 3, PHP 4 >= 4.0b1) Positionne le pointeur de tableau en fin de tableau end (array array) end() déplace le pointeur interne du tableau array jusqu’au dernier élément. Voir aussi current(), each(), end(), next() et reset(). extract (PHP 3>= 3.0.7, PHP 4 >= 4.0b1) Importe les variables dans la table des symboles int extract (array var_array [, int extract_type [, string prefix]]) extract() sert à exporter un tableau vers la table des symboles. Elle prend un tableau associatif var_array, crée les variables dont les noms sont les index de ce tableau, et leur affecte la valeur associée. Pour chaque paire clé/valeur, extract() crée une variable, avec les paramètres extract_type et prefix. 186 Tableaux Note : Depuis la version 4.0.5, extract() retourne le nombre de variables extraites. extract() vérifie l’existence de la variable avant de la créer. Le traitement des collisions est déterminé par extract_type. Ce paramètre peut prendre une des valeurs suivantes : EXTR_OVERWRITE Lors d’une collision, réécrire la variable existante. EXTR_SKIP Lors d’une collision, ne pas réécrire la variable existante. EXTR_PREFIX_SAME Lors d’une collision, ajouter le préfixe prefix, et créer une nouvelle variable. EXTR_PREFIX_ALL Ajouter le préfixe prefix, et créer une nouvelle variable. EXTR_PREFIX_INVALID Préfixer uniquement les variables aux noms invalides ou numériques avec le préfixe prefix. Ceci a été ajouté en PHP 4.0.5. Si extract_type est omis, extract() utilise EXTR_OVERWRITE par défaut. Notez que prefix n’est nécessaire que pour les valeurs de extract_type suivantes : EXTR_PREFIX_SAME, EXTR_PREFIX_ALL ou EXTR_PREFIX_INVALID. Le résultat préfixé n’est pas un nom de variable valide, il ne sera pas importé dans la table des symboles. extract() retourne le nombre de variables réellement importées dans la table des symboles. Une utilisation possible de la fonction extract() est l’exportation vers la table des symboles de tableaux de variables retournés par wddx_deserialize(). Exemple 1. Exemple avec extract() <?php /* Supposons que $var_array est un tableau retourné par wddx_deserialize() */ $taille = "grand"; $var_array = array("couleur" => "bleu", "taille" => "moyen", "forme" => "sphere"); extract($var_array, EXTR_PREFIX_SAME, "wddx"); print "$couleur, $taille, $forme, $wddx_taille\n"; ?> L’exemple ci-dessus va afficher bleu, large, sphere, moyen La variable $taille n’a pas été réécrite, car on avait spécifié le paramètre EXTR_PREFIX_SAME, qui a permis la création $wddx_size. Si EXTR_SKIP avait été utilisé, alors $wddx_size n’aurait pas été créé. Avec EXTR_OVERWRITE, $taille aurait pris la valeur "moyen", et avec EXTR_PREFIX_ALL, les variables créées seraient $wddx_couleur, $wddx_taille, et $wddx_forme. in_array (PHP 4 >= 4.0b1) Indique si une valeur appartient à un tableau boolean in_array (mixed needle, array haystack [, boolean strict]) 187 Tableaux in_array() recherche needle dans haystack et retourne TRUE s’il s’y trouve, ou FALSE sinon. Le troisième paramètre strict est optionnel. S’il vaut TRUE alors in_array() vérifiera aussi que le types du paramètre needle correspond à la valeur trouvée dans haystack. Exemple 1. Exemple avec in_array() <?php $os = array("Mac", "NT", "Irix", "Linux"); if (in_array("Irix", $os)) print "Irix trouve"; ?> Exemple 2. in_array() avec le paramètre strict <?php $a = array(’1.10’, 12.4, 1.13); if (in_array(’12.4’, $a, TRUE)) echo "’12.4’ trouvé avec une recherche stricte\n"; if (in_array(1.13, $a, TRUE)) echo "1.13 trouvé avec une recherche stricte\n"; ?> L’affichage sera : 1.13 trouvé avec une recherche stricte Note : in_array() a été ajoutée en PHP 4.0. Voir aussi array_search(). array_search (PHP 4 >= 4.0.5) Recherche dans un tableau la clé associée à une valeur mixed array_search (mixed needle, array haystack, boolean strict) array_search() recherche needle dans haystack et retourne la clé associée s’il la trouve, ou FALSE sinon. Si le troisième paramètre strict vaut TRUE, alors array_search() s’assurera aussi que le type de needle est le même que celui de la valeur trouvée dans haystack. Voir aussi in_array(). key (PHP 3, PHP 4 >= 4.0b1) Retourne une clé d’un tableau associatif mixed key (array array) key() retourne l’index de la clé courante dans un tableau. 188 Tableaux Voir aussi current() et next() krsort (PHP 3>= 3.0.13, PHP 4 >= 4.0b4) Trie un tableau en sens inverse et suivant les clés int krsort (array array) krsort() trie un tableau en ordre inverse et suivant les clés, en maintenant la correspondance entre les clés et les valeurs. Cette fonction est pratique pour les tableaux associatifs. Exemple 1. Exemple avec krsort() <?php $fruits = array("d"=>"papaye","a"=>"orange","b"=>"banane","c"=>"ananas"); ksort($fruits); for(reset($fruits); $key = key($fruits); next($fruits)) { echo "fruits[$key] = ".$fruits[$key]."\n"; } ?> Cet exemple va afficher : fruits[d] = citron fruits[c] = ananas fruits[b] = banane fruits[a] = orange Voir aussi array-multisort(), arsort(), asort(), ksort(), natsort(), natcasesort(), rsort(), sort(), uasort(), uksort() et usort(). ksort (PHP 3, PHP 4 >= 4.0b1) Trie un tableau suivant les clés int ksort (array array) ksort() trie un tableau suivant les clés, en maintenant la correspondance entre les clés et les valeurs. Cette fonction est pratique pour les tableaux associatifs. Exemple 1. Exemple avec ksort() <?php $fruits = array("d"=>"papaye","a"=>"orange","b"=>"banane","c"=>"ananas"); ksort($fruits); reset($fruits); while (list ($key, $val) = each ($fruits)) { echo "$key => $val\n"; } ?> Cet exemple va afficher : fruits[a] = orange fruits[b] = banane fruits[c] = ananas fruits[d] = citron Vous pouvez modifier le comportement du tri avec les options sort_flags. Pour plus de détails, voyez sort(). Voir aussi array-multisort(), arsort(), asort(), krsort(), natsort(), natcasesort(), rsort(), sort(), uasort(), uksort() et usort(). Note : Le second paramètre a été ajouté en PHP 4.0. 189 Tableaux list (unknown) Transforme une liste de variables en tableau void list (void) Tout comme array(), list() n’est pas une véritable fonction, mais une construction syntaxique, qui permet d’assigner une série de variables en une seule ligne. Exemple 1. Exemple avec list() <?php <table> <tr> <th>Nom de l’employé</th> <th>Salaire</th> </tr> <?php $result = mysql_query($conn, "SELECT id, name, salary FROM employees"); while (list($id, $name, $salary) = mysql_fetch_row ($result)) { print (" <tr>\n". " <td><a href=\"info.php3?id=$id\">$name</a></td>\n". " <td>$salaire</td>\n". " </tr>\n"); } ?> </table> ?> Voir aussi each() et array(). natsort (PHP 4 >= 4.0RC2) Tri d’un tableau avec l’algorithme à "ordre naturel" void natsort (array array) natsort() implémente un algorithme de tri qui traite les chaînes alpha-numériques comme un être humain : c’est ce qui est appelé l’"ordre naturel". Un exemple de la différence de traitement entre un tel algorithme et un algorithme de tri de chaînes (comme lorsqu’on utilise sort()) est illustré ci-dessous : Exemple 1. Exemple avec natsort() <?php $array1 = $array2 = array ("img12.png","img10.png","img2.png","img1.png"); sort($array1); echo "Tri Standard\n"; print_r($array1); natsort($array2); echo "\nTri par Ordre Naturel\n"; print_r($array2); ?> L’exemple ci-dessous génère l’affichage suivant : Tri Standard 190 Tableaux Array ( [0] [1] [2] [3] ) Tri par Array ( [3] [2] [1] [0] ) ?> => => => => img1.png img10.png img12.png img2.png Ordre Naturel => => => => img1.png img2.png img10.png img12.png Pour plus de détails, rendez-vous sur le site de Martin Pool Natural Order String Comparison (http://www.linuxcare.com.au/projects/natsort/). Voir aussi array-multisort(), arsort(), asort(), krsort(), ksort(), natsort(), natcasesort(), rsort(), sort(), uasort(), uksort(), usort(), strnatcmp() et strnatcasecmp(). natcasesort (PHP 4 >= 4.0RC2) Tri d’un tableau avec l’algorithme à "ordre naturel" insensible à la casse void natcasesort (array array) natcasesort() implémente un algorithme de tri qui traite les chaînes alpha-numériques comme un être humain : c’est ce qui est appelé l’"ordre naturel". natcasesort() est la version insensible à la casse de natsort(). Voir aussi natsort() pour un exemple illustré. Pour plus de détails, rendez-vous sur le site de : Martin Pool’s Natural Order String Comparison (http://www.linuxcare.com.au/projects/natsort/). Voir aussi array-multisort(), arsort(), asort(), krsort(), ksort(), natsort(), rsort(), sort(), uasort(), uksort(), usort(), strnatcmp() et strnatcasecmp(). next (PHP 3, PHP 4 >= 4.0b1) Avance le pointeur interne d’un tableau mixed next (array array) next() retourne l’élément suivant du tableau, ou FALSE s’il n’y a plus d’éléments. Le pointeur de interne de tableau est avancé d’un élément. next() se comporte comme current(), mais avec une différence : il avance le pointeur interne de tableau d’un élément avant de retourner la valeur qu’il pointe. Lorsque le pointeur dépasse le dernier élément, next() retourne FALSE. Avertissement Si le tableau contient des éléments vides ou des zéros, next() retournera FALSE pour ces éléments. Pour passer proprement en revue un tableau, il faut utiliser each(). Voir aussi current(), end(), prev() et reset(). 191 Tableaux pos (PHP 3, PHP 4 >= 4.0b1) Retourne l’élément courant d’un tableau mixed pos (array array) pos() est une fonction alias de current(). Voir aussi end(), next(), prev() et reset(). prev (PHP 3, PHP 4 >= 4.0b1) Recule le pointeur courant de tableau mixed prev (array array) prev() repositionne le pointeur interne de tableau à la dernière place qu’il occupait, ou bien retourne FALSE s’il ne reste plus d’éléments. Avertissement Si le tableau contient des éléments vides, prev() retournera FALSE pour ces éléments aussi. Pour passer en revue tous les éléments, utilisez plutôt each(). prev() se comporte exactement comme next(), mais il fait reculer le pointeur plutôt que de l’avancer. Voir aussi current(), end() next() et reset(). range (PHP 3>= 3.0.8, PHP 4 >= 4.0b4) Crée un tableau contenant un intervalle d’éléments array range (int low, int high) range() retourne un tableau contenant tous les entiers depuis low jusqu’à high, inclus. Voir aussi shuffle() (pour un exemple d’utilisation). reset (PHP 3, PHP 4 >= 4.0b1) Remet le pointeur interne de tableau au début mixed reset (array array) reset() replace le pointeur de tableau array au premier élément. reset() retourne la valeur du premier élément. Voir aussi current(), each(), next(), prev() et reset(). 192 Tableaux rsort (PHP 3, PHP 4 >= 4.0b1) Trie en ordre inverse void rsort (array array) rsort() effectue un tri en ordre décroissant (du plus grand au plus petit). Exemple 1. Exemple avec rsort() <?php $fruits = array("papaye","orange","banane","ananas"); rsort($fruits); for (reset($fruits); list($key,$value) = each($fruits); ) { echo "fruits[$key] = ", $value, "\n"; } ?> Cet exemple va afficher: fruits[0] = papaye fruits[1] = orange fruits[2] = banane fruits[3] = ananas Les fruits ont été classés dans l’ordre alphabétique inverse. Voir aussi array-multisort(), arsort(), asort(), krsort(), ksort(), natsort(), natcasesort(), sort(), uasort(), uksort() et usort(). shuffle (PHP 3>= 3.0.8, PHP 4 >= 4.0b4) Mélange les éléments d’un tableau void shuffle (array array) shuffle() mélange les éléments d’un tableau. Exemple 1. Exemple avec shuffle() <?php $numbers = range (1,20); srand (time()); shuffle ($numbers); while (list(, $number) = each ($numbers)) { echo "$number "; } ?> Voir aussi array-multisort(), arsort(), asort(), krsort(), ksort(), natsort(), natcasesort(), rsort(), sort(), uasort(), uksort() et usort(). sizeof (PHP 3, PHP 4 >= 4.0b1) Retourne le nombre d’élément d’un tableau int sizeof (array array) sizeof() retourne le nombre d’élément d’un tableau. Voir aussi count(). 193 Tableaux sort (PHP 3, PHP 4 >= 4.0b1) Trie le tableau void sort (array array) sort() trie le tableau array. Les éléments seront triés du plus petit au plus grand. Exemple 1. Exemple avec sort() <?php $fruits = array("papaye","orange","banane","ananas"); sort($fruits); for(reset($fruits); $key = key($fruits); next($fruits)) { echo "fruits[$key] = ".$fruits[$key]."\n"; } ?> Cet exemple va afficher : fruits[0] = ananas fruits[1] = banane fruits[2] = orange fruits[3] = papaye Les fruits ont été classés dans l’ordre alphabétique. Voir aussi array-multisort(), arsort(), asort(), krsort(), ksort(), natsort(), natcasesort(), rsort(), uasort(), uksort() et usort(). uasort (PHP 3>= 3.0.4, PHP 4 >= 4.0b1) Trie d’un tableau en utilisant une fonction de comparaison définie par l’utilisateur. void uasort (array array, function cmp_function) uasort() trie un tableau en conservant la correspondance entre les index et leurs valeurs. uasort() sert essentiellement lors de tri de tableaux associatifs où l’ordre des éléments est significatif. La fonction de comparaison utilisée est définie par l’utilisateur. uksort (PHP 3>= 3.0.4, PHP 4 >= 4.0b1) Trie un tableau par ses clés en utilisant une fonction de comparaison définie par l’utilisateur void uksort (array array, function cmp_function) uksort() trie les clés du tableau en utilisant une fonction définie par l’utilisateur. Si un tableau doit être trié avec un critère complexe, il est préférable d’utiliser uksort(). Exemple 1. Exemple avec uksort() <?php function mycompare($a, $b) { if ($a == $b) return 0; return ($a > $b) ? -1 : 1; } $a = array(4 => "quatre", 3 => "trois", 20 => "vingt", 10 => "dix"); uksort($a, mycompare); while(list($key, $value) = each($a)) { echo "$key: $value\n"; } ?> 194 Tableaux Cet exemple affichera: 20: vingt 10: dix 4: quatre 3: trois Voir aussi array-multisort(), arsort(), asort(), krsort(), ksort(), natsort(), natcasesort(), rsort(), sort(), uasort() et usort(). usort (PHP 3>= 3.0.3, PHP 4 >= 4.0b1) Trie un tableau en utilisant une fonction de comparaison définie par l’utilisateur void usort (array array, function cmp_function) usort() va trier un tableau avec ses valeurs, en utilisant une fonction définie par l’utilisateur. Si un tableau doit être trié avec un critère complexe, il est préférable d’utiliser cette méthode. La fonction de comparaison cmp_function doit retourner un entier, qui sera inférieur, égal ou supérieur à zéro suivant que le premier argument est considéré comme plus petit, égal ou plus grand que le second argument. Si les deux arguments sont égaux, leur ordre est indéfini. Exemple 1. Exemple avec usort() <?php function cmp($a,$b) { if ($a == $b) return 0; return ($a < $b) ? -1 : 1; } $tableau = array(3,2,5,6,1); usort($a, "cmp"); while(list($cle,$valeur) = each($tableau)) { echo "$cle: $valeur\n"; } ?> Cet exemple va afficher : 0: 6 1: 5 2: 3 3: 2 4: 1 Note : Evidemment dans ce cas trivial, rsort() serait plus approprié. Avertissement Les bibliothèques de tri rapides sur lesquelles reposent PHP peuvent le conduire à un plantage, si la fonction de comparaison ne retourne pas une valeur cohérente. Voir aussi array-multisort(), arsort(), asort(), krsort(), ksort(), natsort(), natcasesort(), rsort(), sort(), uasort() et uksort(). 195 III. Aspell Les fonctions Aspell vous permettent de vérifier l’orthographe d’un mot, et d’offrir des suggestions de corrections. Plusieurs langues sont disponibles, comme le franç, l’allemand, le suédois et le danois. Note : aspell fonctionne avec de très vielles versions (jusqu’à la version .27.* ou presque) de la librairie aspell. Ce module, et ces versions d’Aspell ne sont plus supportées. Si vous voulez utiliser les possibilités de vérifications d’orthographe en PHP, utilisez plutôt pspell. Ce module utilise la librairie pspell qui fonctionne avec les nouvelles versions de Aspell. Vous avez besoin de la librairie Aspell, disponible à : http://aspell.sourceforge.net/. 196 aspell aspell_new (PHP 3>= 3.0.7, PHP 4 >= 4.0b1) Charge un nouveau dictionnaire resource aspell_new (string master, string personal) aspell_new() ouvre un nouveau dictionaire, et retourne un identifiant de dictionnaire pour utilisation ultérieure dans les fonctions aspell. Exemple 1. Exemple avec aspell_new() <?php $aspell_link=aspell_new("english"); ?> aspell_check (PHP 3>= 3.0.7, PHP 4 >= 4.0b1) Vérifie un mot boolean aspell_check (resource dictionary_link, string word) aspell_check() vérifie l’orthographe d’un mot et retourne TRUE si l’orthographe est correcte, et FALSE sinon. Exemple 1. Exemple avec aspell_check() <?php $aspell_link=aspell_new("english"); if (aspell_check($aspell_link,"testt")) { echo "L’orthographe est correcte."; } else { echo "Désolé, l’orthographe est incorrecte."; } ?> aspell_check_raw (PHP 3>= 3.0.7, PHP 4 >= 4.0b1) Vérifie un mot sans en changer la casse et sans essayer de supprimer les espaces aux extrémités. boolean aspell_check_raw (resource dictionary_link, string word) aspell_check_raw() vérifie l’orthographe d’un mot sans en changer la casse, et sans essayer de supprimer les espaces aux extrémités. Elle retourne TRUE si l’orthographe est bonne, et FALSE sinon. Exemple 1. Exemple avec aspell_check_raw() <?php $aspell_link=aspell_new("french"); if (aspell_check_raw($aspell_link,"testt")) { echo "L’orthographe est OK"; } else { echo "Attention : faute d’orthographe"; 197 aspell } ?> aspell_suggest (PHP 3>= 3.0.7, PHP 4 >= 4.0b1) Suggère l’orthographe d’un mot array aspell_suggest (resource dictionary_link, string word) aspell_suggest() retourne un tableau contenant les orthographes possibles d’un mot mal formé. Exemple 1. Exemple avec aspell_suggest() <?php $aspell_link=aspell_new("french"); if (!aspell_check($aspell_link,"testt")) { $suggestions=aspell_suggest($aspell_link,"testt"); for($i=0; $i < count($suggestions); $i++) { echo "Orthographes envisageables : " . $suggestions[$i] . "<br>"; } } ?> 198 IV. Nombres de grande taille En PHP 4, ces fonctions ne sont disponibles que si l’option de configuration --enable-bcmath a été activée lors de la compilation. En PHP 3, ces fonctions ne sont disponibles que si l’option de configuration --disable-bcmath a été n’ pas été activée lors de la compilation. Note : Suite aux changement de licence, la librairie BCMATH est désormais distribuée séparemment. Vous pouvez télécharger l’archive à http://www.php.net/extra/number4.tar.gz. Lisez attentivement le fichier README.BCMATH de la distribution PHP. 199 BC math bcadd (PHP 3, PHP 4 >= 4.0b1) Additionne deux nombres de grande taille. string bcadd (string left_operand, string right_operand [, int scale]) bcadd() additionne left_operand avec l’opérande right_operand et renvoie la somme sous forme de chaîne de caractères. Le paramètre optionnel scale est utilisé pour définir le nombre de chiffres après la virgule dans le résultat. Voir aussi bcsub(). bccomp (PHP 3, PHP 4 >= 4.0b1) Compare deux nombres de grande taille. int bccomp (string left_operand, string right_operand [, int scale]) bccomp() compare l’opérande left_operand avec l’opérande right_operand et renvoie le résultat sous forme de valeur numérique (entier). Le paramètre optionnel scale est utilisé pour définir le nombre de chiffres après la virgule utilisés lors de la comparaison. Le résultat est 0 si les deux opérandes sont égales. Si l’opérande left_operand est plus grande que l’opérande right_operand, le résultat est 1. Si l’opérande left_operand est plus petite que l’opérande right_operand, le résultat est -1. bcdiv (PHP 3, PHP 4 >= 4.0b1) Divise deux nombres de grande taille. string bcdiv (string left_operand, string right_operand [, int scale]) bcdiv() divise l’opérande left_operand par l’opérande right_operand et renvoie le résultat. Le paramètre optionnel scale définit le nombre de chiffres après la virgule dans le résultat. Voir aussi bcmul(). bcmod (PHP 3, PHP 4 >= 4.0b1) Retourne le reste d’une division entre nombre de grande taille. string bcmod (string left_operand, string modulus) bcmod() retourne le reste de la division entre left_operand en utilisant modulus. Voir aussi bcdiv(). bcmul (PHP 3, PHP 4 >= 4.0b1) Multiplie deux nombres de grande taille. string bcmul (string left_operand, string right_operand [, int scale]) 200 BC math bcmul() multiplie l’opérande left_operand par l’opérande right_operand et renvoie le résultat. Le paramètre optionnel scale définit le nombre de chiffres après la virgule dans le résultat. Voir aussi bcdiv(). bcpow (PHP 3, PHP 4 >= 4.0b1) Elève un nombre à la puissance n-ième. string bcpow (string x, string y [, int scale]) bcpow() élève x à la puissance y. Le paramètre optionnel scale définit le nombre de chiffres après la virgule dans le résultat. Voir aussi bcsqrt(). bcscale (PHP 3, PHP 4 >= 4.0b1) Détermine le nombre de décimales par défaut string bcscale (int scale) bcscale() définit la précision par défaut pour toutes les fonctions mathématiques sur des nombres de taille arbitraire qui suivent et qui omettent le paramètre scale. bcsqrt (PHP 3, PHP 4 >= 4.0b1) Renvoie la racine carrée d’un nombre de grande taille. string bcsqrt (string operand [, int scale]) bcsqrt() renvoie la racine carrée de l’opérande operand. Le paramètre optionnel scale définit le nombre de chiffres après la virgule dans le résultat. Voir aussi bcpow(). bcsub (PHP 3, PHP 4 >= 4.0b1) Soustrait un nombre de grande taille à un autre. string bcsub (string left_operand, string right_operand [, int scale]) bcsub() soustrait l’opérande right_operand à l’opérande left_operand et renvoie le résultat sous forme de chaîne de caractères. Le paramètre optionnel scale définit le nombre de chiffres après la virgule dans le résultat. Voir aussi bcadd(). 201 V. Compression Bzip2 Ce module utilise les fonctions de la librairie bzip2 (http://sources.redhat.com/bzip2/), de Julian Seward pour écrire et lire des fichier bzip2 (.bz2) de manière transparente. Le support bzip2 par PHP n’est pas activé par défaut. Vous devez utiliser l’option de configuration --with-bz2[=DIR] lors de la compilation de PHP pour l’activer. Ce module requiert la librairie bzip2/libbzip2, version >= 1.0.x. Exemple de compression bzip2 Cet exemple ouvre un fichier temporaire, et écrit une ligne de test, puis il en affiche le contenu. Exemple 1. Exemple avec bzip2 <?php $filename = "/tmp/fichier_de_test.bz2"; $str = "Ceci est une chaîne de test.\n"; // ouvre le fichier en écriture $bz = bzopen($filename, "w"); // écrit une chaîne dans le fichier bzwrite($bz, $str); // ferme le fichier bzclose($bz); // ouvre le fichier en lecture $bz = bzopen($filename, "r"); // lit 10 caractères print bzread($bz, 10); // affiche tout le reste du fichier, puis le ferme print bzread($bz); bzclose($bz); ?> 202 Bzip2 bzclose (PHP 4 >= 4.0.4) Ferme un fichier bzip2 int bzclose (resource bz) bzclose() ferme le fichier bzip2 représenté par le pointeur bz. bzclose() retourne TRUE en cas de succès, et FALSE sinon. Le pointeur de fichier bz doit être valide, et avoir été ouvert avec bzopen(). Voir aussi bzopen(). bzcompress (PHP 4 >= 4.0.4) Compresse une chaîne avec bzip2 string bzcompress (string source [, int blocksize [, int workfactor]]) bzcompress() compresse la chaîne source et retourne les données ainsi encodée. Le paramètre optionnel blocksize spécifie la taille de bloc utilisé durant la compression, et doit être un nombre de 1 à 9, sachant que 9 représente la meilleure compression, mais qu’elle utilise plus de ressource pour ce faire. blocksize vaut par défaut 4. Le paramètre optionnel workfactor contrôle le comportement de la compression dans les pires cas de données hautement répétitives. Cette valeur peut aller de 0 à 250 (0 est une valeur spéciale, et 30 la valeur par défaut). En dehors de workfactor, le résultat sera le même. Exemple 1. Exemple avec bzcompress() <?php $str = "données de test"; $bzstr = bzcompress($str, 9); ?> Voir aussi bzdecompress(). bzdecompress (PHP 4 >= 4.0.4) Décompresse une chaîne bzip2 string bzdecompress (string source [, int small]) bzdecompress() décompresse la chaîne source, en supposant qu’elle a été compressée avec bzip2, puis la retourne. Si le paramètre optionnel small vaut TRUE, un autre algorithme de décompression sera utilisé : il consomme moins de mémoire (le maximum demandé tombe autour de 2300 ko), mais fonctionne globalement à la moitié de la vitesse. Reportez-vous à la documentation bzip2 (http://sources.redhat.com/bzip2/) pour plus de détails sur cette fonctionnalité. 203 Bzip2 Exemple 1. Exemple avec bzdecompress() <?php $str = $bzdecompress($bzstr); ?> Voir aussi bzcompress(). bzerrno (PHP 4 >= 4.0.4) Retourne le numéro d’erreur bzip2 int bzerrno (resource bz) bzerrno() retourne le numéro d’erreur du fichier bz2 représenté par le pointeur bz. Voir aussi bzerror() et bzerrstr(). bzerror (PHP 4 >= 4.0.4) Retourne le numéro et le message d’erreur bzip2 dans un tableau array bzerror (int bz) bzerror() retourne le numéro et le message d’erreur du fichier bz2 représenté par le pointeur bz. bzerror() retourne un tableau associatif. Exemple 1. Exemple avec bzerror() <?php $error = bzerror($bz); echo $error["errno"]; echo $error["errstr"]; ?> Voir aussi bzerrno() et bzerrstr(). bzerrstr (PHP 4 >= 4.0.4) Retourne le message d’erreur bzip2 string bzerrstr (resource bz) bzerrstr() retourne le message d’erreur du fichier bz2 représenté par le pointeur bz. Voir aussi bzerrno() et bzerror(). 204 Bzip2 bzflush (PHP 4 >= 4.0.4) Force l’écriture de toutes les données compressées int bzflush (resource bz) bzflush() vide les buffers d’écriture du fichier représenté par bz. bzflush() retourne TRUE en cas de succès, et FALSE sinon. Voir aussi bzread() et bzwrite(). bzopen (PHP 4 >= 4.0.4) Ouvre un fichier compressé avec bzip2 resource bzopen (string filename, string mode) bzopen() ouvre un fichier bzip2 (.bz2) en écriture ou en lecture. filename est le nom du fichier à ouvrir. mode est similaire au même paramètre de la fonction fopen() (‘r’ pour lecture, ‘w’ pour écriture, etc.). Si l’ouverture échoue, bzopen() retourne FALSE, sinon, elle retourne un pointeur de fichier. Exemple 1. Exemple avec bzopen() <?php $bz = bzopen("/tmp/foo.bz2", "r"); ?> Voir aussi bzclose(). bzread (PHP 4 >= 4.0.4) Lecture binaire d’un fichier bzip2 string bzread (resource bz [, int length]) bzread() lit jusqu’à length octets depuis le fichier bzip2, référencé par le pointeur bz. La lecture s’arrête lorsque length octets (non compressés) ont été lus, qu’une erreur est rencontrée, ou bien que la fin du fichier a été atteinte : le premier des trois qui survient. Si le paramètre optionnel length est omis, bzread() lit 1024 octets (non compressés) en même temps. Exemple 1. Exemple avec bzread() <?php $bz = bzopen("/tmp/foo.bz2", "r"); $str = bzread($bz, 2048); echo $str; ?> Voir aussi bzwrite() et bzopen(). 205 Bzip2 bzwrite (PHP 4 >= 4.0.4) Ecriture binaire dans un fichier bzip2 int bzwrite (resource bz, string data [, int length]) bzwrite() écrit le contenu de la chaîne data dans le fichier bzip2 représenté par bz. Si le paramètre optionnel length est fourni, l’écriture sera arrêtée après l’écriture de length octets (non compressés), ou la fin de la chaîne (le premier qui survient). Exemple 1. Exemple bzwrite() <?php $str = "données non compressées"; $bz = bzopen("/tmp/foo.bz2", "w"); bzwrite($bz, $str, strlen($str)); ?> Voir aussi bzread() et bzopen(). 206 VI. Calendrier Les fonctions de calendrier ne sont disponibles que si l’extension calendrier a été compilée. Elle est située dans les sous-dossiers "dl" ou "ext" de votre distribution de PHP. Lisez le fichier README pour plus de détails. L’extension de calendrier propose une série de fonctions qui simplifie les conversions entre les différents formats de calendrier. La référence est le nombre de jour du calendrier Julien. C’est le nombre de jours depuis une date qui commence bien au delà des dates les plus reculées dont on a besoin (située en 4000 avant J.C.). Pour convertir une date d’un calendrier à un autre, il faut d’abord la convertir dans ce calendrier, puis convertir le résultat dans le calendrier désiré. Attention, le nombre de jour du calendrier Julien est un système très différent du calendrier Julien!. Pour plus d’informations (en anglais), reportez vous à http://genealogy.org/~scottlee/cal-overview.html. Les traductions issues de ces pages seront mises entre guillemets. 207 Calendrier JDToGregorian (PHP 3, PHP 4 >= 4.0b1) Convertit le nombre de jours du calendrier Julien en date grégorienne. string jdtogregorian (int julianday) jdtogregorian() convertit le nombre de jours du calendrier Julien en une chaîne contenant une date du calendrier grégorien, au format "mois/jour/année". GregorianToJD (PHP 3, PHP 4 >= 4.0b1) Convertit une date grégorienne en nombre de jours du calendrier julien. int gregoriantojd (int month, int day, int year) Intervalle de validité pour le calendrier grégorien : 4714 avant JC à 9999 après JC.A.D. Bien qu’il soit possible de manipuler des dates jusqu’en 4714 avant JC, une telle utilisation n’est pas significative. En effet, ce calendrier fut créé le 18 octobre 1582 après J.C. (ou 5 octobre 1582 en calendrier grec). Certains pays ne l’acceptèrent que bien plus tard. Par exemple, les britanniques n’y passèrent en 1752, les Russes en 1918 et les Grecs en 1923. La plus part des pays européens utilisaient le calendrier Julien avant le Grégorien. Exemple 1. Fonctions calendrier <?php $jd = gregoriantojd(10,11,1970); echo("$jd\n"); $gregorian = jdtogregorian($jd); echo("$gregorian\n"); ?> JDToJulian (PHP 3, PHP 4 >= 4.0b1) Convertit le nombre de jours du calendrier Julien en date du calendrier Julien. string jdtojulian (int julianday) jdtojulian() convertit le nombre de jours du calendrier Julien en une chaîne contenant la date du calendrier Julien, au format "mois/jour/année". JulianToJD (PHP 3, PHP 4 >= 4.0b1) Convertit le nombre de jour du calendrier Julien en date du calendrier Julien. int juliantojd (int month, int day, int year) Intervalle de validité du calendrier Julien : 4713 avant JC à 9999 après J.C.. Bien qu’il soit possible de manipuler des dates jusqu’en 4713 avant JC, une telle utilisation n’est pas significative. En effet, ce calendrier fut créé en 46 avant JC, et ses détails ne furent finalisés qu’au plus tôt en 8 après JC, et probablement pas avant le 4ème siècle après JC. De plus, le début de l’année variait suivant les peuples, certains n’acceptant pas janvier comme premier mois de l’année. 208 Calendrier JDToJewish (PHP 3, PHP 4 >= 4.0b1) Convertit le nombre de jours du calendrier julien en date du calendrier juif. string jdtojewish (int julianday) jdtojewish() convertit le nombre de jours du calendrier julien en date du calendrier juif. JewishToJD (PHP 3, PHP 4 >= 4.0b1) Convertit une date du calendrier juif en nombre de jours du calendrier julien. int jewishtojd (int month, int day, int year) Bien qu’il soit possible de manipuler des dates à partir de l’an 1 (3761 avant JC), une telle utilisation a peu de sens. Le calendrier juif a été utilisé depuis plusieurs dizaines de siècles, mais dans les premiers temps, il n’y avait pas de formule pour déterminer le début du mois. Un nouveau mois commencait quand une nouvelle lune était observée. JDToFrench (PHP 3, PHP 4 >= 4.0b1) Convertit le nombre de jours du calendrier julien en date du calendrier français républicain string jdtofrench (int juliandaycount) jdtofrench() convertit le nombre de jours du calendrier julien en date du calendrier français républicain. FrenchToJD (PHP 3, PHP 4 >= 4.0b1) Convertit une date du calendrier français républicain en nombre de jours du calendrier julien. int frenchtojd (int month, int day, int year) frenchtojd() convertit une date du calendrier français républicain en nombre de jour du calendrier julien. Ces fonctions convertissent les dates comprises entre l’an 1 et l’an 14 (22 September 1792 à 22 September 1806 en calendrier grégorien). Cela couvre plus que la durée d’existence de ce calendrier. JDMonthName (PHP 3, PHP 4 >= 4.0b1) Retourne le nom du mois. string jdmonthname (int julianday, int mode) jdmonthname() retourne une chaîne contenant le nom du mois. mode indique de quel calendrier dépend ce mois, et quel type de nom doit être retourné. 209 Calendrier Mode Tableau 1. Modes de calendrier Signification Mode Signification 0 Grégorien - abrégé 1 Grégorien 2 Julien - abrégé 3 Julien 4 Juif 5 Républicain français JDDayOfWeek (PHP 3, PHP 4 >= 4.0b1) Retourne le numéro du jour de la semaine. mixed jddayofweek (int julianday, int mode) jddayofweek() retourne le numéro du jour de la semaine. Peut retourner une chaîne ou un entier, en fonction du mode. Tableau 1. Modes Mode Signification 0 Retourne le numéro du jour comme un entier (0=dimanche, 1=lundi, etc.) 1 Retourne une chaîne contenant le nom du jour (anglais grégorien) 2 Retourne une chaîne contenant le nom abrégé du jour de la semaine (anglais grégorien). easter_date (PHP 3>= 3.0.9, PHP 4 >= 4.0RC2) Retourne un timestamp UNIX pour Pàques, à minuit, pour une année donnée. int easter_date (int year) easter_date() retourne un timestamp UNIX pour Pàques, à minuit, pour une année donnée. Si l’année n’est pas précisée, c’est l’année en cours qui est utilisée. ATTENTION: easter_date() génére une alerte (Warning) si la date tombe hors de la zone de validité des timestamp UNIX (i.e. avant 1970 ou après 2037). Exemple 1. Exemples avec easter_date() echo date( "M-d-Y", easter_date(1999) ); echo date( "M-d-Y", easter_date(2000) ); echo date( "M-d-Y", easter_date(2001) ); /* "04 avril 1999" */ /* "23 avril 2000" */ /* "15 avril 2001" */ La date de Pàques a été fixée par le concile de Nicée, en 325 de notre ère, comme étant le dimanche après la première lune pleine qui suit l’équinoxe de printemps. L’équinoxe de printemps est considéré comme étant toujours le 21 mars, ce qui 210 Calendrier réduit le problème au calcul de la date de la lune pleine qui suit, et le dimanche suivant. L’algorithme fut introduit vers 532, par Dionysius Exiguus. Avec le calendrier Julien, (pour les années avant 1753), un cycle de 19 ans suffit pour connaître les date des phases de la lune. Avec le calendrier grégorien, (à partir des années 1753, concu par Clavius et Lilius, puis introduit par le pape Gregoire XIII en Octobre 1582, et en Grande Bretagne et ses colonies en septembre 1752), deux facteurs de corrections ont été ajoutés pour rendre le cycle plus précis. (Ce code est basé sur le programme en C de Simon Kershaw, <[email protected]>) Voir easter_days() pour les calculs de date de Pàques avant 1970 et apres 2037. easter_days (PHP 3>= 3.0.9, PHP 4 >= 4.0RC2) Retourne le nombre de jour entre le 21 Mars et Pàques, pour une année donnée. int easter_days (int year) easter_days() retourne le nombre de jour entre le 21 Mars et Pàques, pour une année donnée. Si l’année n’est pas précisée, l’année en cours est utilisée par défaut. easter_days() peut être utilisée à la place de easter_date() pour calculer la date de Pàques, pour les années qui tombent hors de l’intervalle de validité des timestamps UNIX (i.e. avant 1970 ou après 2037). Exemple 1. Exemple avec easter_days() <?php echo easter_days(1999); echo easter_days(1492); echo easter_days(1913); ?> /* 14, i.e. 4 Avril /* 32, i.e. 22 Avril /* 2, i.e. 23 Mars */ */ */ La date de Pàques a été fixée par le concile de Nicée, en 325 de notre ère, comme étant le dimanche après la première lune pleine qui suit l’équinoxe de printemps. L’équinoxe de printemps est considéré comme étant toujours le 21 mars, ce qui réduit le problème au calcul de la date de la lune pleine qui suit, et le dimanche suivant. L’algorithme fut introduit vers 532, par Dionysius Exiguus. Avec le calendrier Julien, (pour les années avant 1753), un cycle de 19 ans suffit pour connaître les date des phases de la lune. Avec le calendrier grégorien, (à partir des années 1753, concu par Clavius et Lilius, puis introduit par le pape Gregoire XIII en Octobre 1582, et en Grande Bretagne et ses colonies en septembre 1752), deux facteurs de corrections ont été ajoutés pour rendre le cycle plus précis. (Ce code est basé sur le programme en C de Simon Kershaw, <[email protected]>) Voir aussi easter_date(). unixtojd (PHP 4 >= 4.0RC2) Convertit un timestamp UNIX en nombre de jours Julien int unixtojd ([int timestamp]) unixtojd() retourne le nombre de jours juliens du timestamp UNIX timestamp (nombre de secondes depuis le 1/1/1970), ou pour le jour courant si timestamp est omis. Voir aussi jdtounix(). Note : unixtojd() n’est disponible qu’à partir de la version PHP 4.0RC1. 211 Calendrier jdtounix (PHP 4 >= 4.0RC2) Convertit un nombre de jour Julien en timestamp UNIX int jdtounix (int jday) jdtounix() retourne un timestamp UNIX correspondant au nombre de jour julien jday ou FALSE si jday n’est pas dans l’intervalle de validité de l’époque UNIX. (années grégorienne entre 1970 et 2037 ou 2440588 <= jday <= 2465342 ). Voir aussi jdtounix(). Note : jdtounix() n’est disponible qu’à partir de la version PHP 4.0RC1. 212 VII. Paiement CCVS Ces fonctions font l’interface avec les API CCVS, vous permettant de travailler directement avec CCVS depuis vos scripts PHP. CCVS est la solution apportée par RedHat (http://www.redhat.com/) au problème de l’intermediaire, lors du traitement de transactions de cartes de crédit. Il vous permet travailler directment avec les maisons de crédits, via votre boîte *nix et un modem. En utilisant le module CCVS pour PHP, vous pouvez effectuer des transactions avec les cartes de crédits, directement depuis vos scripts PHP via CCVS. La suite vous montrera comment procéder. Pour activer le support CCVS de PHP, commencez par vérifier votre installation CCVS. Vous devez configurer PHP avec l’option --with-ccvs. Si vous utilisez cette option sans spécifier le chemin de votre installation, PHP essaiera de la trouver à sa position par défaut (/usr/local/ccvs). Si CCVS est installé dans un autre dossier, lancez la configuration avec : --with-ccvs=$ccvs_path, où $ccvs_path est le chemin de votre installation CCVS. Notez bien que CCVS requiert que $ccvs_path/lib et $ccvs_path/include existent, et qu’ils contiennent respectivement cv_api.h et libccvs.a sous include et lib. De plus, un démon ccvsd doit être disponible sur votre configuration, et qu’il soit accessible à vos scripts PHP. Assurez vous aussi que l’utilisateur qui exécute les scripts PHP est le même que celui qui a installé CCVS (i.e. si vous avez installé CCVS avec l’utilisateur ’ccvs’, vos scripts PHP doivent tourner aussi en ’ccvs’). Plus de détails sur CCVS sont disponibles à http://www.redhat.com/products/ccvs. Cette documentation est en chantier. Jusqu’à sa finalisation, RedHat entretient une version légèrement démodée mais bien pratique à http://www.redhat.com/products/ccvs/support/CCVS3.3docs/ProgPHP.html. 213 CCVS (unknown) () 214 VIII. Support COM pour Windows Ces fonctions ne sont disponibles que sous les versions Windows de PHP. Elles ont été ajoutées dans PHP 4. 215 COM com_load (PHP 3>= 3.0.3, PHP 4 >= 4.0b1) Crée une référence sur un composant COM resource com_load (string module_name [, string server_name]) com_load() crée une nouvelle référence au composant COM module_name, et retourne une référence dessus. com_load() retourne FALSE en cas d’échec. com_invoke (PHP 3>= 3.0.3, PHP 4 >= 4.0b1) Appelle une méthode d’un composant mixed com_invoke (resource com_object, string function_name, mixed [function parameters, ...]) com_invoke() appelle la méthode function_name du composant COM com_object. com_invoke() retourne FALSE en cas d’erreur, sinon retourne le résultat de la fonction function_name en cas de succès. com_propget (PHP 3>= 3.0.3, PHP 4 >= 4.0b1) Lit la valeur d’un propriété d’un composant COM mixed com_propget (resource com_object, string property) com_propget() est un alias de com_get(). com_get (PHP 3>= 3.0.3, PHP 4 >= 4.0b1) Lit la valeur d’un propriété d’un composant COM mixed com_get (resource com_object, string property) com_get() retourne la valeur de la propriété property du composant COM com_object. com_get() retourne FALSE en cas d’erreur. com_propput (PHP 3>= 3.0.3, PHP 4 >= 4.0b1) Modifie une propriété d’un composant COM void com_propput (resource com_object, string property, mixed value) com_propput() est un alias de com_set(). 216 COM com_propset (PHP 3>= 3.0.3, PHP 4 >= 4.0b1) Modifie une propriété d’un composant COM void com_propset (resource com_object, string property, mixed value) Cette fonction est un alias de com_propput(). com_set (PHP 3>= 3.0.3, PHP 4 >= 4.0b1) Modifie une propriété d’un composant COM void com_set (resource com_object, string property, mixed value) com_set() remplace la valeur de la propriété property du composante COM com_object par value. com_set() retourne TRUE en cas de succès, et FALSE sinon. 217 IX. Objets Introduction About Ces fonctions permettent de gérer les classes et les objets. Vous pouvez notamment connaître le nom de la classe d’un objet, ses membres et ses méthodes, et tous les objets parents (les classes qui sont étendues par la classe d’un objet). Exemple d’utilisation Dans cet exemple, on définit une classe de base, et une extension. La classe de base définit un légume, s’il est mangeable ou pas, et sa couleur. La sous-classe epinard ajoute une méthode pour le cuisiner, et une autre pour savoir s’il est cuisiné. Exemple 1. classes.inc <?php // classe de base, avec ses membres et ses méthodes class Legume { var $mangeable; var $couleur; function legume( $mangeable, $couleur="green" ) { $this->mangeable = $mangeable; $this->couleur = $couleur; } function est_mangeable() { return $this->mangeable; } function quelle_couleur() { return $this->couleur; } } // fin de la classe Legume // extend la classe de base class Epinard extends Legume { var $cuit = FALSE; function Epinard() { $this->Legume( TRUE, "green" ); } function cuisine() { $this->cuit = TRUE; } function est_cuit() { return $this->cuit; } } // fin de la classe Epinard ?> Lorsqu’on instantie deux objets de ces classes, et qu’on affiche leurs informations, on affiche aussi leur héritage. On définit ici des utilitaires qui servent essentiellement à afficher ces informations proprement. Exemple 2. test_script.php <pre> <?php include "classes.inc"; // utilitaires function print_vars($obj) { $arr = get_object_vars($obj); while (list($prop, $val) = each($arr)) 218 Classes et Objets echo "\t$prop = $val\n"; } function print_methods($obj) { $arr = get_class_methods(get_class($obj)); foreach ($arr as $method) echo "\tfunction $method()\n"; } function class_parentage($obj, $class) { global $$obj; if (is_subclass_of($$obj, $class)) { echo "L’objet $obj belongs to class ".get_class($$obj); echo " est une sous-classe de $class\n"; } else { echo "L’objet $obj n’est pas une sous classe $class\n"; } } // instantie 2 objets $legume = new Legume(TRUE,"blue"); $feuilles = new Epinard(); // affiche les informations sur ces objets echo "legume: CLASS ".get_class($legume)."\n"; echo "feuilles: CLASS ".get_class($feuilles); echo ", PARENT ".get_parent_class($feuilles)."\n"; // affiche les propriétés du légume echo "\nlégume: Propriétés \n"; print_vars($legume); // et les méthodes de "feuilles" echo "\nfeuilles: Methods\n"; print_methods($feuilles); echo "\nParentée:\n"; class_parentage("feuilles", "Epinard"); class_parentage("feuilles", "Legume"); ?> </pre> Il est important de noter que dans les exemples ci-dessus, les objets $feuilles sont une instance de Epinard qui est une sous-classe de Legume, donc la dernière partie du script va afficher : [...] Parentée: L’objet feuilles n’est pas une sous classe Spinach L’objet feuilles est une sous-classe de Legume 219 Classes et Objets call_user_method (PHP 3>= 3.0.3, PHP 4 >= 4.0b1) Appelle une méthode utilisateur d’un objet mixed call_user_method (string method_name, object obj [, mixed parameter [, mixed ...]]) Appelle la méthode method_name depuis l’objet obj. Un exemple d’utilisation de cet objet est présenté ci-dessous, où une classe est définie, puis instantiée. On utilise alors call_user_method() pour appeler indirectement les méthodes print_info. <?php class Pays { var $NOM; var $TLD; function Pays($nom, $tld) { $this->NOM = $nom; $this->TLD = $tld; } function print_info($prestr="") { echo $prestr."Pays: ".$this->NOM."\n"; echo $prestr."Nom de domaine: ".$this->TLD."\n"; } } $unPays = new Pays("Pérou","pe"); echo "* Appel de la méthode directement\n"; $unPays->print_info(); echo "\n* Appel de la méthode indirectement\n"; call_user_method ("print_info", $unPays, "\t"); ?> Voir aussi call_user_func_array(). call_user_func() et call_user_method_array(). call_user_method_array (PHP 4 >= 4.0.5) Appelle une méthode utilisateur avec un tableau de paramètres mixed call_user_method_array (string method_name, object obj [, array paramarr]) call_user_method_array() appelle la méthode method_name de l’object obj, en utilisant les paramètres paramarr, rassemblés sous forme de tableau. Voir aussi call_user_func_array(), call_user_func() et call_user_method(). Note : call_user_method_array() a été ajoutée en version PHP 4.05. class_exists (PHP 4 >= 4.0b4) Vérifie qu’une classe a été définie boolean class_exists (string class_name) class_exists() retourne TRUE si la classe class_name a été définie, et FALSE sinon. 220 Classes et Objets get_class (PHP 4 ) Retourne la classe d’un objet string get_class (object obj) get_class() retourne la classe de l’objet obj. Voir aussi get_parent_class() et is_subclass_of() get_class_methods (PHP 4 >= 4.0RC1) Retourne les noms des méthodes d’une classe. array get_class_methods (string class_name) get_class_methods() retourne un tableau contenant les noms des méthodes de la classe class_name. Note : A partir de PHP 4.0.6, vous pouvez spécifier l’objet lui-même, au lieu de sa classe class_name. Par exemple : <?php $class_methods = get_class_methods($my_class); ?> Exemple 1. Exemple avec get_class_methods() <?php class myclass { // constructeur function maclasse() { return(TRUE); } // méthode 1 function myfunc1() { return(TRUE); } // méthode 2 function mafunc2() { return(TRUE); } } $ma_classe = new maclasse(); $class_methods = get_class_methods(get_class($ma_class)); foreach ($class_methods as $method_name) { echo "$method_name\n"; } ?> Va afficher : maclass mafunc1 mafunc2 221 Classes et Objets Voir aussi get_class_vars() et get_object_vars() get_class_vars (PHP 4 >= 4.0RC1) Retourne les valeurs par défaut des attributs d’une classe. array get_class_vars (string class_name) get_class_vars() retourne un tableau contenant les valeurs par défaut des attributs de la classe class_name. Note : Les variables de classe qui ne sont pas encore initialisées ne seront pas retournées par get_class_vars(). Exemple 1. Exemple get_class_vars() <?php class maclasse { var $var1; // Pas de valeur par défaut var $var2 = "xyz"; var $var3 = 100; // constructeur function maclasse() { return(TRUE); } } $ma_classe = new maclasse(); $class_vars = get_class_vars(get_class($ma_classe)); foreach ($class_vars as $name => $value) { echo "$name : $value\n"; } ?> va afficher : var2 : xyz var3 : 100 get_declared_classes (PHP 4 >= 4.0RC2) Liste toutes les classes définies array get_declared_classes (void) get_declared_classes() retourne un tableau contenant la liste des fonctions déclarées dans le script courant. Note : En PHP 4.0.1pl2, trois classes supplémentaires sont retournées, au début de ce tableau : stdClass (définie dans Zend/zend.c), OverloadedTestClass (définie dans ext/standard/basic_functions.c) et Directory (définie dans ext/standard/dir.c). 222 Classes et Objets get_object_vars (PHP 4 >= 4.0RC1) Retourne un tableau associatif des propriétés d’un objet array get_object_vars (object obj) get_object_vars() retourne un tableau associatif contenant les propriétés de l’objet obj. Les clés du tableau sont les noms des propriétés de l’objet.Si des variables déclarées dans la classe de l’objet obj, n’ont pas été assignées, elles ne seront pas retournées dans le tableau. Exemple 1. Exemple avec get_object_vars() <?php class Point2D { var $x, $y; var $nom; function Point2D($x, $y) { $this->x = $x; $this->y = $y; } function donne_nom($nom) { $this->nom = $nom; } function LitPoint() { return array("x" -> $this->x, "y" -> $this->y, "nom" -> $this->nom); } } $p1 = new Point2D(1.233, 3.445); print_r(get_object_vars($p1)); // "$nom" est déclaré, mais non défini // Array // ( // [x] -> 1.233 // [y] -> 3.445 // ) $p1->setnom("point #1"); print_r(get_object_vars($p1)); // Array // ( // [x] -> 1.233 // [y] -> 3.445 // [nom] -> point #1 // ) ?> Voir aussi get_class_methods() et get_class_vars() get_parent_class (PHP 4 ) Retourne le nom de la classe d’un objet string get_parent_class (object obj) get_parent_class() retourne le nom de la classe de l’objet obj. Voir aussi get_class() et is_subclass_of() 223 Classes et Objets is_subclass_of (PHP 4 >= 4.0b4) Détermine si un objet est une sous-classe boolean is_subclass_of (object obj, string superclass) is_subclass_of() retourne TRUE si l’objet obj est une sous-classe de superclass, FALSE sinon. Voir aussi get_class() et get_parent_class() method_exists (PHP 4 ) Vérifie que la méthode existe pour une classe. boolean method_exists (object object, string method_name) method_exists() retourne TRUE si la méthode method_name a été définie pour la classe object, et sinon, retourne FALSE. 224 X. ClibPDF ClibPDF vous permet de créer des documents PDF avec PHP. Cette librairie est disponible à FastIO (http://www.fastio.com/) mais n’est pas gratuite. Vous devez lire la licence avant de l’utiliser. Si vous ne pouvez pas accepter la licence, essayez plutôt pdflib de Thomas Merz, qui est aussi très puissante. Les fonctionnalités de ClibPDF et ses API sont très similaires à celles de Thomas Merz’s pdflib mais, selon FastIO, ClibPDF est plus rapide, et crée des documents plus compacts. Cela peut avoir changé depuis la version 2.0 de pdflib. Un test de vitesse (avec pdfclock.c issue des exemples de pdflib 2.0 transformé en script PHP) ne montre aucune différence de vitesse. La taille des fichiers est similaire si la compression n’est pas utilisée. Il vaut mieux alors essayer les deux, et choisir celui qui vous convient le mieux. Cette documentation devrait être lue avec le manuel ClibPDF sous la main, car il est beaucoup plus détaillé. Beaucoup de fonctions sont natives de ClibPDF et se retrouvent dans le module PHP, et tout comme pdflib, elles ont le même nom. Toutes les fonctions, hormis cpdf_open() utilisent un pointeur sur un document comme premier paramètre. Actuellement, ce pointeur n’est pas utilisé en interne, car ClibPDF ne supporte pas la création de plusieurs documents PDF simultanément. En fait, il ne vaut mieux pas l’envisager, car les résultats sont aléatoires. Je ne veux même pas imaginer les problèmes qui pourrait se poser avec les environnements multi-tâches. Selon l’auteur de ClibPDF, cette situation va changer dans les prochaînes versions (lorsque cette documentation a été traduite, c’était la version 1.10). Si vous avez besoin de cette fonctionnalité, utilisez pdflib. Note : La fonction cpdf_set_font() a changé depuis le PHP 3.0 pour supporter les polices asiatiques. Le paramètre d’encodage n’est plus un entier, mais une chaîne. Un des gros avantage de ClibPDF sur pdflib est la possibilité de créer complétement un document sans passer par des fichiers temporaires. Il est aussi possible d’utiliser des coordonnées avec une unité de longeur prédéfinie. C’est une fonctionnalité bien pratique mais qui peut être simulée avec pdf_translate(). Un autre atout de ClibPDF est que chaque page peut être modifiée à tout moment même si une nouvelle page a été ouverte. La fonction cpdf_set_current_page() vous permet de quitter temporairement une page, et d’en modifier une autre. La plus part des fonctions sont très simples d’emploi. Le plus difficile est probablement de créer un document PDF simple. L’exemple suivant devrait vous aider à démarrer. La page contient du texte qui utilise la police "Times-Roman" en taille 30, outlined. Le texte est souligné. Exemple 1. Exemple simple ClibPDF <?php $cpdf = cpdf_open(0); cpdf_page_init($cpdf, 1, 0, 595, 842); cpdf_add_outline($cpdf, 0, 0, 0, 1, "Page 1"); cpdf_set_font($cpdf, "Times-Roman", 30, "WinAnsiEncoding"); cpdf_set_text_rendering($cpdf, 1); cpdf_text($cpdf, "Times Roman outlined", 50, 750); cpdf_moveto($cpdf, 50, 740); cpdf_lineto($cpdf, 330, 740); cpdf_stroke($cpdf); cpdf_finalize($cpdf); Header("Content-type: application/pdf"); cpdf_output_buffer($cpdf); cpdf_close($cpdf); ?> La distribution pdflib contient un exemple plus complet, qui crée des séries de pages avec une horloge. Voici cet exemple convertit en script PHP qui utilise l’extension ClibPDF : Exemple 2. Exemple pdfclock de la distribution pdflib 2.0 <?php $radius = 200; $margin = 20; $pagecount = 40; $pdf = cpdf_open(0); 225 ClibPDF cpdf_set_creator($pdf, "pdf_clock.php3"); cpdf_set_title($pdf, "Analog Clock"); while($pagecount-- > 0) { cpdf_page_init($pdf, $pagecount+1, 0, 2 * ($radius + $margin), 2 * ($radius + $margin), 1.0); cpdf_set_page_animation($pdf, 4, 0.5, 0, 0, 0); /* wipe */ cpdf_translate($pdf, $radius + $margin, $radius + $margin); cpdf_save($pdf); cpdf_setrgbcolor($pdf, 0.0, 0.0, 1.0); /* indications des minutes */ cpdf_setlinewidth($pdf, 2.0); for ($alpha = 0; $alpha < 360; $alpha += 6) { cpdf_rotate($pdf, 6.0); cpdf_moveto($pdf, $radius, 0.0); cpdf_lineto($pdf, $radius-$margin/3, 0.0); cpdf_stroke($pdf); } cpdf_restore($pdf); cpdf_save($pdf); /* Indications des 5 minutes */ cpdf_setlinewidth($pdf, 3.0); for ($alpha = 0; $alpha < 360; $alpha += 30) { cpdf_rotate($pdf, 30.0); cpdf_moveto($pdf, $radius, 0.0); cpdf_lineto($pdf, $radius-$margin, 0.0); cpdf_stroke($pdf); } $ltime = getdate(); /* aiguille des heures */ cpdf_save($pdf); cpdf_rotate($pdf, -(($ltime[’minutes’]/60.0) + $ltime[’hours’] - 3.0) * 30.0); cpdf_moveto($pdf, -$radius/10, -$radius/20); cpdf_lineto($pdf, $radius/2, 0.0); cpdf_lineto($pdf, -$radius/10, $radius/20); cpdf_closepath($pdf); cpdf_fill($pdf); cpdf_restore($pdf); /* aiguille des minutes */ cpdf_save($pdf); cpdf_rotate($pdf, -(($ltime[’seconds’]/60.0) + $ltime[’minutes’] - 15.0) * 6.0); cpdf_moveto($pdf, -$radius/10, -$radius/20); cpdf_lineto($pdf, $radius * 0.8, 0.0); cpdf_lineto($pdf, -$radius/10, $radius/20); cpdf_closepath($pdf); cpdf_fill($pdf); cpdf_restore($pdf); /* aiguille des secondes */ cpdf_setrgbcolor($pdf, 1.0, 0.0, 0.0); cpdf_setlinewidth($pdf, 2); cpdf_save($pdf); cpdf_rotate($pdf, -(($ltime[’seconds’] - 15.0) * 6.0)); cpdf_moveto($pdf, -$radius/5, 0.0); cpdf_lineto($pdf, $radius, 0.0); cpdf_stroke($pdf); cpdf_restore($pdf); /* Un petit cercle au centre */ cpdf_circle($pdf, 0, 0, $radius/30); cpdf_fill($pdf); cpdf_restore($pdf); cpdf_finalize_page($pdf, $pagecount+1); } cpdf_finalize($pdf); header("Content-type: application/pdf"); cpdf_output_buffer($pdf); 226 ClibPDF cpdf_close($pdf); ?> 227 ClibPDF cpdf_global_set_document_limits (PHP 4 >= 4.0b4) Fixe les limites d’un document PDF. void cpdf_global_set_document_limits maxannotations, int maxobjects) (int maxpages, int maxfonts, int maximages, int cpdf_global_set_document_limits() permet de fixer plusieurs limites au document PDF. cpdf_global_set_document_limits() doit être appelé avant cpdf_open() pour être effective. Elle fixe les limites de tous les documents ouverts après. Voir aussi cpdf_open(). cpdf_set_creator (PHP 3>= 3.0.8, PHP 4 >= 4.0b4) Fixe le créateur d’un document PDF. void cpdf_set_creator (string creator) cpdf_set_creator() fixe le créateur d’un document PDF. Voir aussi cpdf_set_subject(), cpdf_set_title() et cpdf_set_keywords(). cpdf_set_title (PHP 3>= 3.0.8, PHP 4 >= 4.0b4) Fixe le titre d’un document PDF. void cpdf_set_title (string title) cpdf_set_title() fixe le titre d’un document PDF. Voir aussi cpdf_set_subject(), cpdf_set_creator() et cpdf_set_keywords(). cpdf_set_subject (PHP 3>= 3.0.8, PHP 4 >= 4.0b4) Fixe le sujet d’un document PDF. void cpdf_set_subject (string subject) cpdf_set_subject() fixe le sujet d’un document PDF. Voir aussi cpdf_set_title(), cpdf_set_creator() et cpdf_set_keywords(). cpdf_set_keywords (PHP 3>= 3.0.8, PHP 4 >= 4.0b4) Fixe les mot clés d’un document PDF. void cpdf_set_keywords (string keywords) cpdf_set_keywords() fixe les mots-clé d’un document PDF. Voir aussi cpdf_set_title(), cpdf_set_creator() et cpdf_set_subject(). 228 ClibPDF cpdf_open (PHP 3>= 3.0.8, PHP 4 >= 4.0b4) Ouvre un nouveau document PDF. resource cpdf_open (int compression, string filename) cpdf_open() ouvre un nouveau document PDF. Le premier paramètre compression active ou pas la compression, suivant qu’il vaut 0 ou 1. Le deuxième paramètre, optionnel, choisit le fichier de destination du document. Si il est omis, le document sera écrit en mémoire, et pourra être écrit dans un fichier avec cpdf_save_to_file() ou envoyé à l’affichage avec cpdf_output_buffer(). Note : La valeur retournée sera nécessaire pour les autres fonctions de ClibPDF comme premier paramètre. La librairie ClibPDF prend le nom de fichier "-" comme synonyme de stdout. Si PHP est compilé comme un module apache, cela ne fonctionnera pas, car la méthode d’envoie des données de ClibPDF ne fonctionne pas avec Apache. Vous pouvez résoudre ce problème en ne fournissant pas de nom de fichier, et en utilisant la fonction cpdf_output_buffer() pour afficher le document PDF. Voir aussi cpdf_close() et cpdf_output_buffer(). cpdf_close (PHP 3>= 3.0.8, PHP 4 >= 4.0b4) Ferme un fichier PDF. void cpdf_close (resource pdf_document) cpdf_close() ferme un fichier PDF. Ce doit être la dernière fonction appelée, et elle apparaît même après cpdf_finalize(), cpdf_output_buffer() et cpdf_save_to_file(). Voir aussi cpdf_open(). cpdf_page_init (PHP 3>= 3.0.8, PHP 4 >= 4.0b4) Commence une nouvelle page. void cpdf_page_init (resource pdf_document, int page_number, int orientation, double height, double width [, double unit]) cpdf_page_init() commence une nouvelle page, avec la hauteur height et la largeur width. La page a le numéro page_number et l’orientation orientation. orientation vaut 0 pour portrait et 1 pour paysage. Le dernier paramètre, optionnel, unit, fixe l’unité pour le système de coordonnées. Cette valeur doit être un nombre de points postscript, par unité. Etant donné que un pouce (inch) vaut 72 points, une valeur de 72 vaudra un pouce (inch). Par défaut, cette valeur vaut 72. Voir aussi cpdf_set_current_page(). cpdf_finalize_page (PHP 3>= 3.0.10, PHP 4 >= 4.0b4) Termine une page. void cpdf_finalize_page (resource pdf_document, int page_number) 229 ClibPDF cpdf_finalize_page() termine la page de numéro page_number. cpdf_finalize_page() ne fait qu’une sauvegarde mémoire. Les pages terminées prennent moins de place, mais ne peuvent plus être modifiées. Voir aussi cpdf_page_init(). cpdf_finalize (PHP 3>= 3.0.8, PHP 4 >= 4.0b4) Termine un document. void cpdf_finalize (resource pdf_document) cpdf_finalize() termine un document. Vous devez toujours appeler cpdf_close() après. Voir aussi cpdf_close(). cpdf_output_buffer (PHP 3>= 3.0.9, PHP 4 >= 4.0b4) Envoie le document PDF dans un buffer mémoire. void cpdf_output_buffer (resource pdf_document) cpdf_output_buffer() envoie le document PDF dans un buffer mémoire de stdout. Le document doit avoir été créé en mémoire, ce qui est le cas si cpdf_open() a été appelée dans paramètre de nom de fichier. Voir aussi cpdf_open(). cpdf_save_to_file (PHP 3>= 3.0.8, PHP 4 >= 4.0b4) Ecrit un document PDF dans un fichier. void cpdf_save_to_file (resource pdf_document, string filename) cpdf_save_to_file() écrit un document PDF dans un fichier, s’il a été créé en mémoire. cpdf_save_to_file() n’est pas nécessaire si un nom de fichier a été fourni lors de l’appel à cpdf_open(). Voir aussi cpdf_output_buffer() et cpdf_open(). cpdf_set_current_page (PHP 3>= 3.0.9, PHP 4 >= 4.0b4) Fixe la page courante. void cpdf_set_current_page (resource pdf_document, int page_number) cpdf_set_current_page() fixe la page courante, oú toutes les prochaînes opérations vont avoir lieu. On peut changer de page jusqu’à ce qu’une page soit terminée avec cpdf_finalize_page(). Voir aussi cpdf_finalize_page(). 230 ClibPDF cpdf_begin_text (PHP 3>= 3.0.8, PHP 4 >= 4.0b4) Démarre une section de texte. void cpdf_begin_text (resource pdf_document) cpdf_begin_text() démarre une section de texte. Elle doit être terminée avec cpdf_end_text(). Exemple 1. Affichage de texte <?php cpdf_begin_text($pdf); cpdf_set_font($pdf, 16, "Helvetica", "WinAnsiEncoding"); cpdf_text($pdf, 100, 100, "Some text"); cpdf_end_text($pdf) ?> Voir aussi cpdf_end_text(). cpdf_end_text (PHP 3>= 3.0.8, PHP 4 >= 4.0b4) Termine une section de texte. void cpdf_end_text (resource pdf_document) cpdf_end_text() termine une section de texte, commencée avec cpdf_begin_text(). Exemple 1. Affichage de texte <?php cpdf_begin_text($pdf); cpdf_set_font($pdf, 16, "Helvetica", "WinAnsiEncoding"); cpdf_text($pdf, 100, 100, "Some text"); cpdf_end_text($pdf) ?> Voir aussi cpdf_begin_text(). cpdf_show (PHP 3>= 3.0.8, PHP 4 >= 4.0b4) Imprime un texte à la position courante. void cpdf_show (resource pdf_document, string text) cpdf_show() imprime la chaîne text, à la position courante. Voir aussi cpdf_text(), cpdf_begin_text() et cpdf_end_text(). 231 ClibPDF cpdf_show_xy (PHP 3>= 3.0.8, PHP 4 >= 4.0b4) Affiche un texte à une position. void cpdf_show_xy (resource pdf_document, string text, double x-coor, double y-coor [, int mode]) cpdf_show_xy() imprime la chaîne text, à la position de coordonnées (x-koor, y-koor). Le dernier paramètre optionnel est une unité de longueur. Si il prend la valeur de 0 (ou si il est omis), c’est la valeur par défaut (72) qui est utilisé. Note : The function cpdf_show_xy() est identique à cpdf_text() sans les options. Voir aussi cpdf_text(). cpdf_text (PHP 3>= 3.0.8, PHP 4 >= 4.0b4) Imprime un texte avec des options. void cpdf_text (resource pdf_document, string text, double x-coor, double y-coor [, int mode [, double orientation [, int alignmode]]]) cpdf_text() imprime le text text à la position de coordonnées (x-koor, y-koor). Le paramètre mode est une unité de longueur. Si il prend la valeur de 0 (ou si il est omis), c’est la valeur par défaut (72) qui est utilisé. Le paramètre optionel orientation est un angle de rotation du texte, en degrés. Le paramètre optionnel alignmode détermine l’alignement du texte. Reportez vous à la doc de ClibPDF, pour les valeurs possibles. Voir aussi cpdf_show_xy(). cpdf_set_font (PHP 3>= 3.0.8, PHP 4 >= 4.0b4) Sélectionne la police courante et sa taille. void cpdf_set_font (resource pdf_document, string font name, double size, string encoding) cpdf_set_font() selectionne la police courante, sa taille et l’encodage. Actuellement, seules les polices postscript sont supportées. Le dernier paramètre encoding peut prendre les valeurs suivantes : "MacRomanEncoding", "MacExpertEncoding", "WinAnsiEncoding", et "NULL". "NULL" signifie qu’il faut utiliser l’encodage par défaut. Reportez vous à la doc de ClibPDF, pour plus d’informations, notamment sur les polices asiatiques. cpdf_set_leading (PHP 3>= 3.0.8, PHP 4 >= 4.0b4) Fixe la distance entre deux lignes. void cpdf_set_leading (resource pdf_document, double distance) cpdf_set_leading() fixe la distance entre deux lignes. Cela servira si le texte est affiché par cpdf_continue_text(). Voir aussi cpdf_continue_text(). 232 ClibPDF cpdf_set_text_rendering (PHP 3>= 3.0.8, PHP 4 >= 4.0b4) Détermine le rendu du texte. void cpdf_set_text_rendering (resource pdf_document, int mode) cpdf_set_text_rendering() détermines le rendu du texte. Les valeurs possibles pour mode sont : 0=texte plein, 1=texte stroke, 2=texte plein et stroke, 3=invisible, 4=texte plein et ajouté au chemin, 5=texte stroke et ajouté au chemin, 6=texte plein et stroke et ajouté au chemin, 7=et ajouté au chemin. cpdf_set_horiz_scaling (PHP 3>= 3.0.8, PHP 4 >= 4.0b4) Fixe l’échelle horizontale du texte. void cpdf_set_horiz_scaling (resource pdf_document, double scale) cpdf_set_horiz_scaling() fixe l’échelle horizontale du texte à scale %. cpdf_set_text_rise (PHP 3>= 3.0.8, PHP 4 >= 4.0b4) Fixe l’élévation du texte. void cpdf_set_text_rise (resource pdf_document, double value) cpdf_set_text_rise() fixe l’élévation du texte à value unités. cpdf_set_text_matrix (PHP 3>= 3.0.8, PHP 4 >= 4.0b4) Fixe la matrice du texte. void cpdf_set_text_matrix (resource pdf_document, array matrix) cpdf_set_text_matrix() fixe la matrice du texte, qui décrit la transformation appliquée à police. cpdf_set_text_pos (PHP 3>= 3.0.8, PHP 4 >= 4.0b4) Fixe la position du texte. void cpdf_set_text_pos (resource pdf_document, double x-koor, double y-koor, int mode) cpdf_set_text_pos() Fixe la position du texte pour le prochain appel à cpdf_show(). Le paramètre mode est une unité de longueur. Si il prend la valeur de 0 (ou si il est omis), c’est la valeur par défaut (72) qui est utilisé. Voir aussi cpdf_show(), cpdf_text(). 233 ClibPDF cpdf_set_char_spacing (PHP 3>= 3.0.8, PHP 4 >= 4.0b4) Fixe l’espacement des caractères. void cpdf_set_text_pos (resource pdf_document, double space) cpdf_set_char_spacing() fixe l’espacement des caractères. Voir aussi cpdf_set_word_spacing(), cpdf_set_leading(). cpdf_set_word_spacing (PHP 3>= 3.0.8, PHP 4 >= 4.0b4) Fixe l’espacement des mots. void cpdf_set_word_spacing (resource pdf_document, double space) cpdf_set_word_spacing() fixe l’espacement des caractères. Voir aussi cpdf_set_char_spacing(), cpdf_set_leading(). cpdf_continue_text (PHP 3>= 3.0.8, PHP 4 >= 4.0b4) Imprime le texte à la ligne suivante. void cpdf_continue_text (resource pdf_document, string text) cpdf_continue_text() imprime le texte text à la ligne suivante. Voir aussi cpdf_show_xy(), cpdf_text(), cpdf_set_leading(), cpdf_set_text_pos(). cpdf_stringwidth (PHP 3>= 3.0.8, PHP 4 >= 4.0b4) Retourne la taille de la chaîne. double cpdf_stringwidth (resource pdf_document, string text) cpdf_stringwidth() retourne la taille de la chaîne text. Une police doit avoir déjà été choisie. Voir aussi cpdf_set_font(). cpdf_save (PHP 3>= 3.0.8, PHP 4 >= 4.0b4) Sauve l’environnement courant. void cpdf_save (resource pdf_document) cpdf_save() sauve l’environnement courant. cpdf_save() est similaire à la commande postscript gsave. Très pratique quand vous devez faire des translations et rotations sur un objet, mais sans affecter les autres. Voir aussi cpdf_restore(). 234 ClibPDF cpdf_restore (PHP 3>= 3.0.8, PHP 4 >= 4.0b4) Restaure un environnement. void cpdf_restore (resource pdf_document) cpdf_restore() restaure l’environnement sauvé par cpdf_save(). Cette fonction est similaire à la commande postscript grestore. Très pratique quand vous devez faire des translations et rotations sur un objet, mais sans affecter les autres. Exemple 1. Sauver/Restaurer <?php cpdf_save($pdf); // plein de transformations, translations, ... cpdf_restore($pdf) ?> Voir aussi cpdf_save(). cpdf_translate (PHP 3>= 3.0.8, PHP 4 >= 4.0b4) Modifie l’origine du système de coordonées. void cpdf_translate (resource pdf_document, double x-koor, double y-koor, int mode) cpdf_translate() modifie l’origine du système de coordonées en placant l’origine aux coordonnées (x-koor, y-koor). Le paramètre mode est une unité de longueur. S’il prend la valeur de 0 (ou s’il est omis), c’est la valeur par défaut (72) qui est utilisé. cpdf_scale (PHP 3>= 3.0.8, PHP 4 >= 4.0b4) Modifie l’échelle. void cpdf_scale (resource pdf_document, double x-scale, double y-scale) cpdf_scale() modifie l’echelle dans les deux directions. cpdf_rotate (PHP 3>= 3.0.8, PHP 4 >= 4.0b4) Effectue une rotation. void cpdf_rotate (resource pdf_document, double angle) cpdf_rotate() effectue une rotation, d’un angle de angle degrés. 235 ClibPDF cpdf_setflat (PHP 3>= 3.0.8, PHP 4 >= 4.0b4) Fixe la platitude (flatness). void cpdf_setflat (resource pdf_document, double value) cpdf_setflat() fixe la platitude (flatness), entre 0 et 100. cpdf_setlinejoin (PHP 3>= 3.0.8, PHP 4 >= 4.0b4) Fixe le paramètre linejoin. void cpdf_setlinejoin (resource pdf_document, long value) cpdf_setlinejoin() fixe le paramètre linejoin à une valeur value, entre 0 et 2. 0 = miter, 1 = round, 2 = bevel. cpdf_setlinecap (PHP 3>= 3.0.8, PHP 4 >= 4.0b4) Fixe le paramètre linecap. void cpdf_setlinecap (resource pdf_document, int value) cpdf_setlinecap() fixe le paramètre linecap à une valeur value entre 0 et 2. 0 = butt end, 1 = round, 2 = projecting square. cpdf_setmiterlimit (PHP 3>= 3.0.8, PHP 4 >= 4.0b4) Fixe le paramètre miter limit. void cpdf_setmiterlimit (resource pdf_document, double value) cpdf_setmiterlimit() fixe le paramètre "miter limit" à une valeur supérieure ou égale à 1. cpdf_setlinewidth (PHP 3>= 3.0.8, PHP 4 >= 4.0b4) Fixe la largeur de ligne. void cpdf_setlinewidth (resource pdf_document, double width) cpdf_setlinewidth() fixe la largeur de ligne à la valeur de width. cpdf_setdash (PHP 3>= 3.0.8, PHP 4 >= 4.0b4) Fixe le motif de pointillé. void cpdf_setdash (resource pdf_document, double white, double black) 236 ClibPDF cpdf_setdash() fixe le motif de pointillé à white unité de blanc et black unités de noir. Si les deux sont à 0, une ligne pleine est affichée. cpdf_newpath (PHP 3>= 3.0.9, PHP 4 >= 4.0b4) Commence un nouveau chemin void cpdf_newpath (int pdf_document) cpdf_newpath() commence un nouveau chemin dans le document pdf_document. cpdf_moveto (PHP 3>= 3.0.8, PHP 4 >= 4.0b4) Fixe le point courant. void cpdf_moveto (resource pdf_document, double x-koor, double y-koor, int mode) cpdf_moveto() fixe le point courant aux coordonnées (x-koor, y-koor). Le paramètre mode est une unité de longueur. Si il prend la valeur de 0 (ou si il est omis), c’est la valeur par défaut (72) qui est utilisée. cpdf_rmoveto (PHP 3>= 3.0.9, PHP 4 >= 4.0b4) Fixe le point courant relativement. void cpdf_rmoveto (resource pdf_document, double x-koor, double y-koor, int mode) cpdf_rmoveto() fixe le point courant aux coordonnées (x-koor, y-koor), relativement. Le paramètre mode est une unité de longueur. Si il prend la valeur de 0 (ou si il est omis), c’est la valeur par défaut (72) qui est utilisée. Voir aussi cpdf_moveto(). cpdf_curveto (PHP 3>= 3.0.8, PHP 4 >= 4.0b4) Dessine une courbe. void cpdf_curveto (resource pdf_document, double x1, double y1, double x2, double y2, double x3, double y3, int mode) cpdf_curveto() dessine une courbe de Bezier, entre le point courant et le point (x3, y3), en utilisant les points de contrôle (x1, y1) et (x2, y2). Le paramètre mode est une unité de longueur. Si il prend la valeur de 0 (ou si il est omis), c’est la valeur par défaut (72) qui est utilisée. Voir aussi cpdf_moveto(), cpdf_rmoveto(), cpdf_rlineto(), cpdf_lineto(). 237 ClibPDF cpdf_lineto (PHP 3>= 3.0.8, PHP 4 >= 4.0b4) Dessine une ligne. void cpdf_lineto (resource pdf_document, double x-koor, double y-koor, int mode) cpdf_lineto() dessine une ligne entre le point courant et le point de coordonnées (x-koor, y-koor). Le paramètre mode est une unité de longueur. Si il prend la valeur de 0 (ou si il est omis), c’est la valeur par défaut (72) qui est utilisée. Voir aussi cpdf_moveto(), cpdf_rmoveto(), cpdf_curveto(). cpdf_rlineto (PHP 3>= 3.0.9, PHP 4 >= 4.0b4) Dessine une ligne, relativement. void cpdf_rlineto (resource pdf_document, double x-koor, double y-koor, int mode) cpdf_rlineto() dessine une ligne entre le point courant et le point de coordonnées relatives (x-koor, y-koor). Le paramètre mode est une unité de longueur. Si il prend la valeur de 0 (ou si il est omis), c’est la valeur par défaut (72) qui est utilisée. Voir aussi cpdf_moveto(), cpdf_rmoveto() et cpdf_curveto(). cpdf_circle (PHP 3>= 3.0.8, PHP 4 >= 4.0b4) Dessine un cercle. void cpdf_circle (resource pdf_document, double x-koor, double y-koor, double radius, int mode) cpdf_circle() dessine un cercle de centre (x-koor, y-koor) et de rayon radius. Le paramètre mode est une unité de longueur. Si il prend la valeur de 0 (ou si il est omis), c’est la valeur par défaut (72) qui est utilisée. Voir aussi cpdf_arc(). cpdf_arc (PHP 3>= 3.0.8, PHP 4 >= 4.0b4) Dessine un arc de cercle. void cpdf_arc (resource pdf_document, double x-koor, double y-koor, double radius, double start, double end, int mode) cpdf_arc() dessine un arc de cercle, dont le centre est au point (x-koor, y-koor) et l’angle est radius, commencant à l’angle start et finissant à l’angle end. Le paramètre mode est une unité de longueur. Si il prend la valeur de 0 (ou si il est omis), c’est la valeur par défaut (72) qui est utilisée. Voir aussi cpdf_circle(). 238 ClibPDF cpdf_rect (PHP 3>= 3.0.8, PHP 4 >= 4.0b4) Dessine un rectangle. void cpdf_rect (resource pdf_document, double x-koor, double y-koor, double width, double height, int mode) cpdf_rect() dessine un rectangle dont le coin inférieur droit est au point (x-koor, y-koor). La largeur est width. La hauteur estheight. Le paramètre mode est une unité de longueur. Si il prend la valeur de 0 (ou si il est omis), c’est la valeur par défaut (72) qui est utilisée. cpdf_closepath (PHP 3>= 3.0.8, PHP 4 >= 4.0b4) Ferme le chemin. void cpdf_closepath (resource pdf_document) cpdf_closepath() ferme le chemin courant. cpdf_stroke (PHP 3>= 3.0.8, PHP 4 >= 4.0b4) Dessine une ligne le long du chemin. void cpdf_stroke (resource pdf_document) cpdf_stroke() dessine une ligne le long du chemin. Voir aussi cpdf_closepath(), cpdf_closepath_stroke(). cpdf_closepath_stroke (PHP 3>= 3.0.8, PHP 4 >= 4.0b4) Ferme le fichier et dessine une ligne le long du chemin. void cpdf_closepath_stroke (resource pdf_document) cpdf_closepath_stroke() est une combinaison de cpdf_closepath() et cpdf_stroke(). Voir aussi cpdf_closepath(), cpdf_stroke(). cpdf_fill (PHP 3>= 3.0.8, PHP 4 >= 4.0b4) Remplit le chemin courant. void cpdf_fill (resource pdf_document) cpdf_fill() remplit l’intérieur du chemin courant avec la couleur courante. Voir aussi cpdf_closepath(), cpdf_stroke(), cpdf_setgray_fill(), cpdf_setgray(), cpdf_setrgbcolor_fill() et cpdf_setrgbcolor(). 239 ClibPDF cpdf_fill_stroke (PHP 3>= 3.0.8, PHP 4 >= 4.0b4) Remplit le chemin, et dessine le bord. void cpdf_fill_stroke (resource pdf_document) cpdf_fill_stroke() remplit l’intérieur du chemin avec la couleur courante, et dessine le chemin. Voir aussi cpdf_closepath(), cpdf_stroke(), cpdf_fill(), cpdf_setgray_fill(), cpdf_setgray(), cpdf_setrgbcolor_fill() et cpdf_setrgbcolor(). cpdf_closepath_fill_stroke (PHP 3>= 3.0.8, PHP 4 >= 4.0b4) Remplit le chemin, dessine le bord et ferme le chemin. void cpdf_closepath_fill_stroke (resource pdf_document) cpdf_closepath_fill_stroke() remplit le chemin, dessine le bord et ferme le chemin. Voir aussi cpdf_closepath(), cpdf_stroke(), cpdf_fill(), cpdf_setgray_fill(), cpdf_setgray(), cpdf_setrgbcolor_fill() et cpdf_setrgbcolor(). cpdf_clip (PHP 3>= 3.0.8, PHP 4 >= 4.0b4) Aligne les dessins sur le chemin courant. void cpdf_clip (resource pdf_document) cpdf_clip() aligne les dessins sur le chemin courant. cpdf_setgray_fill (PHP 3>= 3.0.8, PHP 4 >= 4.0b4) Modifie le niveau de gris comme couleur de remplissage. void cpdf_setgray_fill (resource pdf_document, double value) cpdf_setgray_fill() remplace le niveau de gris, couleur de remplissage courante, par value. Voir aussi cpdf_setrgbcolor_fill(). cpdf_setgray_stroke (PHP 3>= 3.0.8, PHP 4 >= 4.0b4) Choisit un niveau de gris comme couleur de dessin. void cpdf_setgray_stroke (resource pdf_document, double gray_value) cpdf_setgray_stroke() remplace le niveau de gris, couleur de dessin courante, par value. Voir aussi cpdf_setrgbcolor_stroke(). 240 ClibPDF cpdf_setgray (PHP 3>= 3.0.8, PHP 4 >= 4.0b4) Modifie un niveau de gris comme couleur de dessin et de remplissage. void cpdf_setgray (resource pdf_document, double gray_value) cpdf_setgray_stroke() remplace le niveau de gris, couleur de dessin et de remplissage, par value. Voir aussi cpdf_setrgbcolor_stroke(), cpdf_setrgbcolor_fill(). cpdf_setrgbcolor_fill (PHP 3>= 3.0.8, PHP 4 >= 4.0b4) Choisit une couleur rgb comme couleur de remplissage. void cpdf_setrgbcolor_fill (resource pdf_document, double red_value, double green_value, double blue_value) cpdf_setrgbcolor_fill() remplace la couleur de remplissage, par la couleur rgb (red_value, green_value, blue_value). Voir aussi cpdf_setrgbcolor_stroke(), cpdf_setrgbcolor(). cpdf_setrgbcolor_stroke (PHP 3>= 3.0.8, PHP 4 >= 4.0b4) Choisit une couleur rgb comme couleur de dessin. void cpdf_setrgbcolor_stroke (resource pdf_document, double red_value, double green_value, double blue_value) cpdf_setrgbcolor_stroke() remplace la couleur de dessin, par la couleur rgb (red_value, green_value, blue_value). Voir aussi cpdf_setrgbcolor_fill() et cpdf_setrgbcolor(). cpdf_setrgbcolor (PHP 3>= 3.0.8, PHP 4 >= 4.0b4) Choisit une couleur rgb comme couleur de dessin et de remplissage. void cpdf_setrgbcolor (resource pdf_document, double red_value, double green_value, double blue_value) cpdf_setrgbcolor_stroke() remplace la couleur de remplissage et de dessin, par la couleur rgb (red_value, green_value, blue_value). Voir aussi cpdf_setrgbcolor_stroke() et cpdf_setrgbcolor_fill(). cpdf_add_outline (PHP 3>= 3.0.9, PHP 4 >= 4.0b4) Ajoute un signet à la page courante. void cpdf_add_outline (resource pdf_document, string text) 241 ClibPDF cpdf_add_outline() ajoute un signet à la page courante, avec le texte text qui pointe sur la page courante. Exemple 1. Ajouter une mise en relief <?php $cpdf = cpdf_open(0); cpdf_page_init($cpdf, 1, 0, 595, 842); cpdf_add_outline($cpdf, 0, 0, 0, 1, "Page 1"); // ... // quelques dessins // ... cpdf_finalize($cpdf); Header("Content-type: application/pdf"); cpdf_output_buffer($cpdf); cpdf_close($cpdf); ?> cpdf_set_page_animation (PHP 3>= 3.0.9, PHP 4 >= 4.0b4) Fixe l’animation de la transition entre les pages. void cpdf_set_page_animation (resource pdf_document, int transition, double duration) cpdf_set_page_animation() fixe l’animation de la transition entre les pages. La valeur du paramètre de transition transition peut être : 0 pour aucune, 1 pour deux lignes en travers de l’écran, qui révèlent la prochaîne page, 2 pour plusieurs lignes en travers de l’écran, qui révèlent la prochaîne page, 3 pour une boîte qui révèle la prochaîne page, 4 pour une seule ligne en travers de l’écran, qui révèle la prochaîne page, 5 pour l’ancienne page qui se dissout 6 pour un effet de dissolution d’un angle à l’autre 7 pour le remplacement simple (par défaut) La valeur de duration est le nombre de secondes avant le passage à la page suivante. cpdf_import_jpeg (PHP 3>= 3.0.9, PHP 4 >= 4.0b4) Ouvre une image JPEG. int cpdf_import_jpeg (resource pdf_document, string file name, double x-koor, double y-koor, double angle, double width, double height, double x-scale, double y-scale, int mode) cpdf_import_jpeg() ouvre une image JPG, enregistré dans le fichier file name. Le format de l’image doit être JPEG. L’image est placée dans la page courante, aux coordonnées (x-koor, y-koor). L’image subira une rotation d’un angle de angle degrés. Le paramètre mode est une unité de longueur. Si il prend la valeur de 0 (ou si il est omis), c’est la valeur par défaut (72) qui est utilisée. Voir aussi cpdf_place_inline_image(). 242 ClibPDF cpdf_place_inline_image (PHP 3>= 3.0.9, PHP 4 >= 4.0b4) Place une image dans la page. void cpdf_place_inline_image (resource pdf_document, int image, double x-koor, double y-koor, double angle, double width, double height, int mode) cpdf_place_inline_image() places une image créée par un script PHP, dans la page, à la position (x-koor, y-koor). L’image peut être mise à l’échelle, en même temps. Le paramètre mode est une unité de longueur. Si il prend la valeur de 0 (ou si il est omis), c’est la valeur par défaut (72) qui est utilisé. Voir aussi cpdf_import_jpeg(). cpdf_add_annotation (PHP 3>= 3.0.12, PHP 4 >= 4.0b4) Ajoute une annotation. void cpdf_add_annotation (resource pdf_document, double llx, double lly, double urx, double ury, string title, string content, int mode) cpdf_add_annotation() ajoute une note, dont le coin inférieur droit est (llx, lly) et le coin supérieur droit est (urx, ury). Le paramètre mode est une unité de longueur. Si il prend la valeur de 0 (ou si il est omis), c’est la valeur par défaut (72) qui est utilisé. 243 XI. CURL Introduction à CURL PHP supporte libcurl, une librairie créée par Daniel Stenberg, qui vous permet de vous connecter de communiquer avec de nombreux serveurs, grâce à de nombreux protocoles. libcurl supporte actuellement les protocoles suivants : http, https, ftp, gopher, telnet, dict, file, et ldap. libcurl supporte aussi les certificats HTTPS, les POST HTTP, PUT HTTP, le chargement par FTP (ce qui peut être fait par l’extension FTP), les chargement par formulaire HTTP, les proxies, les cookies et l’authentification par mot de passe et nom de compte. Pour pouvoir utiliser les fonctions CURL, vous devez installer le package CURL (http://curl.haxx.se/). PHP requiert la version CURL 7.0.2-beta ou plus récente. PHP ne fonctionnera pas avec une version inférieure à la version 7.0.2-beta. Pour utiliser CURL depuis les scripts PHP, vous devez aussi compiler PHP avec l’option --with-curl[=DIR] où DIR est le chemin jusqu’au dossier contenant les dossiers lib et include. Dans le dossier include il doit se trouver un dossier appelé curl, qui contient notamment les fichiers easy.h et curl.h. Il doit aussi se trouver un fichier nommé libcurl.a dans le dossier lib. Une fois que vous avez compilé PHP avec le support CURL, vous pouvez commencer à l’exploiter avec vos scripts PHP. Le principe de fonctionnement est d’initialiser une session CURL avec curl_init(), puis de choisir toutes vos options de transfert avec curl_exec() et de finir votre session avec curl_close(). Voici un exemple d’utilisation des fonctions CURL, qui récupère la page principale de PHP : Exemple 1. Utilisation de CURL et PHP pour récupérer une page <?php $ch = curl_init ("http://www.php.net/"); $fp = fopen ("php_homepage.txt", "w"); curl_setopt ($ch, CURLOPT_INFILE, $fp); curl_setopt ($ch, CURLOPT_HEADER, 0); curl_exec ($ch); curl_close ($ch); fclose ($fp); ?> 244 CURL curl_init (PHP 4 >= 4.0.2) Initialise une session CURL resource curl_init (string [url]) curl_init() initialise une nouvelle session et retourne un identifiant de session CURL, à utiliser avec les fonctions curl_setopt(), curl_exec() et curl_close(). Si le paramètre optionnel url est fourni, alors CURLOPT_URL prendra cette valeur. Vous pouvez manuellement fixer cette valeur avec la fonction curl_setopt(). Exemple 1. Initialiser une session CURL et récupèration d’une page web. <?php $ch = curl_init(); curl_setopt ($ch, CURLOPT_URL, "http://www.zend.com/"); curl_setopt ($ch, CURLOPT_HEADER, 0); curl_exec ($ch); curl_close ($ch); ?> Voir aussi : curl_close(), curl_setopt(). curl_init (PHP 4 >= 4.0.2) Modifie une option de transfert CURL boolean curl_setopt (resource ch, string option, mixed value) curl_setopt() fixe les options de transfert de la session CURL identifiée par ch. option est le nom de l’option à fixer, et value est sa valeur. value doit être de type "long" pour les options suivantes (spécifiée par option) : • CURLOPT_INFILESIZE: Lorsque vous téléchargez un fichier sur un site distant, cette option sert à indiquer à PHP la taille maximale du fichier attendu. • CURLOPT_VERBOSE: Choisissez une valeur non nulle pour que CURL vous affiche tous les événements. • CURLOPT_HEADER: Choisissez une valeur non nulle pour que CURL inclut l’en-tête dans la valeur de retour. • CURLOPT_NOPROGRESS: Choisissez une valeur non nulle pour que PHP n’affiche pas l’état des transferts CURL. Note : PHP choisit automatiquement une valeur non nulle. Ne changez cette valeur que le temps du débuggage. • CURLOPT_NOBODY: Choisissez une valeur non nulle pour que le corps du transfert ne soit pas inclus dans la valeur de retour. • CURLOPT_FAILONERROR: Choisissez une valeur non nulle pour que PHP traite silencieusement les codes HTTP supérieurs à 300. Le comportement par défaut est de retourner la page normalement, en ignorant ce code. • CURLOPT_UPLOAD: Choisissez une valeur non nulle pour que PHP prépare un chargement. • CURLOPT_POST: Choisissez une valeur non nulle pour que PHP fasse un HTTP POST. Un POST est un encodage normal "application/x-www-from-url", utilisé couramment par les formulaires HTML. • CURLOPT_FTPLISTONLY: Choisissez une valeur non nulle pour que PHP ne fasse que lister les noms d’un dossier FTP. • CURLOPT_FTPAPPEND: Choisissez une valeur non nulle pour que PHP concatène le fichier distant, plutôt que de l’écraser. 245 • CURL CURLOPT_NETRC: Choisissez une valeur non nulle pour que PHP scanne votre fichier ~./netrc et utilise votre nom de compte et mot de passe sur le site distant que vous souhaitez contacter. • CURLOPT_FOLLOWLOCATION : Choisissez une valeur non nulle pour suivre toutes les en-têtes "Location: " que le serveur envoie dans les en-têtes HTTP (notez que cette fonction est récursive, et que PHP suivra toutes les en-têtes "Location: " qu’il trouvera). • CURLOPT_PUT: Choisissez une valeur non nulle pour que pour chargement se fasse par HTTP PUT. Le fichier à charger doit être fixé avec les options CURLOPT_INFILE et CURLOPT_INFILESIZE. • CURLOPT_MUTE: Choisissez une valeur non nulle pour que PHP soit totalement silencieux concernant toutes les fonctions CURL. • CURLOPT_TIMEOUT: Passez un entier "long" comme paramètre qui représente le temps maximum d’exécution de la fonction CURL. • CURLOPT_LOW_SPEED_LIMIT: Passez un entier long qui représente la vitesse minimale en octets par secondes en dessous de laquelle, et pendant CURLOPT_LOW_SPEED secondes, PHP considèrera qu’elle est trop lente, et annulera le transfert. • CURLOPT_LOW_SPEED_TIME: Passez un entier "long" qui représente le temps en secondes, qui, si la vitesse de transfert reste en dessous de CURLOPT_LOW_SPEED_LIMIT, PHP considèrera que la connexion est trop lente, et l’annulera. • CURLOPT_RESUME_FROM : Passez un entier "long", qui représente l’offset, en octets, à partir duquel vous voulez commencer le transfert. • CURLOPT_SSLVERSION : Passez un entier "long" qui contient la version de SSL (2 ou 3) à utiliser. Par défaut, PHP essaiera de le déterminer par lui-même, bien que dans certains cas, il vous faudra le faire manuellement. • CURLOPT_TIMECONDITION : Passez un entier "long" qui définit comment CURLOPT_TIMEVALUE est utilisé. Vous pouvez choisir entre les valeurs TIMECOND_IFMODSINCE ou TIMECOND_ISUNMODSINCE. C’est une fonctionnalité HTTP. • CURLOPT_TIMEVALUE: Passez un entier "long" qui représente le temps en secondes depuis le 1er janvier 1970. Cette valeur sera utilisée comme spécifié dans l’option CURLOPT_TIMEVALUE. Par défaut, TIMECOND_IFMODSINCE sera utilisé. value doit être une chaîne de caractères pour les valeurs suivantes de option • CURLOPT_URL: L’URL que PHP va récupérer. Vous pouvez aussi choisir cette valeur lors de l’appel à curl_init(). • CURLOPT_USERPWD: Passez une chaîne de caractères au format [nom]:[mot de passe], pour que PHP l’utilise lors de la connexion. • CURLOPT_PROXYUSERPWD: Passez une chaîne de caractères au format [nom]:[mot de passe ], pour que PHP l’utilise lors de la connexion à un proxy HTTP. • CURLOPT_RANGE: Passez une chaîne de caractères qui représente la plage de valeur que vous désirez. Elle est au format "X-Y", où les valeurs de X ou Y peuvent être omises. Le transfert HTTP supporte aussi plusieurs intervalles, séparé par des virgules : X-Y,N-M. • CURLOPT_POSTFIELDS: Passez une chaîne de caractères qui contient toutes les données à passer lors d’une opération de HTTP POST. • CURLOPT_REFERER: Passez une chaîne de caractères qui contient l’en-tête de "REFERER", utilisé lors d’une requête HTTP. • CURLOPT_USERAGENT: Passez une chaîne de caractères qui contient l’en-tête "user-agent" utilisé dans une requête HTTP. • CURLOPT_FTPPORT: Passez une chaîne de caractères qui désignera l’adresse IP utilisée pour l’instruction FTP "PORT". L’instruction POST indique au serveur distant de se connecter cette adresse IP. La chaîne peut être une adresse IP, un nom d’hôte, un nom d’interface réseau (sous UNIX), ou juste ’-’, pour utiliser les IP par défaut du système. • CURLOPT_COOKIE: Passez une chaîne de caractères qui contiendra le contenu du cookie, à transmettre dans l’en-tête HTTP. • CURLOPT_SSLCERT: Passez une chaîne de caractères qui contiendra le nom de fichier du certificat, au format PEM. 246 • CURL CURLOPT_SSLCERTPASSWD: Passez une chaîne de caractères qui contient le mot de passe nécessaire pour utiliser le certificat CURLOPT_SSLCERT. • CURLOPT_COOKIEFILE: Passez une chaîne de caractères qui contiendra le nom du fichier contenant les données de cookie. Le fichier de cookie peut être au format Netscape, ou simplement des en-têtes HTTP écrites dans un fichier. • CURLOPT_CUSTOMREQUEST: Passez une chaîne de caractères qui sera utilisé à la place de GET ou HEAD lors des requêtes HTTP. Cette commande est pratique pour effectuer un DELETE, ou une autre commande HTTP exotique. Note : N’utilisez pas cette commande sans vous assurer que le serveur l’accepte. Les options suivantes requièrent un pointeur de fichier, qui est obtenu avec la fonction fopen() : • CURLOPT_FILE: Le fichier de sortie de votre transfert. Par défaut, STDOUT. • CURLOPT_INFILE: Le fichier d’entrée de votre transfert. • CURLOPT_WRITEHEADER: Le fichier de destination de l’en-tête de la sortie du transfert. • CURLOPT_STDERR: Le fichier d’erreurs. curl_exec (PHP 4 >= 4.0.2) Exécute une session CURL boolean curl_exec (resource ch) Cette fonction doit être appelée après l’initialisation et le paramètrage d’une session CURL. Son but est simplement d’éxécuter la session ch. curl_close (PHP 4 >= 4.0.2) Ferme une session CURL void curl_close (int ch) curl_close() ferme une session CURL et libère toutes les ressources réservées. L’identifiant CURL, ch, est aussi effacé. curl_version (PHP 4 >= 4.0.2) Retourne la version courante de CURL string curl_version (void) curl_version() retourne une chaîne avec la version courante de la librairie CURL. 247 XII. Paiement Cybercash Ces fonctions ne sont disponibles que si PHP a été compilé avec l’option --with-cybercash=[DIR]. Ces fonctions ont été ajoutées dans PHP 4. 248 Cybercash cybercash_encr (PHP 4 >= 4.0b4) array cybercash_encr (string wmk, string sk, string inbuff) cybercash_encr() retourne un tableau associatif, contenant les éléments "errcode" et, si "errcode" vaut FALSE, "outbuff" (string), "outLth" (long) et "macbuff" (string). cybercash_decr (PHP 4 >= 4.0b4) array cybercash_decr (string wmk, string sk, string inbuff) cybercash_decr() retourne un tableau associatif, contenant les éléments "errcode" et, si "errcode" vaut FALSE, "outbuff" (string), "outLth" (long) et "macbuff" (string). cybercash_base64_encode (PHP 4 >= 4.0b4) string cybercash_base64_encode (string inbuff) cybercash_base64_decode (PHP 4 >= 4.0b4) string cybercash_base64_decode (string inbuff) 249 XIII. CyberMUT : Crédit Mutuel Cette extension vous permet de traiter des transactions de cartes de crédits, avec le système due Crédit Mutuel : CyberMUT (http://www.creditmutuel.fr/centre_commercial/vendez_sur_internet.html). CynerMUT est un système de paiement français, proposé par le Crédit Mutuel. Si vous n’êtes pas résidants français, ces fonctions ne vous seront pas utiles. Cette extension n’est disponible que si PHP a été compilé par l’option --with-cybermut[=DIR], où DIR est le dossier qui contient les fichiers libcm-mac.a et cm-mac.h. Vous aurez besoin du SDK approprié, qui vous est fournit après vous êtes inscrit à CyberMUT (via le web, ou à votre agence la plus proche). L’utilisation de ces fonctions est presque identique aux fonctions originales, hormis le fait que les fonctions cybermut_creerformulairecm() et cybermut_creerreponsecm(), qui sont retournées directement par des fonctions PHP, au lieu d’être passées par référence aux fonctions originales. Ces fonctions ont été ajoutée en 4.0.6. Note : Ces fonctions ne font que fournis un moyen d’utiliser le SDK CyberMUT. Lisez attentivement le "CyberMUT Developers Guide" pour plus de détails sur les parmètres nécessaires. 250 CyberMUT cybermut_creerformulairecm (PHP 4 >= 4.0.5) Génère un formulaire HTML de paiement string cybermut_creerformulairecm (string url_CM , string version, string TPE, string montant, string ref_commande, string texte_libre, string url_retour, string url_retour_ok, string url_retour_err, string langue, string code_societe, string texte_bouton) cynermut_creerformulairecm() génère un formulaire HTML, de demande de paiement. Exemple 1. Première étape du paiment (équivalent à cgi1.c) <?php // Dossier contenant les clés de chiffrement putenv("CMKEYDIR=/var/creditmut/cles"); // Numéro de version $VERSION="1.2"; $retour = creditmut_creerformulairecm( "https://www.creditmutuel.fr/test/telepaiement/paiement.cgi", $VERSION, "1234567890", "300FRF", $REFERENCE, $TEXTE_LIBRE, $URL_RETOUR, $URL_RETOUR_OK, $URL_RETOUR_ERR, "francais", "company", "Paiement par carte bancaire"); echo $retour; ?> Voir aussi cybermut_testmac() et cybermut_creerreponsecm(). cybermut_testmac (PHP 4 >= 4.0.5) Vérifie le message de confirmation bool cybermut_testmac (string code_MAC, string version, string TPE, string cdate, string montant, string ref_commande, string texte_libre, string code-retour) cybermut_testmac() s’assure qu’il n’y a pas de données parasites dans le message de confirmation recu. Attention aux paramètres code-retour and texte-libre, qui ne peuvent pas être utilisés directement, car ils contienent des tirets dans leur nom. Vous devez utilisez la syntaxe suivante : <?php $code_retour=$HTTP_GET_VARS["code-retour"]; $texte_libre=$HTTP_GET_VARS["texte-libre"]; ?> 251 CyberMUT Exemple 1. Deuxième étape de paiement (équivalent à cgi2.c) <?php // Assurez vous que l’option Enable Track Vars est active. // Dossier qui contient les clés de paiement putenv("CMKEYDIR=/var/creditmut/cles"); // Numéro de version $VERSION="1.2"; $texte_libre = $HTTP_GET_VARS["texte-libre"]; $code_retour = $HTTP_GET_VARS["code-retour"]; $mac_ok = creditmut_testmac($MAC,$VERSION,$TPE,$date,$montant,$reference,$texte_libre,$code_retour) if ($mac_ok) { // // Gestion d’un paiement réussi // // $result=creditmut_creerreponsecm("OK"); } else { $result=creditmut_creerreponsecm("Document Falsifié");} ?> Voir aussi cybermut_creerformulairecm() et cybermut_creerreponsecm(). cybermut_creerreponsecm (PHP 4 >= 4.0.5) Génère un accusé de réception de confirmation de paiement string cybermut_creerreponsecm (string phrase) cybermut_creerreponsecm() retourne une chaîne contenant le message d’accusé de reception. Le paramètre vaut "OK" si le message de confirmation du paiement a été correctement indentifié par cybermut_testmac(). Tout autre chaîne doit être considéré comme une erreur de traitement. Voir aussi cybermut_creerformulairecm() et cybermut_testmac(). 252 XIV. Caractères Avertissement Ce module est EXPERIMENTAL. Cela signifie que le comportement de ces fonctions, leurs noms et concrètement, TOUT ce qui est documenté ici peut changer dans un futur proche, SANS PREAVIS! Soyez-en conscient, et utiliser ce module à vos risques et périls. Ces fonctions vérifient si un caractère ou une chaîne de caractères font partie d’une certaine classe de caractères, en fonction de la configuration locale. Appelée avec un argument de type entier, ces fonctions se comportent exactement comme le équivalent en langage C. Appelée avec un argument de type chaîne, elles vérifieront chaque caractère de la chaîne, et ne retourneront TRUE que si chaque caractère de la chaîne satisfait les critères requis. Tout autre type d’argument (autre que chaîne ou entier) génère une erreur, et retourne FALSE immédiatement. Avertissement Ces fonctions ont été ajoutée en PHP 4.0.4, et leur nom peut changer dans un futur proche. Les suggestions actuelles sont : ctype_issomething() au lieu de ctype_somthing() ou encore d’en faire une partie ext/standard et utiliser ainsi leur nom en langage C, même si cela peut conduire à des confusions entre isset() et is_sometype(). 253 ctype ctype_alnum (PHP 4 >= 4.0.4) Vérifie qu’un caractère est alpha-numérique bool ctype_alnum (string c) Avertissement Ce module est EXPERIMENTAL. Cela signifie que le comportement de ces fonctions, leurs noms et concrètement, TOUT ce qui est documenté ici peut changer dans un futur proche, SANS PREAVIS! Soyez-en conscient, et utiliser ce module à vos risques et périls. Voir aussi setlocale(). ctype_alpha (PHP 4 >= 4.0.4) Vérifie qu’un caractère est alphabétique bool ctype_alpha (string c) Avertissement Ce module est EXPERIMENTAL. Cela signifie que le comportement de ces fonctions, leurs noms et concrètement, TOUT ce qui est documenté ici peut changer dans un futur proche, SANS PREAVIS! Soyez-en conscient, et utiliser ce module à vos risques et périls. ctype_cntrl (PHP 4 >= 4.0.4) Vérifie qu’un caractère est un caractère de contrôle bool ctype_cntrl (string c) Avertissement Ce module est EXPERIMENTAL. Cela signifie que le comportement de ces fonctions, leurs noms et concrètement, TOUT ce qui est documenté ici peut changer dans un futur proche, SANS PREAVIS! Soyez-en conscient, et utiliser ce module à vos risques et périls. ctype_digit (PHP 4 >= 4.0.4) Vérifie qu’un caractère est numérique bool ctype_digit (string c) Avertissement Ce module est EXPERIMENTAL. Cela signifie que le comportement de ces fonctions, leurs noms et concrètement, TOUT ce qui est documenté ici peut changer dans un futur proche, SANS PREAVIS! Soyez-en conscient, et utiliser ce module à vos risques et périls. 254 ctype ctype_lower (PHP 4 >= 4.0.4) Vérifie qu’un caractère est en minuscule bool ctype_lower (string c) Avertissement Ce module est EXPERIMENTAL. Cela signifie que le comportement de ces fonctions, leurs noms et concrètement, TOUT ce qui est documenté ici peut changer dans un futur proche, SANS PREAVIS! Soyez-en conscient, et utiliser ce module à vos risques et périls. ctype_graph (PHP 4 >= 4.0.4) Vérifie qu’un caractère est imprimable (sauf " ", espace) bool ctype_graph (string c) Avertissement Ce module est EXPERIMENTAL. Cela signifie que le comportement de ces fonctions, leurs noms et concrètement, TOUT ce qui est documenté ici peut changer dans un futur proche, SANS PREAVIS! Soyez-en conscient, et utiliser ce module à vos risques et périls. ctype_print (PHP 4 >= 4.0.4) Vérifie qu’un caractère est imprimable bool ctype_print (string c) Avertissement Ce module est EXPERIMENTAL. Cela signifie que le comportement de ces fonctions, leurs noms et concrètement, TOUT ce qui est documenté ici peut changer dans un futur proche, SANS PREAVIS! Soyez-en conscient, et utiliser ce module à vos risques et périls. ctype_punct (PHP 4 >= 4.0.4) Vérifie qu’un caractère est imprimable, sans être ni un espace, ni un caractère alpha-numérique bool ctype_punct (string c) Avertissement Ce module est EXPERIMENTAL. Cela signifie que le comportement de ces fonctions, leurs noms et concrètement, TOUT ce qui est documenté ici peut changer dans un futur proche, SANS PREAVIS! Soyez-en conscient, et utiliser ce module à vos risques et périls. 255 ctype ctype_space (PHP 4 >= 4.0.4) Vérifie qu’un caractère est caractère blanc (espace, tabulation...) bool ctype_space (string c) Avertissement Ce module est EXPERIMENTAL. Cela signifie que le comportement de ces fonctions, leurs noms et concrètement, TOUT ce qui est documenté ici peut changer dans un futur proche, SANS PREAVIS! Soyez-en conscient, et utiliser ce module à vos risques et périls. ctype_upper (PHP 4 >= 4.0.4) Vérifie qu’un caractère est en majuscule bool ctype_upper (string c) Avertissement Ce module est EXPERIMENTAL. Cela signifie que le comportement de ces fonctions, leurs noms et concrètement, TOUT ce qui est documenté ici peut changer dans un futur proche, SANS PREAVIS! Soyez-en conscient, et utiliser ce module à vos risques et périls. ctype_xdigit (PHP 4 >= 4.0.4) Vérifie qu’un caractère représente un nombre héxadécimal bool ctype_xdigit (string c) Avertissement Ce module est EXPERIMENTAL. Cela signifie que le comportement de ces fonctions, leurs noms et concrètement, TOUT ce qui est documenté ici peut changer dans un futur proche, SANS PREAVIS! Soyez-en conscient, et utiliser ce module à vos risques et périls. 256 XV. DBA Ces fonctions sont l’interface avec les bases de type Berkeley. C’est une couche générale pour plusieurs bases de données sur fichiers. En tant que tel, les fonctionnalités sont limitées à une partie des fonctionnalités des bases de données modernes, comme Sleepycat Software’s DB2 (http://www.sleepycat.com/) (A ne pas confondre avec IBM’s DB2 software, qui fonctionne avec ODBC). Le comportement de certaines fonctions dépends de la base de données utilisée. Par exemple dba_optimize() et dba_sync() n’auront pas le même effet d’une base à l’autre. Lors de l’utilisation de la fonction dba_open() ou de dba_popen(), une des librairies suivante doit être fournie comme argument. La liste complète des librairies supportées par votre configuration est disponible avec la fonction phpinfo(). (Pour ajouter le support de l’une de ces librairies, ajouter l’option de configuration --with-XXXX). Tableau 1. Liste des librairies DBA Librairie Notes dbm Dbm est la plus ancienne des base de données de type Berkeley. Il vaut mieux l’éviter si possible. Les fonctions de compatibilités codées dans DB2 et gdbm ne sont pas supportées, car elles ne sont compatibles qu’au niveau du code source, et ne peuvent pas gérer le format dbm originel. ( --with-dbm). ndbm ndbm est un nouveau type de dbm plus flexible. Il a cependant la majorité des limitations du genre. ( --with-ndbm). gdbm gdbm est la base dbm GNU (ftp://ftp.gnu.org/pub/gnu/gdbm/). ( --with-gdbm). db2 db2 est DB2 de Sleepycat Software (http://www.sleepycat.com/). Elle se décrit comme un "ensemble d’outils qui fournissent une base de données performante, tant pour les applications indépendantes que pour le client/serveur". ( --with-db2). db3 DB3 est le DB3 de Sleepycat Software (http://www.sleepycat.com/). ( --with-db3). cdb cdb est "un package rapide, robuste, léger, pour créer et lire des bases de données constantes". C’est l’auteur de qmail qui l’a écrit, et elle est disponible ici (http://cr.yp.to/cdb.html). Puisque c’est une base constante, elle ne supporte que la lecture. (--with-cdb). Exemple 1. Exemple DBA <?php $id = dba_open("/tmp/test.db", "n", "db2"); if(!$id) { echo "dba_open a échoué\n"; exit; } dba_replace("key", "Ceci est un exemple!", $id); if(dba_exists("key", $id)) { echo dba_fetch("key", $id); dba_delete("key", $id); } dba_close($id); ?> 257 DBA DBA gère les données binaires, et n’a pas de limites arbitraires. Elle hérite de toutes les limites de la base sous jacentes. Toutes les bases de données sur fichiers doivent fournir un moyen de changer le mode d’accès au fichier d’une base, et si possible, de toutes les bases. Le mode d’accès est généralement passé en 4ème argument à dba_open() ou dba_popen(). Vous pouvez accéder à toutes les entrées d’une base d’une manière linéaire, avec les fonctions dba_firstkey() et dba_nextkey(). Vous ne devez pas modifier une base lorsque vous la traversez ainsi. Exemple 2. Passer en revue une base <?php // ...ouverture de la base... $key = dba_firstkey($id); while($key != FALSE) { if(...) { // conserver la clé pour faire d’autres opérations plus tard $handle_later[] = $key; } $key = dba_nextkey($id); } for($i = 0; $i < count($handle_later); $i++) dba_delete($handle_later[$i], $id); ?> 258 DBA dba_close (PHP 3>= 3.0.8, PHP 4 ) Ferme une base. void dba_close (resource handle) dba_close() ferme le lien établi avec la base et libère toutes les ressources de handle. handle est un identifiant de base, retourné par dba_open(). dba_close() ne retourne aucune valeur. Voir aussi dba_open() et dba_popen(). dba_delete (PHP 3>= 3.0.8, PHP 4 ) Efface une entrée. bool dba_delete (string key, resource handle) dba_delete() efface l’entrée spécifiée par la clé key, dans la base identifiée par handle. key est la clé de l’entrée à effacer. handle est un identifiant de lien, retourné par dba_open(). dba_delete() retourne TRUE ou FALSE, si l’entrée est effacée, ou pas effacée, respectivement. Voir aussi dba_exists(), dba_fetch(), dba_insert() et dba_replace() dba_exists (PHP 3>= 3.0.8, PHP 4 ) Vérifie qu’une clé existe. boolean dba_exists (string key, resource handle) dba_exists() vérifie si la clé key existe dans la base identifiée par handle. key est la clé qui doit être vérifiée. handle est un identifiant de base, retourné par dba_open(). dba_exists() retourne TRUE ou FALSE, si la clé est trouvée, ou pas, respectivement. Voir aussi dba_fetch(), dba_delete(), dba_insert() et dba_replace(). dba_fetch (PHP 3>= 3.0.8, PHP 4 ) Lit les données liées à une clé. string dba_fetch (string key, resource handle) dba_fetch() lit les données spécifiée par la clé key dans la base identifiée par handle. key est la clé dont on veut lire les données. handle est un identifiant de base, retourné par dba_open(). dba_fetch() retourne la chaîne associée ou FALSE, si la paire clé/valeur n’a pas été trouvée. Voir aussi dba_exists(), dba_delete(), dba_insert() et dba_replace(). 259 DBA dba_firstkey (PHP 3>= 3.0.8, PHP 4 ) Lit la première clé. string dba_firstkey (resource handle) dba_firstkey() retourne la première clé de la base de données spécifiée par handle et y place le pointeur interne de clé. Cela permettra de traverser la base. handle est un identifiant de base, retourné par dba_open(). dba_firstkey() retourne la clé, ou FALSE, suivant que la première clé existe ou pas. Voir aussi dba_nextkey() et l’exemple 2 de l’introduction DBA. dba_insert (PHP 3>= 3.0.8, PHP 4 ) Insère une entrée. boolean dba_insert (string key, string value, resource handle) dba_insert() insère l’entrée décrite par la clé key et la valeur value dans la base spécifiée par handle. Si une entrée aveec la même clé key existe déjà, l’insertion échouera. key est la clé de la valeur à insérer. value est la valeur à insérer. handle est un identifiant de base, retourné par dba_open(). dba_insert() retourne TRUE ou FALSE, suivant que l’insertion a réussi ou échoué. Voir aussi dba_exists(), dba_delete(), dba_fetch() et dba_replace(). dba_nextkey (PHP 3>= 3.0.8, PHP 4 ) Lit la clé suivante. string dba_nextkey (resource handle) dba_nextkey() retourne la clé suivante, dans la base identifiée par handle et incrémente le pointeur de clé. handle est un identifiant de base, retourné par dba_open(). dba_nextkey() retourne la clé, ou FALSE en cas d’échec. Voir aussi dba_firstkey(). dba_popen (PHP 3>= 3.0.8, PHP 4 ) Ouvre une connexion persistante à une base de données. int dba_popen (string path, string mode, string handler [, mixed ...]) dba_popen() établit une connexion persistante à la base repérée par path avec le mode mode, en utilisant l’identifiant handler. path est le chemin sur votre machine. 260 DBA mode vaut "r" pour lecture seule, "w" pour lecture/écriture, "c" pour lecture/écriture, et création si la base n’existe pas, et "n" pour création, écrasement, et accès en lecture/écriture. handler est le nom de l’identifiant qui sera utilisé pour accéder à path. Il est passé à dba_popen(). dba_popen() retourne un identifiant positif, ou FALSE, suivant que la base a été ouverte, ou que l’accès a échoué. Voir aussi dba_open() et dba_close(). dba_open (PHP 3>= 3.0.8, PHP 4 ) Ouvre une base de données. int dba_open (string path, string mode, string handler [, mixed ...]) dba_open() établit une connexion à la base repérée par path avec le mode mode et l’identifiant handler. pathest le chemin sur votre machine. mode vaut "r" pour lecture seule, "w" pour lecture/écriture, "c" pour lecture/écriture, et création si la base n’existe pas, et "n" pour création, écrasement, et accès en lecture/écriture. handler est le nom de l’identifiant qui sera utilisé pour accéder à path. Il est passé à dba_popen(). Voir aussi dba_popen() et dba_close(). dba_optimize (PHP 3>= 3.0.8, PHP 4 ) Optimise une base. boolean dba_optimize (resource handle) dba_optimize() optimise la base de données identifiée par handle. handle est un identifiant de base retourné par dba_open(). dba_optimize() retourne TRUE ou FALSE, suivant que l’optimisation a réussi ou échoué. Voir aussi dba_sync(). dba_replace (PHP 3>= 3.0.8, PHP 4 ) Remplace ou insère une entrée. boolean dba_replace (string key, string value, resource handle) dba_replace() remplaces ou insère une entrée, pour la clé key et avec la valeur value dans la base identifiée par handle. key est la clé qui va être insérée. value est la valeur qui va être insérée. handle est un identifiant de base retourné par dba_open(). dba_replace() retourne TRUE ou FALSE, suivant que l’opération réussit ou échoue. Voir aussi dba_exists(), dba_delete(), dba_fetch() et dba_insert(). 261 DBA dba_sync (PHP 3>= 3.0.8, PHP 4 ) Synchronise une base de données. boolean dba_sync (resource handle) dba_sync() synchronise la base de données spécifiée par handle. Si accepté, cela va probablement lancer une opération de réécriture physique du fichier. handle est un identifiant de base retourné par dba_open(). dba_sync() retourne TRUE ou FALSE, si la synchronisation réussi, ou échoue, respectivement. Voir aussi dba_optimize(). 262 XVI. Dates et heures 263 Date/heure checkdate (PHP 3, PHP 4 >= 4.0b1) Valide une date/heure. int checkdate (int month, int day, int year) checkdate() retourne TRUE si la date day/month/year est valide, et sinon FALSE. Notez bien que l’ordre des arguments n’est pas l’ordre français. La date est considérée comme valide si : • L’année est comprise entre entre 1 et 32767 inclus. (pour les versions antérieures à PHP 4.0.3, les années inférieures à 1 étaient aussi valides). • Le mois est compris entre 1 et 12 inclus • Le jour est compris dans l’intervalle de dates du mois. Les années bissextiles sont prises en compte. date (PHP 3, PHP 4 >= 4.0b1) Formate une date/heure locale string date (string format, int [timestamp]) date() retourne une date sous forme d’une chaîne, au format donné par la chaîne format. La date est fournie sous la forme d’un timestamp. Par défaut, la date courante est utilisée. Les caractères suivants sont utilisés pour spécifier le format : • a - "am" (matin) ou "pm" (après-midi) • A - "AM" (matin) ou "PM" (après-midi) • B - Heure Internet Swatch • d - Jour du mois, sur deux chiffres (éventuellement avec un zéro) : "01" à "31" • D - Jour de la semaine, en trois lettres (et en anglais) : par exemple "Fri" (pour Vendredi) • F - Mois, textuel, version longue; en anglais, i.e. "January" (pour Janvier) • g - Heure, au format 12h, sans les zéros initiaux i.e. "1" à "12" • G - Heure, au format 24h, sans les zéros initiaux i.e. "0" à "23" • h - Heure, au format 12h, "01" à "12" • H - heure, au format 24h, "00" à "23" • i - Minutes; "00" à "59" • I (i majuscule) - "1" si l’heure d’été est activée, "0" si l’heure d’hiver . • j - Jour du mois sans les zéros initiaux: "1" à "31" • l - (’L’ minuscule) - Jour de la semaine, textuel, version longue; en anglais, i.e. "Friday" (pour Vendredi) • L - Booléen pour savoir si l’année est bissextile ("1") ou pas ("0") • m - Mois; i.e. "01" à "12" • M - Mois, en trois lettres (et en anglais) : par exemple "Apr" (pour Avril) • n - Mois sans les zéros initiaux; i.e. "1" à "12" • r - Format de date RFC 822; i.e. "Thu, 21 Dec 2000 16:01:07 +0200" (ajouté en PHP 4.0.4) • s - Secondes; i.e. "00" à "59" • S - Suffixe ordinal d’un nombre, en anglais, sur deux lettres : i.e. "th", "nd" 264 Date/heure • t - Nombre de jours dans le mois donné, i.e. "28" à "31" • T - Fuseau horaire de la machine ; i.e. "MET" • U - Secondes depuis une époque • w - Jour de la semaine, numérique, i.e. "0" (Dimanche) to "6" (Samedi) • Y - Année, 4 chiffres; i.e. "1999" • y - Année, 2 chiffres; i.e. "99" • z - Jour de l’année; i.e. "0" à "365" • Z - Décalage horaire en secondes (i.e. "-43200" à "43200") Les caractères non reconnus seront imprimés tels quel. "Z" retournera toujours "0" lorsqu’il est utilisé avec gmdate(). Exemple 1. Exemple avec date() <?php print (date("l dS of F Y h:i:s A")); print ("July 1, 2000 is on a " . date("l", mktime(0,0,0,7,1,2000))); ?> Il est possible d’utiliser date() et mktime() ensemble pour générer des dates dans le futur ou dans le passé. Exemple 2. Exemples avec date() et mktime() <?php $tomorrow = mktime(0,0,0,date("m") ,date("d") + 1,date("Y") ); $lastmonth = mktime(0,0,0,date("m")-1,date("d") ,date("Y") ); $nextyear = mktime(0,0,0,date("m"), date("d") ,date("Y") + 1); ?> Voici maintenant quelques exemples de formatages avec date(). Notez que vous devriez échapper tous les autres caractères, car s’ils ont une signification spéciale, ils risquent de produire des effets secondaires indésirables. Notez aussi que les versions futures de PHP peuvent attribuer une signification à des lettres qui sont actuellement inertes. Lorsque vous échappez les caractères, pensez à utiiser des guillemets simples, pour que les séquences \n ne deviennent pas des nouvelles lignes. Exemple 3. Formatage avec date() <?php /* Aujourd’hui, le 12 Mars 2001, 10:16:18 pm */ $aujourdhui = date("F j, Y, g:i a"); // March 12, 2001, 10:16 pm $aujourdhui = date("m.d.y"); // 03.12.01 $aujourdhui = date("j, m, Y"); // 12, 3, 2001 $aujourdhui = date("Ymd"); // 20010312 $aujourdhui = date(’h-i-s, j-m-y, it is w Day z ’); // 05-16-17, 12-0301, 1631 1618 6 Monpm01 $aujourdhui = date(’\C\’\e\s\t\ \l\e\ jS \j\o\u\r\.’); // C’est le 12th jour. $aujourdhui = date("D M j G:i:s T Y"); // Mon Mar 12 15:16:08 MST 2001 $aujourdhui = date(’H:m:s \m \e\s\t\ \l\e\ \m\o\i\s’); // 17:03:18 m est le mois $aujourdhui = date("H:i:s"); // 10:16:18 // notation française $aujourdhui = date("d/m/y"); // 12/03/01 $aujourdhui = date("d/m/Y"); // 12/03/2001 ?> Pour formater des dates dans d’autres langues, utilisez les fonctions setlocale() et strftime(). Voir aussi gmdate() et mktime(). 265 Date/heure getdate (PHP 3, PHP 4 >= 4.0b1) Retourne la date/heure array getdate ([int timestamp]) getdate() retourne un tableau associatif contenant les informations de date et d’heure du timestamp timestamp (lorsqu’il est fourni), avec les champs suivants : • "seconds" - secondes • "minutes" - minutes • "hours" - heures • "mday" - jour du mois • "wday" - jour de la semaine, numérique. 0: dimanche jusqu’à 6: samedi • "mon" - mois, numérique • "year" - année, numérique • "yday" - jour de l’année, numérique; i.e. "299" • "weekday" - jour de la semaine, texte complet (en anglais); i.e. "Friday" • "month" - mois, texte complet (en anglais); i.e. "January" Exemple 1. Exemple avec getdate() <?php $aujourdhui = getdate(); $mois = $aujourdhui[’month’]; $mjour = $aujourdhui[’mday’]; $annee = $aujourdhui[’year’]; echo "$mjour/$mois/$annee"; ?> gettimeofday (PHP 3>= 3.0.7, PHP 4 >= 4.0b4) Retourne l’heure actuelle array gettimeofday (void) gettimeofday() est une interface vers gettimeofday(2). Elle retourne un tableau associatif qui contient les informations retournées par le système : • "sec" - secondes • "usec" - microsecondes • "minuteswest" - minutes de décalage par rapport à Greenwich, vers l’Ouest. • "dsttime" - type de correction dst 266 Date/heure gmdate (PHP 3, PHP 4 >= 4.0b1) Formate une date/heure GMT/CUT. string gmdate (string format [, int timestamp]) gmdate() est identique à la fonction date(), hormis le fait que le temps retourné est GMT (Greenwich Mean Time) Par exemple, en Finlande (GMT +0200), la première ligne ci-dessous affiche "Jan 01 1998 00:00:00", tandis que la seconde "Dec 31 1997 22:00:00". Exemple 1. Exemple avec gmdate() <?php echo date("M d Y H:i:s", mktime (0,0,0,1,1,1998)); echo gmdate("M d Y H:i:s", mktime (0,0,0,1,1,1998)); ?> Voir aussi date(), mktime() et gmmktime(). gmmktime (PHP 3, PHP 4 >= 4.0b1) Retourne le timestamp UNIX d’une date GMT. int gmmktime (int hour, int minute, int second, int month, int day, int year [, int is_dst]) Identique à mktime() hormis le fait que les paramètres passés sont GMT. gmstrftime (PHP 3>= 3.0.12, PHP 4 >= 4.0RC2) Formate une date/heure GMT/CUT en fonction des paramétrages locaux. string gmstrftime (string format [, int timestamp]) gmstrftime() se comporte exactement comme strftime() hormis le fait que l’heure utilisée est celle de Greenwich (Greenwich Mean Time (GMT)). Par exemple, dans la zone Eastern Standard Time (est des USA) (GMT -0500), la première ligne de l’exemple ci-dessous affiche "Dec 31 1998 20:00:00", tandis que la seconde affiche "Jan 01 1999 01:00:00". Exemple 1. Exemple avec gmstrftime() <?php setlocale(’LC_TIME’, ’en_US’); echo strftime("%b %d %Y %H:%M:%S", mktime (20,0,0,12,31,98))."\n"; echo gmstrftime("%b %d %Y %H:%M:%S", mktime (20,0,0,12,31,98))."\n"; ?> Voir aussi strftime(). 267 Date/heure localtime (PHP 4 >= 4.0RC2) Lit l’heure locale array localtime (int [timestamp], boolean [is_associative]) localtime() retourne un tableau identique à la structure retournée par la fonction C localtime. Le premier argument timestamp est un timestamp UNIX. S’il n’est pas fourni, l’heure courante est utilisée. Le second argument is_associative, s’il est mis à 0 ou ignoré, force localtime() à retourner un tableau à index numérique. S’il est mis à 1, localtime() retourne un tableau associatif, avec tous les éléments de la structure C, accessible avec les clés suivantes : • "tm_sec" - secondes • "tm_min" - minutes • "tm_hour" - heure • "tm_mday" - jour du mois • "tm_mon" - mois de l’année • "tm_year" - Année, incompatible an 2000 • "tm_wday" - Jour de la semaine • "tm_yday" - Jour de l’année • "tm_isdst" - Est-ce que l’heure d’hiver a pris effet? microtime (PHP 3, PHP 4 >= 4.0b1) Retourne le timestamp UNIX actuel avec microsecondes. string microtime (void) microtime() retourne la chaîne "msec sec" avec sec qui est mesurée en secondes depuis le début de l’époque UNIX, (1er janvier 1970 00:00:00 GMT), et msec qui est le nombre de microsecondes de cette heure. Cette fonction est seulement disponible sur les systèmes d’exploitation qui supportent la fonction système gettimeofday(). Les deux parties de la chaîne sont exprimées en secondes. Exemple 1. Exemple avec microtime() <?php function getmicrotime(){ list($usec, $sec) = explode(" ",microtime()); return ((float)$usec + (float)$sec); } $time_start = getmicrotime(); for ($i=0; $i < 1000; $i++){ //ne rien faire, pendant un millier de fois... } $time_end = getmicrotime(); $time = $time_end - $time_start; echo "Rien fait durant $time secondes"; ?> Voir aussi time(). 268 Date/heure mktime (PHP 3, PHP 4 >= 4.0b1) Retourne le timestamp UNIX d’une date. int mktime (int hour, int minute, int second, int month, int day, int year [, int is_dst]) ATTENTION : l’ordre des arguments est différent de celui de la commande UNIX habituelle mktime(), et fournit des résultats aléatoires si on oublie cet ordre. C’est une erreur très commune que de se tromper de sens. mktime() retourne un timestamp UNIX correspondant aux arguments fournis. Ce timestamp est un entier long, contenant le nombre de secondes entre le début de l’époque UNIX (1er Janvier 1970) et le temps spécifié. Les arguments peuvent être omis, de gauche à droite, et tous les arguments manquants sont utilisés avec la valeur courante de l’heure et du jour. is_dst peut être mis à 1 si l’heure d’hiver est appliquée, 0 si elle ne l’est pas, et -1 (par défaut) si on ne sait pas. Note : is_dst a été ajouté à partir de la version 3.0.10. mktime() est pratique pour faire des calculs de dates et des validations, car elle va automatiquement corriger les valeurs invalides. Par exemple, toutes les lignes suivantes vont retourner la même date : "Jan-01-1998". Exemple 1. Exemple mktime() <?php echo echo echo echo ?> date("M-d-Y", date("M-d-Y", date("M-d-Y", date("M-d-Y", mktime mktime mktime mktime (0,0,0,12,32,1997)); (0,0,0,13,1,1997)); (0,0,0,1,1,1998)); (0,0,0,1,1,98)); year peut prendre deux ou quatre chiffres, avec les valeurs entre 0-69 qui correspondent à 2000-2069 et 70-99 à 1970-1999 (sur les systèmes où time_t sont sur des entiers 32bit signés, comme cela se fait le plus souvent de nos jours, year est valide dans l’intervalle 1902 et 2037. Le dernier jour d’un mois peut être décrit comme le jour "0" du mois suivant, et non pas le jour -1. Les deux exemples suivants vont donner : "Le dernier jour de Février 2000 est: 29". Exemple 2. Dernier jour du mois <?php $lastday = mktime (0,0,0,3,0,2000); echo strftime ("Le dernier jour de Février 2000 est: %d", $lastday); $lastday = mktime (0,0,0,4,-31,2000); echo strftime ("Le dernier jour de Février 2000 est: %d", $lastday); ?> Voir aussi date() et time(). strftime (PHP 3, PHP 4 >= 4.0b1) Formate une date/heure locale avec les options locales. string strftime (string format, int [timestamp]) 269 Date/heure strftime() retourne la date sous la forme d’une chaîne formatée conformément au format format, en utilisant le timestamp timestamp donné. Si le timestamp est omis, la date actuelle est utilisée. Les mois et jours de la semaine, et toutes les chaînes dépendantes de la langue sont fixées avec la commande setlocale(). Les caractères suivants sont utilisés pour spécifier le format de la date : • %a - nom abrégé du jour de la semaine (local). • %A - nom complet du jour de la semaine (local). • %b - nom abrégé du mois (local). • %B - nom complet du mois (local). • %c - représentation préférée pour les dates et heures, en local. • %C - numéro de siècle (l’année, divisée par 100 et arrondie entre 00 et 99) • %d - jour du mois en numérique (intervalle 01 à 31) • %D - identique à %m/%d/%y • %e - numéro du jour du mois. Les chiffres sont précédés d’un espace (de ’ 1’ à ’31’) • %h - identique à %b • %H - heure de la journée en numérique, et sur 24-heures (intervalle de 00 à 23) • %I - heure de la journée en numérique, et sur 12- heures (intervalle 01 à 12) • %j - jour de l’année, en numérique (intervalle 001 à 366) • %m - mois en numérique (intervalle 1 à 12) • %M - minute en numérique • %n - newline character • %p - soit ‘am’ ou ‘pm’ en fonction de l’heure absolue, ou en fonction des valeurs enregistrées en local. • %r - l’heure au format a.m. et p.m. • %R - l’heure au format 24h • %S - secondes en numérique • %t - tabulation • %T - l’heure actuelle (égal à %H:%M:%S) • %u - le numéro de jour dans la semaine, de 1 à 7. (1 représente Lundi) • %U - numéro de semaine dans l’année, en considérant le premier dimanche de l’année comme le premier jour de la première semaine. • %V - le numéro de semaine comme défini dans l’ISO 8601:1988, sous forme décimale, de 01 à 53. La semaine 1 est la première semaine qui a plus de 4 jours dans l’année courante, et dont Lundi est le premier jour. • %W - numéro de semaine dans l’année, en considérant le premier lundi de l’année comme le premier jour de la première semaine • %w - jour de la semaine, numérique, avec Dimanche = 0 • %x - format préféré de représentation de la date sans l’heure • %X - format préféré de représentation de l’heure sans la date • %y - l’année, numérique, sur deux chiffres (de 00 à 99) • %Y - l’année, numérique, sur quatre chiffres • %Z - fuseau horaire, ou nom ou abréviation • %% - un caractère ‘%’ littéral Note : Tous les caractères suivants ne sont pas toujours supportés par toutes les librairies C. Dans ce cas, ils ne seront pas supportés par PHP non plus. 270 Date/heure Exemple 1. Exemple strftime() <?php setlocale ("LC_TIME", "C"); print(strftime("%A en Finlandais est ")); setlocale ("LC_TIME", "fi"); print(strftime("%A, en Français ")); setlocale ("LC_TIME", "fr"); print(strftime("%A est en Allemand ")); setlocale ("LC_TIME", "de"); print(strftime("%A.\n")); ?> Cet exemple ne fonctionnera que si vous avez les configurations respectives installées sur votre système. Voir aussi setlocale(), mktime() et le groupe de spécifications de strftime() (http://www.opengroup.org/onlinepubs/7908799/xsh/strftime.html). time (PHP 3, PHP 4 >= 4.0b1) Retourne le timestamp UNIX actuel. int time (void) time() retourne l’heure courante, mesurée en secondes depuis le début de l’époque UNIX, (1er janvier 1970 00:00:00 GMT). Voir aussi date(). strtotime (PHP 3>= 3.0.12, PHP 4 ) Transforme un texte anglais en timestamp int strtotime (string time [, int now]) strtotime() essaye de lire une date au format anglais dans la chaîne time, et de la transformer en timestamp UNIX. Exemple 1. Exemple avec strtotime() <?php // l’exemple n’est pas traduit, car cela ne fonctionne qu’en anglais echo strtotime("now") . "\n"; echo strtotime("10 September 2000") . "\n"; echo strtotime("+1 day") . "\n"; echo strtotime("+1 week") . "\n"; echo strtotime("+1 week 2 days 4 hours 2 seconds")."\n"; ?> 271 XVII. dBase Ces fonctions vous permettront d’accéder aux enregistrements d’une base au format dBase (.dbf). dBase ne permet pas l’utilisation d’index, de "memo fields", ni le blocage de la base. Deux processus de serveurs web différents modifiant le même fichier dBase risque de rendre votre base de données incohérente. Les fichiers dBase sont de simples fichiers séquentiels d’enregistrements de longueur fixe. Les enregistrements sont ajoutés à la fin du fichier et les enregistrements supprimés sont conservés jusqu’à l’appel de dbase_pack(). Nous vous recommandons de ne pas utiliser les fichiers dBase comme base de données de production. Choisissez n’importe quel serveur SQL à la place. MySQL et PostgresSQL sont des choix classiques avec PHP. Le support de dBase ne se justifie ici que pour vous permettre d’importer et d’exporter des données depuis et vers votre base des données issues du web, car ce format de fichier est communément accepté par les feuilles et organiseurs Windows. L’import et l’export de données est l’unique chose pour laquelle l’utilisation de dBase est recommandée. 272 dBase dbase_create (PHP 3, PHP 4 >= 4.0b1) Crée une base de données dBase. int dbase_create (string filename, array fields) fields est un tableau de tableaux. Chaque tableau décrit le format d’un fichier de la base. Chaque champs est constitué d’un nom, d’un caractère de type de champs, d’une longueur et d’une précision. Les types de champs disponibles sont : L Boolean (booléen). Pas de longueur ou de précision pour ces valeurs. M Memo. (Note importante : les Memos ne sont pas supportés par PHP.) Elles n’ont pas de longueur ou de précision. D Date (enregistrée au format ’YYYYMMDD’). Elles n’ont pas de longueur ou de précision. N Number (nombre). Possède une longueur et un précision (le nombre de chiffres après la virgule). C String (chaîne). Si la base de données a été créée, un identifiant de base dbase_identifier est retourné, sinon, FALSE est retourné. Exemple 1. Création d’une base dBase <?php // "database" name $dbname = "/tmp/test.dbf"; // database "definition" $def = array( array("date", "D"), array("name", "C", 50), array("age", "N", 3, 0), array("email", "C", 128), array("ismember", "L") ); // création if (!dbase_create($dbname, $def)) print "<strong>Error!</strong>"; ?> dbase_open (PHP 3, PHP 4 >= 4.0b1) Ouverture d’une base dBase. int dbase_open (string filename, int flags) flags est un flag, comme pour la fonction open(). (Typiquement; 0 signifie lecture seule, 1 signifie écriture seule, et 2 écriture/lecture). 273 dBase dbase_open() retourne un identifiant de base de données, ou FALSE si la base n’a pas pu être sélectionnée. dbase_close (PHP 3, PHP 4 >= 4.0b1) Ferme une base dBase. boolean dbase_close (resource dbase_identifier) dbase_close() ferme la base associée à dbase_identifier. dbase_pack (PHP 3, PHP 4 >= 4.0b1) Compacte une base dBase. boolean dbase_pack (resource dbase_identifier) dbase_pack() compacte la base de données dbase_identifier (effacement définitif de tous les enregistrements marqués pour l’effacement, avec la fonction dbase_delete_record()). dbase_add_record (PHP 3, PHP 4 >= 4.0b1) Ajoute un enregistrement dans une base dBase. boolean dbase_add_record (resource dbase_identifier, array record) dbase_add_record() ajoute les données de record dans la base spécifiée par dbase_identifier. Si le nombre de colonnes fourni n’est pas celui du nombre de champs dans la base, l’opération échouera, et FALSE sera retourné. dbase_replace_record (PHP 3>= 3.0.11, PHP 4 >= 4.0b1) Remplace un enregistrement dans une base dBase. boolean dbase_replace_record (resource dbase_identifier, array record, int dbase_record_number) dbase_replace_record() remplace les données associées à l’enregistrement record_number par les données enregistrées dans record. Si le nombre de colonnes fourni n’est pas celui du nombre de champs dans la base, l’opération échouera, et FALSE sera retourné. dbase_record_number est un entier qui peut aller de 1 jusqu’au nombre maximal d’enregistrement de la base (retourné par dbase_numrecords()). dbase_delete_record (PHP 3, PHP 4 >= 4.0b1) Efface un enregistrement dans une base dBase. boolean dbase_delete_record (resource dbase_identifier, int record) 274 dBase dbase_delete_record() marque l’enregistrement record pour l’effacement, dans la base dbase_identifier. Pour effacer réellement l’enregistrement, il faut utiliser aussi dbase_pack(). dbase_get_record (PHP 3, PHP 4 >= 4.0b1) Lit un enregistrement dans une base dBase. array dbase_get_record (resource dbase_identifier, int record) dbase_get_record() retourne les données de l’enregistrement record dans un tableau. Le tableau est indexé à partir de 0, et inclus un membre nommé ’deleted’ (effacé), qui sera mis à 1 si l’enregistrement a été marqué pour l’effacement (voir dbase_delete_record()). Chaque champs est converti au format approprié PHP. (Les dates sont laissées au format chaîne). dbase_get_record_with_names (PHP 3>= 3.0.4, PHP 4 >= 4.0b1) Lit un enregistrement dans une base, sous la forme d’un tableau associatif. array dbase_get_record_with_names (resource dbase_identifier, int record) dbase_identifier retourne les données de l’enregistrement record dans un tableau associatif. Le tableau inclus un membre nommé ’deleted’ (effacé), qui sera mis à 1 si l’enregistrement a été marqué pour l’effacement (voir dbase_delete_record()). Chaque champs est converti au format approprié PHP. (Les dates sont laissées au format chaîne). dbase_numfields (PHP 3, PHP 4 >= 4.0b1) Compte le nombre de champs d’une base dBase. int dbase_numfields (resource dbase_identifier) dbase_numfields() retourne le nombre de champs (colonnes) de la base de données dbase_identifier. Les numéros de champs sont numérotés de 0 à dbase_numfields($db)-1, tandis que les numéros d’enregistrements sont numérotés de 1 à dbase_numrecords($db). Exemple 1. Utiliser dbase_numfields() <?php $rec = dbase_get_record($db, $recno); $nf = dbase_numfields($db); for ($i=0; $i < $nf; $i++) { print $rec[$i]."<br>\n"; } ?> 275 dBase dbase_numrecords (PHP 3, PHP 4 >= 4.0b1) Compter le nombre d’enregistrements dans une base dBase. int dbase_numrecords (resource dbase_identifier) dbase_numrecords() retourne le nombre d’enregistrements (lignes) dans la base dbase_identifier. Les numéros de champs sont numérotés de 0 à dbase_numfields($db)-1, tandis que les numéros d’enregistrements sont numérotés de 1 à dbase_numrecords($db). 276 XVIII. DBM Ces fonctions vous permettent d’écrire des lignes dans une base de données de type dbm. Ce type de base (supporté par Berkeley db, gdbm, et quelques librairies systèmes, ou certaines librairies du système d’exploitation) enregistre les paires clés/valeurs, (contrairement aux enregistrements par ligne, utilisé par les autres bases de données relationnelles). Exemple 1. Présentation de dbm <?php $dbm = dbmopen("dernier", "w"); if (dbmexists($dbm, $userid)) { $last_seen = dbmfetch($dbm, $userid); } else { dbminsert($dbm, $userid, time()); } faire_quelquechose(); dbmreplace($dbm, $userid, time()); dbmclose($dbm); ?> 277 DBM dbmopen (PHP 3, PHP 4 >= 4.0b1) Ouvre une base de données dbm resource dbmopen (string filename, string flags) Le premier argument est le chemin absolu jusqu’au fichier dbm à ouvrir. Le deuxième argument est le mode d’ouverture du fichier, qui peut prendre les valeurs suivantes : "r", "n", "c" ou "w" qui représentent respectivement lecture seule, nouveau (ce qui implique lecture/écriture, et qui, probablement, va écraser une base existante), création(ce qui implique lecture/écriture, et qui, probablement, va écraser une base existante), et lecture/écriture. dbmopen() retourne un identifiant, qui sera passé à toutes les autres fonctions dbm, en cas de succès, ou FALSE en cas d’échec. Si ndbm est utilisé, ndbm va créer les fichiers filename.dir et filename.pag. gdbm n’utilise qu’un fichier, tout comme les librairies internes, et Berkeley db crée le fichier filename.db. Notez que PHP dispose de son propre système de verrouillage des fichiers, qui s’additionne à celui éventuellement utilisé par les librairies. PHP n’efface jamais les fichiers .lck qu’il crée. Il les utilise comme inode fixe, sur lequel faire le verrouillage. Pour plus d’informations sur les fichiers dbm, reportez-vous à vos pages de manuel Unix (man) , ou bien chargez gdbm : ftp://prep.ai.mit.edu/pub/gnu. dbmclose (PHP 3, PHP 4 >= 4.0b1) Ferme une base de données dbm. boolean dbmclose (resource dbm_identifier) dbmclose() déverrouille et ferme la base de données dbm_identifier. dbmexists (PHP 3, PHP 4 >= 4.0b1) Indique si une valeur existe. boolean dbmexists (resource dbm_identifier, string key) dbmexists() retourne TRUE s’il y a une valeur associée à la clé key. dbmfetch (PHP 3, PHP 4 >= 4.0b1) Lit une valeur. string dbmfetch (resource dbm_identifier, string key) dbmfetch() retourne la valeur associée à la clé key. dbminsert (PHP 3, PHP 4 >= 4.0b1) Insère une valeur. int dbminsert (resource dbm_identifier, string key, string value) dbminsert() ajoute la valeur value dans la base de données, avec la clé key. 278 DBM dbminsert() retourne -1 si la base a été ouverte en mode lecture seule, 0 si l’insertion a été réussie, et 1 si la clé key existe déjà. (Pour remplacer la valeur, utilisez dbmreplace().) dbmreplace (PHP 3, PHP 4 >= 4.0b1) Remplace une valeur. boolean dbmreplace (resource dbm_identifier, string key, string value) dbmreplace() remplace la valeur courante par la valeur value pour la clé key, dans une base dbm_identifier. dbmreplace() crée la clé, si elle n’existe pas dans la base. dbmdelete (PHP 3, PHP 4 >= 4.0b1) Efface une valeur. boolean dbmdelete (resource dbm_identifier, string key) dbmdelete() efface la valeur de la clé key, dans la base dbm_identifier. dbmdelete() retourne FALSE si la clé n’existe pas dans cette base. dbmfirstkey (PHP 3, PHP 4 >= 4.0b1) Lit la première clé. string dbmfirstkey (resource dbm_identifier) dbmfirstkey() retourne la première clé de la base de données. Notez bien que les clés ne sont pas dans un ordre défini, étant donné que la table est construite comme un tableau associatif. dbmnextkey (PHP 3, PHP 4 >= 4.0b1) Lit la clé suivante. string dbmnextkey (resource dbm_identifier, string key) dbmnextkey() retourne la clé après la clé key. En appelant dbmfirstkey(), puis successivement dbmnextkey(), il est possible de passer en revue toute les paires clé/valeur de la base de données dbm. Par exemple : Exemple 1. Passer en revue une base de données. <?php $cle = dbmfirstkey($dbm_id); while ($cle){ echo "$cle = " . dbmfetch($dbm_id, $cle) . "\n"; $cle = dbmnextkey($dbm_id, $cle); } ?> 279 DBM dblist (PHP 3, PHP 4 >= 4.0b1) Décrit la librairie dbm utilisée. string dblist (void) 280 XIX. dbx Avertissement Ce module est EXPERIMENTAL. Cela signifie que le comportement de ces fonctions, leurs noms et concrètement, TOUT ce qui est documenté ici peut changer dans un futur proche, SANS PREAVIS! Soyez-en conscient, et utiliser ce module à vos risques et périls. Le module dbx est un module d’abstraction de base de données (db pour database (base de données) et ’X’ pour toutes les bases supportées). Les fonctions dbx vous permettent d’accéder à toutes les bases supportées, avec la même convention. Pour cela il vous faut avoir ces fonctions compilées avec PHP (option de configuration --enable-dbx et toutes les bases que vous souhaitez utiliser. Par exemple, si vous voulez accéder à MySQL depuis dbx, vous devez aussi configurer PHP avec --with-mysql. Les fonctions dbx n’interface pas directement les bases de données, mais utilise les modules de support de ces bases. Pour pouvoir utiliser une base avec le module dbx, il vous faut l’avoir configuré avec PHP, ou bien la charger dynamiquement. Actuellement les bases MySQL, PostgreSQL et ODBC sont supportées, mais d’autres suivront bientôt (j’espère). La documentation complémentaire (ajout de nouvelles bases à dbx) est accessible à http://www.guidance.nl/php/dbx/doc/. 281 dbx dbx_close (PHP 4 >= 4.0.6) Ferme une connexion à une base boolean dbx_close (resource link_identifier) Avertissement Ce module est EXPERIMENTAL. Cela signifie que le comportement de ces fonctions, leurs noms et concrètement, TOUT ce qui est documenté ici peut changer dans un futur proche, SANS PREAVIS! Soyez-en conscient, et utiliser ce module à vos risques et périls. dbx_close() retourne TRUE en cas de succès, et FALSE en cas d’erreur. Exemple 1. Exemple avec dbx_close() <?php $link = dbx_connect("mysql", "localhost", "base", "utilisateur", "mot de passe") or die ("Impossible de se connecter"); print("Connexion réussie"); dbx_close($link); ?> Note : Reportez vous aussi à documentation de la base de données que vous utilisez. Voir aussi dbx_connect(). dbx_connect (PHP 4 >= 4.0.6) Ouvre une connexion à une base de données resource dbx_connect (string module, string host, string database, string username, string password [, int persistent]) Avertissement Ce module est EXPERIMENTAL. Cela signifie que le comportement de ces fonctions, leurs noms et concrètement, TOUT ce qui est documenté ici peut changer dans un futur proche, SANS PREAVIS! Soyez-en conscient, et utiliser ce module à vos risques et périls. dbx_connect() retourne une resource dbx_link_object en cas de succès, FALSE sinon. Si la connexion a put être établie, mais que la base de données n’a pas pu être selectionnée, la fonction retournera quand même une ressource. Le paramètre persistent peut prendre la valeur DBX_PERSISTENT, pour créer une connexion persitante. Les valeurs possibles de module sont les suivantes (n’oubliez pas que cela fonctionnera que si le module associé est chargé): • module 1: "mysql" • module 2: "odbc" • module 3: "pgsql" Le support de pgsql est au stade expérimental, et vous devez compiler vous-même le module pgsql après avoir modifié un des fichiers sources. Sinon, vous aurez une alerte affichée à chaque requête. 282 dbx La ressource dbx_link_object a trois membres : ’handle’, ’module’ et ’database’. Le membre ’database’ contient le nom de la base de données actuellement selectionnée. Le membre ’module’ est à usage interne à dbx, et contient le numéro de module sus-cité. Le membre ’handle’ est une resource valide de connexion à la base de données, et peut être utilisé en tant que tel dans les autres fonctions spécifiques à cette base de données. <?php $link = dbx_connect("mysql", "localhost", "base de données", "utilisateur", "mot de passe"); mysql_close($link->handle); // dbx_close($link) est beaucoup plus adapté ici ?> Les paramètres host, database, username et password sont attendus, mais ne sont pas toujours utiles, suivant la fonction de connexion de la base de données utilisée. Exemple 1. Exemple avec dbx_connect() <?php $link = dbx_connect("odbc", "", "base de données", "utilisateur", "mot de passe", DBX_PERSISTENT) or die ("Impossible de se connecter"); print ("Connexion réussie"); dbx_close($link); ?> Note : Reportez vous aussi à documentation de la base de données que vous utilisez. Voir aussi dbx_close(). dbx_error (PHP 4 >= 4.0.6) Rapporte le message d’erreur du dernier appel de fonction string dbx_error (resource link_identifier) Avertissement Ce module est EXPERIMENTAL. Cela signifie que le comportement de ces fonctions, leurs noms et concrètement, TOUT ce qui est documenté ici peut changer dans un futur proche, SANS PREAVIS! Soyez-en conscient, et utiliser ce module à vos risques et périls. dbx_error() retourne une chaîne contenant le message d’erreur du module sélectionné. S’il y a des connexions multiples sur le même module, seule la dernière erreur est fournie. S’il a des des connexions sur différents modules, la dernière erreur du module est retourné (le module est alors représenté par link_identifier). Notez que le module ODBC ne supporte pas encore cette fonction. Exemple 1. Exemple avec dbx_error() <?php $link = dbx_connect("mysql", "localhost", "base de données", "utilisateur", "mot de passe") or die ("Impossible de se connecter"); $result = dbx_query($link, "select id from nonexistingtbl"); if ($result==0) { echo dbx_error($link); 283 dbx } dbx_close($link); ?> Note : Reportez vous aussi à documentation de la base de données que vous utilisez. dbx_query (PHP 4 >= 4.0.6) Envoie une requête et lit tous les résultats resource dbx_query (resource link_identifier, string sql_statement [, long flags]) Avertissement Ce module est EXPERIMENTAL. Cela signifie que le comportement de ces fonctions, leurs noms et concrètement, TOUT ce qui est documenté ici peut changer dans un futur proche, SANS PREAVIS! Soyez-en conscient, et utiliser ce module à vos risques et périls. dbx_query() retourne une resource dbx_result_object ou 1 en cas de succès (un objet de résultat ne sera retourné que pour les requêtes SQL qui retournent un résultat), ou 0 en cas d’erreur. Le paramètre flags sert à contrôler la quantité d’informations retournée. Il peut être n’importe quelle combinaisons par OR des constantes : DBX_RESULT_INFO, DBX_RESULT_INDEX, DBX_RESULT_ASSOC. DBX_RESULT_INFO fournit des informations sur les colonnes, comme les noms des champs et leur type. DBX_RESULT_INDEX retourne le résultat dans un tableau indexé (par exemple, data[2][3], où 2 est le numéro de ligne et 3 est le numéro de colonne), dont la première colonne est indexée à 0. DBX_RESULT_ASSOC associe les noms de colonnes avec leurs indices. Notez que DBX_RESULT_INDEX est toujours retourné, indépendamment de la valeur de flags. Si DBX_RESULT_ASSOC est spécifié, DBX_RESULT_INFO est aussi retourné, même s’il n’a pas été spécifié. Ce qui signifie que les seules combinaisons envisageables sont DBX_RESULT_INDEX, DBX_RESULT_INDEX | DBX_RESULT_INFO et DBX_RESULT_INDEX | DBX_RESULT_INFO | DBX_RESULT_ASSOC. La dernière combinaison est la valeur par défaut de flags. Les résultats associés sont en fait des références, ce qui fait que modifier data[0][0], revient à modifier data[0][’fieldnameforfirstcolumn’]. Un objet dbx_result_object a 5 membres (éventuellement 4, suivants les valeurs de flags) : ’handle’, ’cols’, ’rows’, ’info’ (optionnel) et ’data’. Handle est un identifiant de résultat, qui peut être utilisé avec les fonctions spécifiques à son module. Par exemple : <?php $result = dbx_query($link, "SELECT id FROM tbl"); mysql_field_len($result->handle, 0); ?> Les membres cols et rows contiennent les numéros de colonne et de champs. <?php $result = dbx_query($link, "SELECT id FROM tbl"); echo "Taille du résultat: " . $result->rows . " x " . $result->cols . "<br>\n"; ?> Le membre info n’est retourné que si DBX_RESULT_INFO et/ou DBX_RESULT_ASSOC sont spécifié dans le paramètre flags. C’est un deuxième tableau, qui possède deux lignes ("name" and "type"), pour connaître les informations sur les colonnes. 284 dbx <?php $result = dbx_query($link, "SELECT id FROM tbl"); echo "Nom de la colonne : " . $result->info["name"][0] . "<br>\n"; echo "Type de la colonne: " . $result->info["type"][0] . "<br>\n"; ?> Le membre data contient les données effectivement lues, éventuellement associées à des noms de colonnes. Si DBX_RESULT_ASSOC est utilisé, il est possible d’utiliser $result->data[2]["fieldname"]. Exemple 1. Exemple avec dbx_query() <?php $link = dbx_connect("odbc", "", "base de données", "utilisateur", "mot de passe") or die ("Impossible de se connecter"); $result = dbx_query($link, "SELECT id, parentid, description FROM tbl"); if ($result==0) echo "La requête a échoué\n<br>"; elseif ($result==1) { echo "La requête a réussie\n<br>"; } else { $rows=$result->rows; $cols=$result->cols; echo "<p>table dimension: {$result->rows} x {$result->cols}<br><table border=1>\n"; echo "<tr>"; for ($col=0; $col<$cols; ++$col) { echo "<td>-{$result->info["name"][$col]}-<br>-{$result->info["type"][$col]}-</td>"; } echo "</tr>\n"; for ($row=0; $row<$rows; ++$row){ echo "<tr>"; for ($col=0; $col<$cols; ++$col) { echo "<td>-{$result->data[$row][$col]}-</td>"; } echo "</tr>\n"; } echo "</table><p>\n"; echo "table dimension: {$result>rows} x id, parentid, description<br><table border=1>\n"; for ($row=0; $row<$rows; ++$row) { echo "<tr>"; echo "<td>-{$result->data[$row]["id"]}-</td>"; echo "<td>-{$result->data[$row]["parentid"]}-</td>"; echo "<td>-{$result->data[$row]["description"]}-</td>"; echo "</tr>\n"; } echo "</table><p>\n"; } dbx_close($link); ?> Note : Reportez vous aussi à documentation de la base de données que vous utilisez. Voir aussi dbx_connect(). 285 dbx dbx_sort (PHP 4 >= 4.0.6) Tri un résultat avec une fonction utilisateur boolean dbx_sort (dbx_result_object result, string user_compare_function) Avertissement Ce module est EXPERIMENTAL. Cela signifie que le comportement de ces fonctions, leurs noms et concrètement, TOUT ce qui est documenté ici peut changer dans un futur proche, SANS PREAVIS! Soyez-en conscient, et utiliser ce module à vos risques et périls. dbx_sort() retourne TRUE en cas de succès, et FALSE sinon. Exemple 1. Exemple avec dbx_sort() <?php function user_re_order ($a, $b) { $rv = dbx_cmp_asc($a, $b, "parentid"); if (!$rv) $rv = dbx_cmp_asc($a, $b, "id"); return $rv; } $link = dbx_connect("odbc", "", "base de données", "utilisateur", "mot de passe") or die ("Impossible de se connecter"); $result = dbx_query($link, "SELECT id, parentid, description FROM tbl ORDER BY id"); echo "Les données sont maintenant triées par id<br>"; dbx_query($result, "user_re_order"); echo "Les données sont maintenant triées par parentid, puis par id<br>"; dbx_close($link); ?> Voir aussi dbx_cmp_asc() et dbx_cmp_desc(). dbx_cmp_asc (PHP 4 4.0.6 only) Compare deux lignes pour tri croissant int dbx_cmp_asc (array row_a, array row_b, string columnname_or_index) Avertissement Ce module est EXPERIMENTAL. Cela signifie que le comportement de ces fonctions, leurs noms et concrètement, TOUT ce qui est documenté ici peut changer dans un futur proche, SANS PREAVIS! Soyez-en conscient, et utiliser ce module à vos risques et périls. dbx_cmp_asc() retourne 0 si row_a[$columnname_or_index] est égal à row_b[$columnname_or_index], 1 si elle est plus grande et -1 si elle est plus petite. Exemple 1. Exemple avec dbx_cmp_asc() <?php function user_re_order($a, $b) { $rv = dbx_cmp_asc($a, $b, "parentid"); if (!$rv) { $rv = dbx_cmp_asc($a, $b, "id"); return $rv; } } 286 dbx $link = dbx_connect("odbc", "", "base de données", "utilisateur", "mot de passe") or die ("Impossible de se connecter"); $result = dbx_query($link, "SELECT id, parentid, description FROM tbl ORDER BY id"); echo "Les données sont maintenant triées par id<br>"; dbx_query($result, "user_re_order"); echo "Les données sont maintenant triées par parentid, puis par id<br>"; dbx_close($link); ?> Voir aussi dbx_sort() et dbx_cmp_desc(). dbx_cmp_desc (PHP 4 4.0.6 only) Compare deux lignes pour tri décroissant int dbx_cmp_desc (array row_a, array row_b, string columnname_or_index) dbx_cmp_desc() retourne 0 si row_a[$columnname_or_index] est égal à row_b[$columnname_or_index], 1 si elle est plus grande et -1 si elle est plus petite. Exemple 1. Exemple avec dbx_cmp_desc() <?php function user_re_order ($a, $b) { $rv = dbx_cmp_asc($a, $b, "parentid"); if (!$rv) { $rv = dbx_cmp_asc($a, $b, "id"); return $rv; } } $link = dbx_connect("odbc", "", "base de données", "utilisateur", "mot de passe") or die ("Impossible de se connecter"); $result = dbx_query($link, "SELECT id, parentid, description FROM tbl ORDER BY id"); echo "Les données sont maintenant triées par id<br>"; dbx_query($result, "user_re_order"); echo "Les données sont maintenant triées par parentid, puis par id<br>"; dbx_close($link); ?> Voir aussi dbx_sort() et dbx_cmp_asc(). 287 XX. DB++ functions Avertissement Ce module est EXPERIMENTAL. Cela signifie que le comportement de ces fonctions, leurs noms et concrètement, TOUT ce qui est documenté ici peut changer dans un futur proche, SANS PREAVIS! Soyez-en conscient, et utiliser ce module à vos risques et périls. Experimental support for db++ database This paper describes the the db++ extension which enables PHP to access db++ relation files through all of the search and update methods available in the client/server "C" library interface of db++ and to read and process the output of a db++ query. Requirenments ??? Download where Installation Creation and installation of this extension requires the db++ client libraries and header files to be installed on your system as described above. You have to run configure with option --with-dbplus to build this extension. configure looks for the client libraries and header files under the default path/usr/dbplus/. If you have installed db++ in a different place you have add the installation path to the configure option like this: --with-dbplus=/your/installation/path. 288 dbplus_add (unknown) Add a tuple to a relation int dbplus_add (int relation, array tuple) Avertissement Cette fonction est EXPERIMENTALE. Cela signifie que le comportement de ces fonctions, leurs noms et concrètement, TOUT ce qui est documenté ici peut changer dans un futur proche, SANS PREAVIS! Soyez-en conscient, et utiliser ce module à vos risques et périls. dbplus_aql (unknown) Perform AQL query int dbplus_aql (string query [, string server [, string dbpath]]) Avertissement Cette fonction est EXPERIMENTALE. Cela signifie que le comportement de ces fonctions, leurs noms et concrètement, TOUT ce qui est documenté ici peut changer dans un futur proche, SANS PREAVIS! Soyez-en conscient, et utiliser ce module à vos risques et périls. dbplus_chdir (unknown) Get/Set database virtual current directory string dbplus_chdir ([string newdir]) Avertissement Cette fonction est EXPERIMENTALE. Cela signifie que le comportement de ces fonctions, leurs noms et concrètement, TOUT ce qui est documenté ici peut changer dans un futur proche, SANS PREAVIS! Soyez-en conscient, et utiliser ce module à vos risques et périls. dbplus_close (unknown) Close a relation int dbplus_close (int relation) Avertissement Cette fonction est EXPERIMENTALE. Cela signifie que le comportement de ces fonctions, leurs noms et concrètement, TOUT ce qui est documenté ici peut changer dans un futur proche, SANS PREAVIS! Soyez-en conscient, et utiliser ce module à vos risques et périls. 289 dbplus_curr (unknown) Get current tuple from relation int dbplus_curr (int relation, array tuple) Avertissement Cette fonction est EXPERIMENTALE. Cela signifie que le comportement de ces fonctions, leurs noms et concrètement, TOUT ce qui est documenté ici peut changer dans un futur proche, SANS PREAVIS! Soyez-en conscient, et utiliser ce module à vos risques et périls. dbplus_errcode (unknown) Get error string for given errorcode or last error string dbplus_errcode (int err) Avertissement Cette fonction est EXPERIMENTALE. Cela signifie que le comportement de ces fonctions, leurs noms et concrètement, TOUT ce qui est documenté ici peut changer dans un futur proche, SANS PREAVIS! Soyez-en conscient, et utiliser ce module à vos risques et périls. dbplus_first (unknown) Get first tuple from relation int dbplus_first (int relation, array tuple) Avertissement Cette fonction est EXPERIMENTALE. Cela signifie que le comportement de ces fonctions, leurs noms et concrètement, TOUT ce qui est documenté ici peut changer dans un futur proche, SANS PREAVIS! Soyez-en conscient, et utiliser ce module à vos risques et périls. dbplus_flush (unknown) ??? int dbplus_flush (int relation) Avertissement Cette fonction est EXPERIMENTALE. Cela signifie que le comportement de ces fonctions, leurs noms et concrètement, TOUT ce qui est documenté ici peut changer dans un futur proche, SANS PREAVIS! Soyez-en conscient, et utiliser ce module à vos risques et périls. 290 dbplus_freealllocks (unknown) Free all locks held by this client int dbplus_freealllocks () Avertissement Cette fonction est EXPERIMENTALE. Cela signifie que le comportement de ces fonctions, leurs noms et concrètement, TOUT ce qui est documenté ici peut changer dans un futur proche, SANS PREAVIS! Soyez-en conscient, et utiliser ce module à vos risques et périls. dbplus_freerlocks (unknown) Free all locks on given relation int dbplus_freerlocks (int relation) Avertissement Cette fonction est EXPERIMENTALE. Cela signifie que le comportement de ces fonctions, leurs noms et concrètement, TOUT ce qui est documenté ici peut changer dans un futur proche, SANS PREAVIS! Soyez-en conscient, et utiliser ce module à vos risques et périls. dbplus_info (unknown) ??? int dbplus_info (int relation, string key, array ) Avertissement Cette fonction est EXPERIMENTALE. Cela signifie que le comportement de ces fonctions, leurs noms et concrètement, TOUT ce qui est documenté ici peut changer dans un futur proche, SANS PREAVIS! Soyez-en conscient, et utiliser ce module à vos risques et périls. dbplus_last (unknown) Get last tuple from relation int dbplus_last (int relation, array tuple) Avertissement Cette fonction est EXPERIMENTALE. Cela signifie que le comportement de ces fonctions, leurs noms et concrètement, TOUT ce qui est documenté ici peut changer dans un futur proche, SANS PREAVIS! Soyez-en conscient, et utiliser ce module à vos risques et périls. 291 dbplus_lockrel (unknown) Request read-lock on relation int dbplus_lockrel (int relation) Avertissement Cette fonction est EXPERIMENTALE. Cela signifie que le comportement de ces fonctions, leurs noms et concrètement, TOUT ce qui est documenté ici peut changer dans un futur proche, SANS PREAVIS! Soyez-en conscient, et utiliser ce module à vos risques et périls. dbplus_next (unknown) Get next tuple from relation int dbplus_next (int relation, array ) Avertissement Cette fonction est EXPERIMENTALE. Cela signifie que le comportement de ces fonctions, leurs noms et concrètement, TOUT ce qui est documenté ici peut changer dans un futur proche, SANS PREAVIS! Soyez-en conscient, et utiliser ce module à vos risques et périls. dbplus_open (unknown) Open relation file int dbplus_open (string name) Avertissement Cette fonction est EXPERIMENTALE. Cela signifie que le comportement de ces fonctions, leurs noms et concrètement, TOUT ce qui est documenté ici peut changer dans un futur proche, SANS PREAVIS! Soyez-en conscient, et utiliser ce module à vos risques et périls. The relation file name will be opened. name can be either a file name or a relative or absolute path name. This will be mapped in any case to an absolute relation file path on a specific host machine and server. On success a relation file handle (cursor) is returned which must be used in any subsequent commanads referencing the relation. dbplus_prev (unknown) Get previous tuple from relation int dbplus_prev (int relation, array tuple) 292 Avertissement Cette fonction est EXPERIMENTALE. Cela signifie que le comportement de ces fonctions, leurs noms et concrètement, TOUT ce qui est documenté ici peut changer dans un futur proche, SANS PREAVIS! Soyez-en conscient, et utiliser ce module à vos risques et périls. dbplus_restorepos (unknown) ??? int dbplus_restorepos (int relation, array tuple) Avertissement Cette fonction est EXPERIMENTALE. Cela signifie que le comportement de ces fonctions, leurs noms et concrètement, TOUT ce qui est documenté ici peut changer dans un futur proche, SANS PREAVIS! Soyez-en conscient, et utiliser ce module à vos risques et périls. dbplus_ropen (unknown) Open relation file ... ??? int dbplus_ropen (string name) Avertissement Cette fonction est EXPERIMENTALE. Cela signifie que le comportement de ces fonctions, leurs noms et concrètement, TOUT ce qui est documenté ici peut changer dans un futur proche, SANS PREAVIS! Soyez-en conscient, et utiliser ce module à vos risques et périls. dbplus_runlink (unknown) Remove relation from filesystem int dbplus_runlink (int relation) Avertissement Cette fonction est EXPERIMENTALE. Cela signifie que le comportement de ces fonctions, leurs noms et concrètement, TOUT ce qui est documenté ici peut changer dans un futur proche, SANS PREAVIS! Soyez-en conscient, et utiliser ce module à vos risques et périls. dbplus_rzap (unknown) Remove all tuples from relation int dbplus_rzap (int relation, int truncate) 293 Avertissement Cette fonction est EXPERIMENTALE. Cela signifie que le comportement de ces fonctions, leurs noms et concrètement, TOUT ce qui est documenté ici peut changer dans un futur proche, SANS PREAVIS! Soyez-en conscient, et utiliser ce module à vos risques et périls. dbplus_savepos (unknown) ??? int dbplus_savepos (int relation) Avertissement Cette fonction est EXPERIMENTALE. Cela signifie que le comportement de ces fonctions, leurs noms et concrètement, TOUT ce qui est documenté ici peut changer dans un futur proche, SANS PREAVIS! Soyez-en conscient, et utiliser ce module à vos risques et périls. dbplus_setindex (unknown) ??? int dbplus_setindex (int relation, string idx_name) Avertissement Cette fonction est EXPERIMENTALE. Cela signifie que le comportement de ces fonctions, leurs noms et concrètement, TOUT ce qui est documenté ici peut changer dans un futur proche, SANS PREAVIS! Soyez-en conscient, et utiliser ce module à vos risques et périls. dbplus_setindexbynumber (unknown) ??? int dbplus_setindexbynumber (int relation, int idx_number) Avertissement Cette fonction est EXPERIMENTALE. Cela signifie que le comportement de ces fonctions, leurs noms et concrètement, TOUT ce qui est documenté ici peut changer dans un futur proche, SANS PREAVIS! Soyez-en conscient, et utiliser ce module à vos risques et périls. dbplus_sql (unknown) Perform SQL query int dbplus_sql (string query, string server, string dbpath) 294 Avertissement Cette fonction est EXPERIMENTALE. Cela signifie que le comportement de ces fonctions, leurs noms et concrètement, TOUT ce qui est documenté ici peut changer dans un futur proche, SANS PREAVIS! Soyez-en conscient, et utiliser ce module à vos risques et périls. dbplus_tremove (unknown) Remove tuple and return new current tuple int dbplus_tremove (int relation, array old [, array current]) Avertissement Cette fonction est EXPERIMENTALE. Cela signifie que le comportement de ces fonctions, leurs noms et concrètement, TOUT ce qui est documenté ici peut changer dans un futur proche, SANS PREAVIS! Soyez-en conscient, et utiliser ce module à vos risques et périls. dbplus_undo (unknown) ??? int dbplus_undo (int relation) Avertissement Cette fonction est EXPERIMENTALE. Cela signifie que le comportement de ces fonctions, leurs noms et concrètement, TOUT ce qui est documenté ici peut changer dans un futur proche, SANS PREAVIS! Soyez-en conscient, et utiliser ce module à vos risques et périls. dbplus_undoprepare (unknown) ??? int dbplus_undoprepare (int relation) Avertissement Cette fonction est EXPERIMENTALE. Cela signifie que le comportement de ces fonctions, leurs noms et concrètement, TOUT ce qui est documenté ici peut changer dans un futur proche, SANS PREAVIS! Soyez-en conscient, et utiliser ce module à vos risques et périls. dbplus_unlockrel (unknown) Give up read-lock on relation int dbplus_unlockrel (int relation) 295 Avertissement Cette fonction est EXPERIMENTALE. Cela signifie que le comportement de ces fonctions, leurs noms et concrètement, TOUT ce qui est documenté ici peut changer dans un futur proche, SANS PREAVIS! Soyez-en conscient, et utiliser ce module à vos risques et périls. dbplus_unselect (unknown) ??? int dbplus_unselect (int relation) Avertissement Cette fonction est EXPERIMENTALE. Cela signifie que le comportement de ces fonctions, leurs noms et concrètement, TOUT ce qui est documenté ici peut changer dans un futur proche, SANS PREAVIS! Soyez-en conscient, et utiliser ce module à vos risques et périls. dbplus_update (unknown) Update specified tuple in relation int dbplus_update (int relation, array old, array new) Avertissement Cette fonction est EXPERIMENTALE. Cela signifie que le comportement de ces fonctions, leurs noms et concrètement, TOUT ce qui est documenté ici peut changer dans un futur proche, SANS PREAVIS! Soyez-en conscient, et utiliser ce module à vos risques et périls. dbplus_xlockrel (unknown) Request exclusive write lock on relation int dbplus_xlockrel (int relation) Avertissement Cette fonction est EXPERIMENTALE. Cela signifie que le comportement de ces fonctions, leurs noms et concrètement, TOUT ce qui est documenté ici peut changer dans un futur proche, SANS PREAVIS! Soyez-en conscient, et utiliser ce module à vos risques et périls. dbplus_xunlockrel (unknown) Free exclusive write lock on relation int dbplus_xunlockrel (int relation) 296 Avertissement Cette fonction est EXPERIMENTALE. Cela signifie que le comportement de ces fonctions, leurs noms et concrètement, TOUT ce qui est documenté ici peut changer dans un futur proche, SANS PREAVIS! Soyez-en conscient, et utiliser ce module à vos risques et périls. dbplus_change (unknown) int dbplus_change (int handle, string domain) Avertissement Cette fonction est EXPERIMENTALE. Cela signifie que le comportement de ces fonctions, leurs noms et concrètement, TOUT ce qui est documenté ici peut changer dans un futur proche, SANS PREAVIS! Soyez-en conscient, et utiliser ce module à vos risques et périls. Not implemented yet. dbplus_find (unknown) int dbplus_find (int handle, string constr, string tname) Avertissement Cette fonction est EXPERIMENTALE. Cela signifie que le comportement de ces fonctions, leurs noms et concrètement, TOUT ce qui est documenté ici peut changer dans un futur proche, SANS PREAVIS! Soyez-en conscient, et utiliser ce module à vos risques et périls. Not implemented yet. dbplus_freelock (unknown) int dbplus_freelock (int handle, string tname) Avertissement Cette fonction est EXPERIMENTALE. Cela signifie que le comportement de ces fonctions, leurs noms et concrètement, TOUT ce qui est documenté ici peut changer dans un futur proche, SANS PREAVIS! Soyez-en conscient, et utiliser ce module à vos risques et périls. Not implemented yet. dbplus_getlock (unknown) int dbplus_getlock (int handle, string tname) 297 Avertissement Cette fonction est EXPERIMENTALE. Cela signifie que le comportement de ces fonctions, leurs noms et concrètement, TOUT ce qui est documenté ici peut changer dans un futur proche, SANS PREAVIS! Soyez-en conscient, et utiliser ce module à vos risques et périls. Not implemented yet. dbplus_getunique (unknown) int dbplus_getunique (int handle, string varname, int flush) Avertissement Cette fonction est EXPERIMENTALE. Cela signifie que le comportement de ces fonctions, leurs noms et concrètement, TOUT ce qui est documenté ici peut changer dans un futur proche, SANS PREAVIS! Soyez-en conscient, et utiliser ce module à vos risques et périls. Not implemented yet. dbplus_rchperm (unknown) int dbplus_rchperm (int handle, int mask, string user, string group) Avertissement Cette fonction est EXPERIMENTALE. Cela signifie que le comportement de ces fonctions, leurs noms et concrètement, TOUT ce qui est documenté ici peut changer dans un futur proche, SANS PREAVIS! Soyez-en conscient, et utiliser ce module à vos risques et périls. Not implemented yet. dbplus_rcreate (unknown) int dbplus_rcreate (string name, string domlist, int flag) Avertissement Cette fonction est EXPERIMENTALE. Cela signifie que le comportement de ces fonctions, leurs noms et concrètement, TOUT ce qui est documenté ici peut changer dans un futur proche, SANS PREAVIS! Soyez-en conscient, et utiliser ce module à vos risques et périls. Not implemented yet. dbplus_rcrtexact (unknown) int dbplus_rcrtexact (string name, int handle, int flag) 298 Avertissement Cette fonction est EXPERIMENTALE. Cela signifie que le comportement de ces fonctions, leurs noms et concrètement, TOUT ce qui est documenté ici peut changer dans un futur proche, SANS PREAVIS! Soyez-en conscient, et utiliser ce module à vos risques et périls. Not implemented yet. dbplus_rcrtlike (unknown) int dbplus_rcrtlike (string name, int handle, int flag) Avertissement Cette fonction est EXPERIMENTALE. Cela signifie que le comportement de ces fonctions, leurs noms et concrètement, TOUT ce qui est documenté ici peut changer dans un futur proche, SANS PREAVIS! Soyez-en conscient, et utiliser ce module à vos risques et périls. Not implemented yet. dbplus_resolve (unknown) int dbplus_resolve (string name, string vname) Avertissement Cette fonction est EXPERIMENTALE. Cela signifie que le comportement de ces fonctions, leurs noms et concrètement, TOUT ce qui est documenté ici peut changer dans un futur proche, SANS PREAVIS! Soyez-en conscient, et utiliser ce module à vos risques et périls. Not implemented yet. dbplus_rkeys (unknown) int dbplus_rkeys (int handle, string domlist) Avertissement Cette fonction est EXPERIMENTALE. Cela signifie que le comportement de ces fonctions, leurs noms et concrètement, TOUT ce qui est documenté ici peut changer dans un futur proche, SANS PREAVIS! Soyez-en conscient, et utiliser ce module à vos risques et périls. Not implemented yet. dbplus_rquery (unknown) int dbplus_rquery () 299 Avertissement Cette fonction est EXPERIMENTALE. Cela signifie que le comportement de ces fonctions, leurs noms et concrètement, TOUT ce qui est documenté ici peut changer dans un futur proche, SANS PREAVIS! Soyez-en conscient, et utiliser ce module à vos risques et périls. dbplus_rrename (unknown) int dbplus_rrename (int handle, string name, int flag) Avertissement Cette fonction est EXPERIMENTALE. Cela signifie que le comportement de ces fonctions, leurs noms et concrètement, TOUT ce qui est documenté ici peut changer dans un futur proche, SANS PREAVIS! Soyez-en conscient, et utiliser ce module à vos risques et périls. Not implemented yet. dbplus_rsecindex (unknown) int dbplus_rsecindex (int handle, string domlist, int compact) Avertissement Cette fonction est EXPERIMENTALE. Cela signifie que le comportement de ces fonctions, leurs noms et concrètement, TOUT ce qui est documenté ici peut changer dans un futur proche, SANS PREAVIS! Soyez-en conscient, et utiliser ce module à vos risques et périls. Not implemented yet. dbplus_tcl (unknown) int dbplus_tcl (int sid, string script) Avertissement Cette fonction est EXPERIMENTALE. Cela signifie que le comportement de ces fonctions, leurs noms et concrètement, TOUT ce qui est documenté ici peut changer dans un futur proche, SANS PREAVIS! Soyez-en conscient, et utiliser ce module à vos risques et périls. Not implemented yet. 300 XXI. Accès aux dossiers 301 Dossiers chroot (PHP 4 >= 4.0.5) Change la racine int chroot (string directory) chroot() change la racine du script en cours, et la remplace par directory. chroot() retourne FALSE s’il n’a pas pu modifier la racine, et TRUE sinon. Note : Il n’est pas conseillé d’utiliser cette fonction sur un site web, car il n’est pas possible de restaurer la racine à sa valeur initiale à la fin de la requête. Cette fonction n’est viable que lorsque PHP est utilisé en CGI. chdir (PHP 3, PHP 4 >= 4.0b1) Change de dossier int chdir (string directory) chdir() change le dossier courant de PHP en directory. chdir() retourne FALSE si l’opération échoue, et TRUE sinon. dir (PHP 3, PHP 4 >= 4.0b1) Classe dossier new dir (string directory) Un mécanisme pseudo-objet permet la lecture d’un dossier. L’argument directory doit être ouvert. Deux propriétés sont disponibles une fois le dossier ouvert : le pointeur peut être utilisé avec d’autres fonctions telles que readdir(), rewinddir() et closedir(). Le chemin du dossier est le chemin fourni lors de la construction de l’objet. Trois méthodes permettent de lire, remettre à zéro et fermer le dossier. Exemple 1. Exemple avec dir() <?php $d = dir("/etc"); echo "Pointeur: ".$d->handle."<br>\n"; echo "Chemin: ".$d->path."<br>\n"; while($entry=$d->read()) { echo $entry."<br>\n"; } $d->close(); ?> closedir (PHP 3, PHP 4 >= 4.0b1) Ferme le pointeur sur le dossier. void closedir (resource dir_handle) 302 Dossiers closedir() ferme le pointeur de dossier dir_handle. Le dossier devait avoir été ouvert avec opendir(). getcwd (PHP 4 >= 4.0b4) Retourne le dossier de travail string getcwd (void) getcwd() retourne le nom du dossier courant. opendir (PHP 3, PHP 4 >= 4.0b1) Ouvre un dossier, et récupère un pointeur dessus. int opendir (string path) opendir() retourne un pointeur sur un dossier pour être utilisé avec les fonctions closedir(), readdir() et rewinddir(). Si le paramètre path n’est pas un dossier valide, ou si le dossier ne peut être accédé pour des raisons de permissions ou des erreurs liées au système de fichiers, opendir() retourne FALSE et génère une erreur PHP. Vous pouvez supprimer cette erreur en ajoutant @ avant le nom de la fonction. Exemple 1. Exemple opendir() <?php if ($dir = @opendir("/tmp")) { while($file = readdir($dir)) { echo "$file\n"; } closedir($dir); } ?> readdir (PHP 3, PHP 4 >= 4.0b1) Lit une entrée du dossier. string readdir (resource dir_handle) readdir() retourne le nom du fichier suivant dans le dossier identifié par dir_handle. Les noms sont retournés dans n’importe quel ordre. Exemple 1. Liste tous les fichiers du dossier courant <?php $handle=opendir(’.’); echo "Pointeur de dossier: $handle\n"; echo "Fichiers:\n"; while ($file = readdir($handle)) { echo "$file\n"; } closedir($handle); 303 Dossiers ?> Notez que readdir() retournera aussi les dossiers "." et "..". Si vous ne les voulez pas, supprimez les simplement : Exemple 2. Liste tous les fichiers du dossier courant, sauf "." et ".." <?php $handle=opendir(’.’); while ($file = readdir($handle)) { if ($file != "." && $file != "..") { echo "$file\n"; } } closedir($handle); ?> rewinddir (PHP 3, PHP 4 >= 4.0b1) Retourne à la première entrée du dossier. void rewinddir (resource dir_handle) rewinddir() retourne à la première entrée du dossier identifié par dir_handle : le prochain fichier lu sera le premier. 304 XXII. DOM XML Note importante : cette documentation est en cours de rédaction, et n’est pas encore finie. Elle souffre naturellement d’un manque de détails et de relecture. Soyez en prévenu. (Damien Seguy). Ces fonctions ne sont disponibles que si PHP a été configuré avec l’option --with-dom=[DIR], et utilise la librairie GNOME xml library. Vous aurez aussi besoin de la librairie libxml-2.2.7 (la version beta ne fonctionne pas). Ces fonctions ont été ajoutées en PHP 4. Cette extension vous permet de générer des documents XML avec les API DOM. Elle fournit aussi une fonction xmltree() qui transforme un fichier XML en tableau PHP. Actuellement, ce tableau est accessible uniquement en lecture. Cela ne siginifie pas que vous ne pouvez pas le modifier, mais cela n’aurait aucun sens car domxml_dumpmem() ne pourra pas prendre ces modifications en considération. Par conséquent, si vous voulez lire un fichier XML et écrire sa version modifiée, utilisez les fonctions domxml_add_node(), domxml_set_attribute(), etc... et finalement, domxml_dumpmem(). Ce module définit les constantes suivantes : Tableau 1. Constantes XML Constante Valeur Description XML_ELEMENT_NODE 1 Le noeud est un élément XML_ATTRIBUTE_NODE 2 Le noeud est un attribut XML_TEXT_NODE 3 Le noeud est un texte XML_CDATA_SECTION_NODE 4 XML_ENTITY_REF_NODE 5 XML_ENTITY_NODE 6 Le noeud est une entité telle que &nbsp; XML_PI_NODE 7 Le noeud est une instruction XML_COMMENT_NODE 8 Le noeud est un commentaire XML_DOCUMENT_NODE 9 Le noeud est un document XML_DOCUMENT_TYPE_NODE 10 XML_DOCUMENT_FRAG_NODE 11 XML_NOTATION_NODE 12 XML_GLOBAL_NAMESPACE 1 XML_LOCAL_NAMESPACE 2 Chaque fonction de cette extension peut être utilisée de deux manières différentes. Dans un contexte procédural, il faut passer l’objet en premier argument; dans un contexte objet, vous pouvez appeler la fonction comme une méthode de cet objet. Cette documentation présente les fonctions dans leur contexte procédural. Vous pouvez connaître la méthode objet en supprimant le préfixe "domxml_". Les tables suivantes listes toutes les classes, leurs attributs et leurs méthodes. Ce module définit un ensemble de classes, qui sont listées ci-dessous (y compris leur attributs et leur méthodes). Tableau 2. classe DomDocument (méthodes) Nom de la méthode Nom de la fonction root domxml_root() children domxml_children() add_root domxml_add_root() dtd domxml_intdtd() dumpmem domxml_dumpmem() xpath_init xpath_init xpath_new_context xpath_new_context xptr_new_context xptr_new_context Description 305 DOM XML Tableau 3. Classe DomDocument (attributs) Nom Type Description doc class DomDocument L’objet lui-même name string url string version string encoding string standalone long 1 si le fichier est complet type long Une des constantes de la table ... compression long 1 si le fichier est compressé charset long Version de XML Tableau 4. classe DomNode (méthodes) Nom Nom en PHP lastchild domxml_last_child() children domxml_children() parent domxml_parent() new_child domxml_new_child() get_attribute domxml_get_attribute() set_attribute domxml_set_attribute() attributes domxml_attributes() node domxml_node() set_content() domxml_set_content Description Tableau 5. classe DomNode (attributs) Nom Type Description node class DomNode L’objet lui-même type long name string content string 306 DOM XML xmldoc (PHP 4 >= 4.0b4) Crée un objet DOM pour un document XML. object xmldoc (string str) xmldoc() analyse le document XML str et retourne un objet de classe "Dom document", avec les propriétés de "doc" (ressources), "version" (string) et "type" (long). xmldocfile (PHP 4 >= 4.0b4) Crée un objet DOM à partir d’un fichier XML object xmldocfile (string filename) xmldocfile() analyse le fichier XML filename et retourne un objet "Dom document", avec les propriétées de "doc" (ressources) et "version" (string). xmltree (PHP 4 >= 4.0b4) Crée un arbre d’objet PHP, à partir d’un document XML. object xmltree (string str) xmltree() analyse le document XML str et retourne un arbre d’objets PHP qui représente le document analysé. xmltree() est différentes des autres fonctions, car vous ne pouvez accéder à cet arbre avec aucune des autres fonctions. Modifier cet arbre n’a pas de sens, car il n’y a pas moyen de sauver ces modifications. Cette fonction a tout de même des applications en lecture seule. domxml_root (PHP 4 >= 4.0b4) Retourne l’élément racine object domxml_root (object doc) domxml_root() prend en argument doc, un objet de la classe "Dom document", et retourn l’élément racine de ce document. Les autres noeuds qui peuvent être considérés comme racine (tels que les commentaires) sont ignorés. L’exemple suivant retourne simplement l’élément CHAPTER et l’affiche. Les autres racines (des commentaires) ne sont pas retournés. Exemple 1. Lecture de l’élément principal <?php $xmlstr = "<?xml version=’1.0’ standalone=’yes’> <!DOCTYPE chapter SYSTEM ’/share/sgml/Norman_Walsh/db3xml10/db3xml10.dtd’ [ <!ENTITY sp \"spanish\"> ]> <!- lsfj --> <chapter language=’en’><title language=’en’>Title</title> <para language=’ge’> &sp; <!- comment --> <informaltable language=’&sp;’> 307 DOM XML <tgroup cols=’3’> <tbody> <row><entry>a1</entry><entry morerows=’1’>b1</entry><entry>c1</entry></row> <row><entry>a2</entry><entry>c2</entry></row> <row><entry>a3</entry><entry>b3</entry><entry>c3</entry></row> </tbody> </tgroup> </informaltable> </para> </chapter>"; if(!$dom = xmldoc($xmlstr)) { echo "Erreur lors de l’analyse du document\n"; exit; } $root = $dom->root(); /* ou $root = domxml_root($dom); */ print_r($root); ?> domxml_add_root (PHP 4 >= 4.0b4) Ajoute une autre racine resource domxml_add_root (resource doc, string name) domxml_add_root() ajoute la racine name au document doc. Exemple 1. Création d’une en-tête HTML simple <?php $root = $doc->add_root("HTML"); $head = $root->new_child("HEAD", ""); $head->new_child("TITLE", "Ici, le titre"); echo $doc->dumpmem(); ?> domxml_dumpmem (PHP 4 >= 4.0b4) Ecrit le document XML interne dans une chaîne string domxml_dumpmem (resource doc) domxml_dumpmem() crée un document XML à partir de la représentation interne. domxml_dumpmem() est généralement appelée avec avoir construit un nouveau document XML, comme dans l’exemple domxml_add_root(). Voir aussi domxml_add_root(). 308 DOM XML domxml_attributes (PHP 4 >= 4.0b4) Retourne les attributs d’un noeud array domxml_attributes (resource node) domxml_attributes() retourne tous les attributs du noeud node sous forme d’un tableau d’objets "dom attribute". domxml_get_attribute (PHP 4 >= 4.0.5) Retourne un attribut d’un noeud object domxml_get_attribute (resource node, string name) domxml_get_attribute() retourn l’attribut name du noeud node. Voir aussi domxml_set_attribute(). domxml_set_attribute (PHP 4 >= 4.0.5) Modifie un attribut object domxml_set_attribute (resource node, string name, string value) domxml_set_attribute() modifie l’attribut name du noeud node en lui attribuant la valeur value. En partant de l’exemple proposé à la fonction domxml_add_root(), il est simple d’ajouter un attribut à l’élément HEAD en appelant simplement set_attribute(). Exemple 1. Ajouter un attribut à un élément <?php $doc = new_xmldoc("1.0"); $root = $doc->add_root("HTML"); $head = $root->new_child("HEAD", ""); $head->new_child("TITLE", "Ici, le titre"); $head->set_attribute("Language", "fr"); $head->new_child("TITLE", "Hier der Titel"); $head->set_attribute("Language", "ge"); echo $doc->dumpmem(); ?> domxml_children (PHP 4 >= 4.0b4) Retourne les fils d’un noeud array domxml_children (object doc|node) domxml_children() retourne tous les fils du noeud doc|node, sous forme d’un tableau de noeuds. Dans l’exemple ci-dessous, la variable children contiendra un tableau avec les noeuds de type XML_ELEMENT. Ce noeud est l’élément TITLE. 309 DOM XML Exemple 1. Lire les fils d’un noeud <?php $doc = new_xmldoc("1.0"); $root = $doc->add_root("HTML"); $head = $root->new_child("HEAD", ""); $head->new_child("TITLE", "Hier der Titel"); $head->set_attribute("Language", "ge"); $children = $head->children() ?> domxml_new_child (PHP 4 >= 4.0b4) Ajoute un nouveau fils resource domxml_new_child (string name, string content) domxml_new_child() ajoute un nouveau fils. (NDtraducteur : cette documentation n’est pas encore finie...) domxml_new_xmldoc (PHP 4 >= 4.0b4) Crée un document XML vide object domxml_new_xmldoc (string version) domxml_new_xmldoc() crée un nouveau document XML vide, et le retourne. Voir aussi domxml_add_root(). xpath_new_context (4.0.4 - 4.0.6 only) Crée un nouveau contexte xpath object xpath_new_context (object dom_document) Pas de documentation encore (22/2/2201). xpath_eval (PHP 4 >= 4.0.4) Evalue une expression xpath array xpath_eval (object xpath_context) Pas de documentation encore (22/2/2201). 310 XXIII. Gestion des erreurs Ces fonctions permettent de gérer les erreurs, et de les enregistrer. Vous pouvez définir les règles de traitement des erreurs et choisir la manière de les enregistrer : vous pouvez adapter le rapport d’erreur à vos besoins. Avec les fonctions d’enregistrements, vous pouvez envoyer directement les rapport à d’autres machines (ou même les envoyer par email à un pager), à l’ historique système, ou encore selectionner les erreurs les plus importantes et ne pas enregistrer les autres. La fonction de niveau d’erreur vous permet de personnaliser le niveau et le type d’erreur noté : depuis les inoffensives alertes jusqu’au erreurs personnalisées retournées par les fonctions. 311 Gestion des erreurs error_log (PHP 3, PHP 4 >= 4.0b1) Envoie un message d’erreur quelque part int error_log (string message, int message_type [, string destination [, string extra_headers]]) error_log() envoie un message d’erreur à l’historique du serveur web, à un port TCP ou un fichier. message est le message d’erreur qui doit être enregistré. message_type indique où le message doit être envoyé : Tableau 1. Types de error_log() 0 message est envoyé à l’historique PHP, qui est basé sur l’historique système ou un fichier, en fonction de la configuration de error_log. 1 message est envoyé par email à l’adresse destination. C’est le seul type qui utilise le quatrième paramètre extra_headers. Ce message utilise la même fonction interne que mail(). 2 message est envoyé par la connexion de debuggage PHP. Cette option n’est disponible que si l’option remote debugging a été désactivé. Dans ce cas, le parmètre destination spécifie l’hôte ou l’adresse IP, et optionnellement le numéro de port, de la socket qui recevra les informations de débuggage. 3 message est ajouté au fichier destination. Exemple 1. Exemples avec error_log() <?php // Envoi une notification par l’historique du serveur, si la connexion à la base // de données est impossible. if (!Ora_Logon ($username, $password)) { error_log ("Base Oracle indisponible!", 0); } // Indiquer à l’administrateur, par email, qu’il n’y a plus de FOO if (!($foo = allocate_new_foo()) { error_log ("Aya!, Il ne reste plus de FOO disponibles!", 1, "[email protected]"); } // D’autres manières d’appeler error_log(): error_log ("Grosse bourde!", 2, "127.0.0.1:7000"); error_log ("Grosse bourde!", 2, "loghost"); error_log ("Grosse bourde!", 3, "/var/tmp/my-errors.log"); ?> error_reporting (PHP 3, PHP 4 >= 4.0b1) Fixe le niveau de rapport d’erreurs PHP int error_reporting ([int level]) 312 Gestion des erreurs error_reporting() fixe le niveau de rapport d’erreur PHP et retourne l’ancienne valeur. Le niveau d’erreur peut être un champs de bits, ou une constante. L’utilisation des constantes est vivement recommandé, pour assurer une compatiblité maximale avec les futures versions. Au fur et à mesure que de nouveaux niveaux d’erreurs sont créés, l’intervalle de validité des niveaux évolue, et les anciennes valeurs n’ont plus les mêmes significations. Exemple 1. Exemple de modification de niveau d’erreur error_reporting (55); // En PHP 3, équivalent à E_ALL ^ E_NOTICE /* ...en PHP 4, ’55’ signifie (E_ERROR | E_WARNING | E_PARSE | E_CORE_ERROR | E_CORE_WARNING) */ error_reporting (2039); // PHP 4 équivalent à E_ALL ^ E_NOTICE error_reporting (E_ALL ^ E_NOTICE); // La même signification en PHP 3 et 4 Suivez les liens de chaque valeur interne pour connaître leur signification : Tableau 1. Constantes avec error_reporting() constante valeur 1 E_ERROR 2 E_WARNING 4 E_PARSE 8 E_NOTICE 16 E_CORE_ERROR 32 E_CORE_WARNING 64 E_COMPILE_ERROR 128 E_COMPILE_WARNING 256 E_USER_ERROR 512 E_USER_WARNING 1024 E_USER_NOTICE Exemple 2. Exemples avec error_reporting() error_reporting(0); /* Empêche tout affichage d’erreur */ error_reporting(7); // Ancienne syntaxe PHP 2/3 error_reporting(E_ERROR | E_WARNING | E_PARSE); // Nouvelle syntaxe PHP 3/4 /* Utilisation appropriée pour les erreurs courantes d’exécution */ error_reporting(15); // Ancienne syntaxe, PHP 2/3 error_reporting(E_ERROR | E_WARNING | E_PARSE | E_NOTICE); // Nouvelle syntaxe PHP 3/4 /* Utilisation appropriée pour les erreurs courantes de développement (variables non initialisées..)*/ error_reporting(63); // Ancienne syntaxe, PHP 2/3 error_reporting(E_ALL); // Nouvelle syntaxe PHP 3/4 /* rapporte toutes les erreurs PHP*/ restore_error_handler (PHP 4 >= 4.0.1) Réactive l’ancienne fonction de gestion des erreurs void restore_error_handler (void) 313 Gestion des erreurs Utilisée après avoir modifié la fonction de gestion des erreurs, grâce à set_error_handler(), restore_error_handler() permet de réutiliser l’ancienne version de gestion des erreurs (qui peut être la fonction PHP par défaut, ou une autre fonction utilisateur). Voir aussi error_reporting(), set_error_handler(), trigger_error() et user_error() set_error_handler (PHP 4 >= 4.0.1) Choisi une fonction utilisateur comme gestionnaire d’erreurs string set_error_handler (string error_handler) set_error_handler() choisit la fonction utilisateur error_handler pour gérer les erreurs dans un script. Retourne un pointeur sur l’ancienne fonction de gestion des erreurs (si il y en avait une), ou FALSE, en cas d’erreur. set_error_handler() sert à définir votre propre gestionnaire d’erreur, qui prendra en charge leur traitement durant l’exécution d’un script. Cela peut être utile lorsque vous devez repérer des erreurs critiques lors d’un nettoyage de bases, ou bien si vous souhaitez générer une erreur dans certaines conditions (avec trigger_error()). La fonction utilisateur doit accepter deux arguments : le code de l’erreur, et une chaîne décrivant l’erreur. L’exemple ci dessous montre le traitement d’exceptions en déclenchant des erreurs, et en les gérant avec une fonction utilisateur : Exemple 1. Traitement des erreurs avec set_error_handler() et trigger_error() <?php // redéfinit les constantes utilisateurs - PHP 4 seulement define (FATAL,E_USER_ERROR); define (ERROR,E_USER_WARNING); define (WARNING,E_USER_NOTICE); // Fixe le niveau de rapport d’erreur pour ce script error_reporting (FATAL + ERROR + WARNING); // Fonction de traitement des erreurs function myErrorHandler ($errno, $errstr) { switch ($errno) { case FATAL: echo "<B>FATAL</B> [$errno] $errstr<br>\n"; echo " Erreur fatale à la ligne ".__LINE__." du fichier ".__FILE__; echo ", PHP ".PHP_VERSION." (".PHP_OS.")<br>\n"; echo "Aborting...<br>\n"; exit -1; break; case ERROR: echo "<B>ERREUR</B> [$errno] $errstr<br>\n"; break; case WARNING: echo "<B>ALERTE</B> [$errno] $errstr<br>\n"; break; default: echo "Erreur inconnue de type : [$errno] $errstr<br>\n"; break; } } // fonction qui teste la gestion d’erreur function scale_by_log ($vect, $scale) { if ( !is_numeric($scale) || $scale <= 0 ) trigger_error("log(x) pour x <= 0 est indéfini, vous avez passé: scale = $scale", FATAL); if (!is_array($vect)) { trigger_error("Vecteur d’entrée incorrect : un tableau de valeurs est attendu : ", ERROR); return null; } for ($i=0; $i<count($vect); $i++) { if (!is_numeric($vect[$i])) 314 Gestion des erreurs trigger_error("La valeur à la position $i n’est pas un nombre. On utilise 0 (zéro) à la place", WARNING); $temp[$i] = log($scale) * $vect[$i]; } return $temp; } // Ancienne fonction de traitement des erreurs $old_error_handler = set_error_handler("myErrorHandler"); // Génération de quelques erreurs : définition d’un tableau avec des éléments non numériques echo "vector a\n"; $a = array(2,3,"foo",5.5,43.3,21.11); print_r($a); // définition d’un deuxième table à problème echo "---\nvector b - a alerte (b = log(PI) * a)\n"; $b = scale_by_log($a, M_PI); print_r($b); // Ceci est un problème, on passe une chaîne à la place d’un tableau echo "---\nvector c - une erreur\n"; $c = scale_by_log("not array",2.3); var_dump($c); // Ceci est critique : le tableau contient des valeurs négatives echo "---\nvector d - fatal error\n"; $d = scale_by_log($a, -2.5); ?> L’éxécution du script devrait donner ceci : vector a Array ( [0] => 2 [1] => 3 [2] => foo [3] => 5.5 [4] => 43.3 [5] => 21.11 ) -vector b - une alerte (b = log(PI) * a) <B>WARNING</B> [1024] La valeur à la position 2 n’est pas un nombre. On utilise 0 (zéro) à la place<br> Array ( [0] => 2.2894597716988 [1] => 3.4341896575482 [2] => 0 [3] => 6.2960143721717 [4] => 49.566804057279 [5] => 24.165247890281 ) -vector c - an error <B>ERROR</B> [512] Vecteur d’entrée incorrect : un tableau de valeur est attendu<br> NULL -vector d - fatal error <B>FATAL</B> [256] log(x) de x <= 0 est indéfini : scale = -2.5<br> Erreur fatale à la ligne 16 du fichier trigger_error.php, PHP 4.0.1pl2 (Linux)<br> Annulation du script....<br> 315 Gestion des erreurs Il faut se rappeler que la fonction standard de traitement des erreurs de PHP est alors complètement ignorée. error_reporting() n’aura plus d’effet, et votre fonction de gestion des erreurs sera toujours appelée. Vous pourrez toujours lire la valeur de l’erreur courante de error_reporting() et faire réagier la fonction de gestion des erreurs en fonction. Cette remarque est notamment valable si la commande a été préfixée par @ (0 sera retourné). Notez aussi qu’il est alors confié à cette fonction de terminer le script (die()) si nécessaire. Si la fonction de gestion des erreurs se termine normalement, l’exécution du script se poursuivra avec l’exécution de la prochaine commande. Voir aussi error_reporting(), restore_error_handler(), trigger_error(), et user_error() trigger_error (PHP 4 >= 4.0.1) Déclenche une erreur utilisateur void trigger_error (string error_msg [, int error_type]) trigger_error() est utilisé pour déclencher une erreur utilisateur. Elle peut aussi être utilisée en conjonction avec un gestionnaire d’erreur interne, ou un gestionnaire d’erreurs utilisateur qui a été choisi comme gestionnaire d’erreur avec set_error_handler(). trigger_error() est pratique lorsque vous devez générer une réponse particulière lors de l’exécution. Par exemple <?php if (assert ($divisor == 0)) trigger_error ("Impossible de diviser par zéro", E_USER_ERROR); ?> Note : Voir set_error_handler() pour illustration. Voir aussi error_reporting(), set_error_handler(), restore_error_handler(), user_error() user_error (PHP 4 >= 4.0RC2) Génére un message d’erreur utilisateur void user_error (string error_msg [, int error_type]) user_error() est un alias de la fonction trigger_error(). Voir aussi error_reporting(), set_error_handler(), restore_error_handler() et trigger_error(). 316 XXIV. FrontBase Avertissement Ce module est EXPERIMENTAL. Cela signifie que le comportement de ces fonctions, leurs noms et concrètement, TOUT ce qui est documenté ici peut changer dans un futur proche, SANS PREAVIS! Soyez-en conscient, et utiliser ce module à vos risques et périls. Ces fonctions vous permettent d’accéder aux serveurs SQL FrontBase. Pour pouvoir les utiliser, vous devez compiler PHP avec le support fbsql en utilisant l’option --with-fbsql. Si vous utilisez cette option sans spécifier le chemin jusqu’à l’installation fbsql, PHP recherchera les librairies du client fbsql dans les dossiers habituels, sur votre système. Les utilisateurs qui ont installé FrontBase dans un dossier non standard doivent spécifier le chemin comme ceci : --with-fbsql=/path/to/fbsql. Cela va indiquer à PHP le bon emplacement des librairies de FrontBase, et éviter les conflits. Plus d’informations sur FrontBase sont disponibles à http://www.frontbase.com/. La documentation complète de FrontBase est disponible à http://www.frontbase.com/cgi-bin/WebObjects/FrontBase.woa/wa/productsPage?currentPage=Documentation. Le support de Frontbase a été ajouté en PHP 4.0.6. 317 FrontBase fbsql_affected_rows (PHP 4 >= 4.0.6) Lit le nombre de ligne affectées par la dernière requête int fbsql_affected_rows (resource [link_identifier]) fbsql_affected_rows() retourne le nombre de lignes affectées par la dernière requête INSERT, UPDATE ou DELETE, effectuée avec la connexion représentée par link_identifier. Si ce dernier n’est pas spécifié, c’est la dernière connexion ouverte par fbsql_connect() qui sera utilisée. Note : Si vous utilisez les transactions, vous devez appeler fbsql_affected_rows() après votre requête INSERT, UPDATE ou DELETE, mais pas après la validation. Si la dernière requête DELETE ne contenait pas de clause WHERE, toutes les lignes seront effacées, mais fbsql_affected_rows() retournera 0. Note : Lors d’une requête UPDATE, FrontBase ne modifie pas les lignes dont les anciennes valeurs sont égales aux nouvelles. Cela fait que fbsql_affected_rows() ne retournera pas le nombre de ligne traitées, mais le nombre de lignes affectées (modifiées) par la requête. Si la dernière requête échoue, fbsql_affected_rows() retourne -1. Voir aussi fbsql_num_rows(). fbsql_autocommit (PHP 4 >= 4.0.6) Active ou désactive la validation automatique. boolean fbsql_autocommit (resource link_identifier, boolean [OnOff]) fbsql_autocommit() retourne l’état courant de la validation automatique, pour la connexion link_identifier. Si le paramètre OnOff est fourni, la validation automatique sera remplacée par sa valeur (un booléen). fbsql_change_user (unknown) Change le nom d’utilisateur de la session active resource fbsql_change_user (string user, string password, string [database], resource [link_identifier]) fbsql_change_user() change le nom de l’utilisateur courant sur la session active courante, ou sur link_identifier. Si une base de données est spécifiée avec le paramètre database, elle deviendra la base par défaut du nouvel utilisateur. Le nouvel utilisateur doit être spécifié par son login (user), et son mot de passe (password). Si l’authentification échoue, la session courante restera ouverte. fbsql_close (PHP 4 >= 4.0.6) Ferme la connexion FrontBase boolean fbsql_close (resource [link_identifier]) 318 FrontBase fbsql_close() retourne TRUE en cas de succès et FALSE en cas d’erreur. fbsql_close() ferme la connexion au serveur FrontBase associé à la ressource link_identifier. Si link_identifier est omis, c’est la dernière connexion ouverte qui sera fermée. Utiliser fbsql_close() n’est pas nécessaire, car les liens non persistants seront automatiquement fermé à la fin du script. Exemple 1. Exemple avec fbsql_close() <?php $link = fbsql_connect("localhost", "_SYSTEM", "secret") or die("Could not connect"); print("Connecté!"); fbsql_close($link); ?> Voir aussi fbsql_connect() et fbsql_pconnect(). fbsql_connect (PHP 4 >= 4.0.6) Ouvre une connexion à un serveur FrontBase resource fbsql_connect (string [hostname], string [username], string [password]) fbsql_connect() retourne une ressource de connexion positive en cas de succès, ou un message d’erreur en cas d’échec. fbsql_connect() établit une connexion avec un serveur FrontBase. Les valeur suivantes sont utilisées, en cas d’omission : hostname = ’NULL’, username = ’_SYSTEM’ et password = "" (pas de mot de passe). Si un deuxième appel est fait à fbsql_connect() avec les mêmes arguments, une nouvelle connexion ne sera pas générée, mais la connexion déjà ouverte sera reutilisée, et retournée. La connexion au serveur sera fermée dès la fin du scrpit, à moins qu’elle ne soit explicitement terminée plus tôt, avec la fonction fbsql_close(). Exemple 1. Exemple avec fbsql_connect() <?php $link = fbsql_connect("localhost", "_SYSTEM", "secret") or die("Could not connect"); print("Connected successfully"); fbsql_close($link); ?> Voir aussi fbsql_pconnect() et fbsql_close(). fbsql_create_db (PHP 4 >= 4.0.6) Crée une base de données boolean fbsql_create_db (string database_name, resource [link_identifier]) fbsql_create_db() crée une nouvelle base de données, nommée database_name, sur le serveur repéré par la ressource link_identifier. 319 FrontBase Exemple 1. Exemle avec fbsql_create_db() <?php $link = fbsql_pconnect("localhost", "_SYSTEM", "secret") or die ("Impossible de se connecter"); if (fbsql_create_db("my_db")) { print("Base de données créée!\n"); } else { printf("Erreur de création de la base de données : %s\n", fbsql_error()); } ?> Voir aussi fbsql_drop_db(). fbsql_data_seek (PHP 4 >= 4.0.6) Déplace le pointeur interne de résultat int fbsql_data_seek (int result_identifier, int row_number) fbsql_data_seek() retourne TRUE en cas de succès et FALSE en cas d’erreur. fbsql_data_seek() déplace le pointeur interne de ligne dans le résultat de requête result_identifier jusqu’à la ligne row_number. Le prochain appel à fbsql_fetch_row() retournera cette ligne. Les lignes sont numérotées à partir de 0. Exemple 1. Exemple avec fbsql_data_seek() <?php $link = fbsql_pconnect("localhost", "_SYSTEM", "secret") or die ("Impossible de se connecter"); fbsql_select_db("samp_db") or die ("Impossible de sélectionner une base"); $query = "SELECT last_name, first_name FROM friends;"; $result = fbsql_query($query) or die ("Query failed"); // Lecture des lignes en ordre inverse for ($i = fbsql_num_rows($result) - 1; $i >=0; $i--) { if (!fbsql_data_seek($result, $i)) { printf ("Impossible d’accéder à la ligne %d\n", $i); continue; } if(!($row = fbsql_fetch_object($result))) continue; printf ("%s %s<BR>\n", $row->last_name, $row->first_name); } fbsql_free_result($result); ?> fbsql_db_query (PHP 4 >= 4.0.6) Envoie une requête à la base FrontBase resource fbsql_db_query (string database, string query, resource [link_identifier]) fbsql_db_query() retourne une ressource positive représentant un résultat de requête en cas de succès, et FALSE en cas d’erreur. 320 FrontBase fbsql_db_query() sélectionne la base database et y exécute la requête query. Si le paramètre optionnel link_identifier est spécifié, fbsql_db_query() travaillera sur cette connexion. S’il est omis, fbsql_db_query() essaiera d’utiliser la dernière connexion ouverte. Si aucune connexion n’a été ouverte, fbsql_db_query() essaiera de se connecter automatiquement en appelant la fonction fbsql_connect(), sans arguments. Voir aussi fbsql_connect(). fbsql_drop_db (PHP 4 >= 4.0.6) Supprime une base de données FrontBase boolean fbsql_drop_db (string database_name, resource [link_identifier]) fbsql_drop_db() retourne TRUE en cas de succès et FALSE en cas d’erreur. fbsql_drop_db() essaie de supprimer la base de données database_name, sur la connexion représentée par link_identifier. fbsql_errno (PHP 4 >= 4.0.6) Retourne le code d’erreur FrontBase int fbsql_errno (resource [link_identifier]) fbsql_errno() retourne le code d’erreur de la dernière connexion FrontBase, ou bien 0 (zéro) si aucune erreur n’est survenue. Les erreurs générées par FrontBase ne sont pas automatiquement affichées comme alertes. Il faut utiliser la fonction fbsql_errno() pour connaître leur code d’erreur. Notez que cette fonction ne retourne que le code d’erreur généré par la dernière fonction FrontBase (hormis fbsql_error() et fbsql_errno()) : si vous voulez repérer les erreurs, faites le dès que les fonctions ont été appelées. <?php fbsql_connect("marliesle"); echo fbsql_errno().": ".fbsql_error()."<br>"; fbsql_select_db("nonexistentdb"); echo fbsql_errno().": ".fbsql_error()."<br>"; $conn = fbsql_query("SELECT * FROM nonexistenttable;"); echo fbsql_errno().": ".fbsql_error()."<br>"; ?> Voir aussi fbsql_error() et fbsql_warnings() fbsql_error (PHP 4 >= 4.0.6) Retourne le message d’erreur FrontBase string fbsql_error (resource [link_identifier]) fbsql_error() retourne le dernier message d’erreur généré par le serveur FrontBase, ou bien ” (chaîne vide) si aucune erreur n’est survenue. Les erreurs générées par FrontBase ne sont pas automatiquement affichées comme alertes. Il faut utiliser la fonction fbsql_errno() pour connaître leur code d’erreur. Notez que cette fonction ne retourne que le code d’erreur généré par la 321 FrontBase dernière fonction FrontBase (hormis fbsql_error() et fbsql_errno()) : si vous voulez repérer les erreurs, faites le dès que les fonctions ont été appelées. <?php fbsql_connect("marliesle"); echo fbsql_errno().": ".fbsql_error()."<br>"; fbsql_select_db("nonexistentdb"); echo fbsql_errno().": ".fbsql_error()."<br>"; $conn = fbsql_query("SELECT * FROM nonexistenttable;"); echo fbsql_errno().": ".fbsql_error()."<br>"; ?> Voir aussi fbsql_errno() et fbsql_warnings() fbsql_fetch_array (PHP 4 >= 4.0.6) Lit toute une ligne de résultat dans un tableau. array fbsql_fetch_array (resource result, int [result_type]) fbsql_fetch_array() retourne un tableau contenant la ligne courante du résultat result, ou FALSE s’il n’y a plus de lignes. fbsql_fetch_array() est une version améliorée de fbsql_fetch_row(). En plus de stocker les données dans un tableau à indice numérique, elle les stocke aussi sous forme de tableau associatif, dont les indices sont les noms des colonnes. SI deux colonnes (ou plus) on le même nom, la dernière colonne sera utilisée. Pour accéder aux autres colonnes de même nom, vous devez absolument utiliser les indices numériques. select t1.f1 as foo t2.f1 as bar from t1, t2; Il est important de noter que fbsql_fetch_array() n’est pas significativement plus lent que fbsql_fetch_row(), tandis qu’elle apporte un confort d’utilisation notable. Le second argument optionnel result_type de fbsql_fetch_array() est une constante qui peut prendre l’une des valeurs suivantes : FBSQL_ASSOC, FBSQL_NUM et FBSQL_BOTH. Pour plus de détails, reportez-vous à fbsql_fetch_row() et fbsql_fetch_assoc(). Exemple 1. Exemple avec fbsql_fetch_array() <?php fbsql_connect($host, $user, $password); $result = fbsql_db_query("database","select user_id, fullname from table"); while ($row = fbsql_fetch_array($result)) { echo "user_id: ".$row["user_id"]."<br>\n"; echo "user_id: ".$row[0]."<br>\n"; echo "fullname: ".$row["fullname"]."<br>\n"; echo "fullname: ".$row[1]."<br>\n"; } fbsql_free_result($result); ?> 322 FrontBase fbsql_fetch_assoc (PHP 4 >= 4.0.6) Lit toute une ligne de résultat dans un tableau associatif array fbsql_fetch_assoc (resource result) fbsql_fetch_assoc() retourne un tableau associatif contenant la ligne courante du résultat result, ou FALSE s’il n’y a plus de lignes. fbsql_fetch_assoc() est équivalent à fbsql_fetch_array() avec l’option FBSQL_ASSOC. Elle ne retourne qu’un tableau associatif. C’est le comportement initial de fbsql_fetch_array(). Si vous avez aussi besoin des indices numériques, utilisez fbsql_fetch_array(). SI deux colonnes (ou plus) on le même nom, la dernière colonne sera utilisée. Pour accéder aux autres colonnes de même nom, vous devez absolument utiliser la fonction fbsql_fetch_array(). Il est important de noter que fbsql_fetch_assoc() n’est pas significativement plus lent que fbsql_fetch_row(), tandis qu’elle apporte un confort d’utilisation notable. Pour plus de détails, reportez-vous à fbsql_fetch_row() et fbsql_fetch_array(). Exemple 1. Exemple avec fbsql_fetch_assoc() <?php fbsql_connect($host, $user, $password); $result = fbsql_db_query("database","select * from table;"); while ($row = fbsql_fetch_assoc($result)) { echo $row["user_id"]; echo $row["fullname"]; } fbsql_free_result($result); ?> fbsql_fetch_field (PHP 4 >= 4.0.6) Lit des informations sur une colonne dans un résultat, et retourne un objet object fbsql_fetch_field (resource result, int [field_offset]) fbsql_fetch_field() retourne une objet contenant les informations sur un champs, dans le résultat result. fbsql_fetch_field() sert à lire des informations sur les champs dans le résultat result. Si le second paramètre field_offset n’est pas spécifié, le champs suivant est lu. Les propriétés de l’objet sont : • name - Nom de colonne • table - Nom de la table d’origine • max_length - Taille maximale de la colonne • not_null - 1 si la colonne ne peut être nulle • type - Type de la colonne 323 FrontBase Exemple 1. Exemple avec fbsql_fetch_field() <?php fbsql_connect($host, $user, $password) or die ("Impossible de se connecter"); $result = fbsql_db_query("database", "select * from table;") or die ("Query failed"); // lire les données de colonnes $i = 0; while ($i < fbsql_num_fields($result)) { echo "Information de la colonne $i:<br>\n"; $meta = fbsql_fetch_field($result); if (!$meta) { echo "Aucune information disponible<br>\n"; } echo "<PRE> max_length: $meta->max_length name: $meta->name not_null: $meta->not_null table: $meta->table type: $meta->type </PRE>"; $i++; } fbsql_free_result($result); ?> Voir aussi fbsql_field_seek(). fbsql_fetch_lengths (PHP 4 >= 4.0.6) Lit la taille de chaque colonne d’un résultat array fbsql_fetch_lengths ([resource result]) fbsql_fetch_lengths() retourne un tableau contenant les tailles maximales de chaque champs, dans la dernière ligne lue par fbsql_fetch_row() ou FALSE en cas d’erreur. fbsql_fetch_lengths() stocke les tailles de chaque ligne de résultat retourné par fbsql_fetch_row(), fbsql_fetch_array() et fbsql_fetch_object() dans un tableau à indices numériques, commençant à 0. Voir aussi fbsql_fetch_row(). fbsql_fetch_object (PHP 4 >= 4.0.6) Lit une ligne de résultat sous forme d’objet object fbsql_fetch_object (resource result, int [result_type]) fbsql_fetch_object() retourne un objet dont les propriétés représentent les colonnes de la ligne à lire, dans le résultat result, ou FALSE s’il n’y a pas de ligne à lire. fbsql_fetch_object() est similaire à fbsql_fetch_array(), à la différence qu’elle retourne un objet. Nous ne pouvez alors accéder aux données qu’avec les noms des colonnes, et sous la forme de membre d’objets, et non plus avec leurs offset (les nombres ne peuvent représenter un membre d’objet). Le second argument optionnel result_type de fbsql_fetch_array() est une constante qui peut prendre l’une des valeurs suivantes : FBSQL_ASSOC, FBSQL_NUM et FBSQL_BOTH. 324 FrontBase En terme de vitesse, cette fonction est identique à fbsql_fetch_array() et presque aussi rapide que fbsql_fetch_row() (la différence n’est pas significative). Exemple 1. Exemple avec fbsql_fetch_object() <?php fbsql_connect($host, $user, $password); $result = fbsql_db_query("database", "select * from table;"); while ($row = fbsql_fetch_object($result)) { echo $row->user_id; echo $row->fullname; } fbsql_free_result($result); ?> Voir aussi fbsql_fetch_array() et fbsql_fetch_row(). fbsql_fetch_row (PHP 4 >= 4.0.6) Lit une ligne de résultat sous forme de tableau numérique array fbsql_fetch_row (resource result) fbsql_fetch_row() retourne un tableau représentant la ligne courant dans le résultat result, ou bien FALSE s’il n’y a plus de lignes à lire. fbsql_fetch_row() lit une ligne de données dans le résultat result, et crée un tableau numérique. Chaque colonne est stockés dans un élément du tableau, dans le même ordre que dans le résultat. Les indices commencent à 0. Le prochain appel à fbsql_fetch_row() va lire la prochaine ligne, ou bien retourner FALSE s’il n’y a plus de lignes à lire. Voir aussi fbsql_fetch_array(), fbsql_fetch_object(), fbsql_data_seek(), fbsql_fetch_lengths() et fbsql_result(). fbsql_field_flags (PHP 4 >= 4.0.6) Lit les options associé à une colonne de résultat string fbsql_field_flags (resource result, int field_offset) fbsql_field_flags() retourne les options du champs field_offset, dans le résultat field_offset. Les options sont retournées sous la forme d’un seul mot par option, séparées par des espaces, de façons à faciliter la manipulation avec explode(). fbsql_field_name (PHP 4 >= 4.0.6) Lit le nom d’un champs string fbsql_field_name (int result, int field_index) fbsql_field_name() retourne le nom du champs numéro field_index dans le résultat result. field_index est le résultat de fbsql_query() et field_index est l’offset numérique du champs. Note : field_index commence à 0. e.g. L’index du troisème champs est 2, et l’index du quatrième champs est 3... 325 FrontBase Exemple 1. Exemple avec fbsql_field_name() <?php // La tablea utilisateur est constituée de trois colonnes // user_id // username // password. $res = fbsql_db_query("users", "select * from users;", $link); echo fbsql_field_name($res, 0) . "\n"; echo fbsql_field_name($res, 2); ?> L’exemple ci-dessus va afficher : user_id password fbsql_field_len (PHP 4 >= 4.0.6) Retourne la taille d’un champs int fbsql_field_len (resource result, int field_offset) fbsql_field_len() retourne la taille du champs field_offset dans le résultat result. fbsql_field_seek (PHP 4 >= 4.0.6) Déplace le pointeur de résultat boolean fbsql_field_seek (int result, int field_offset) fbsql_field_seek() place le pointeur de colonne à la colonne field_offset. Si ce paramètre est omis, fbsql_fetch_field() retourne le numéro de colonne courant. Voir aussi fbsql_fetch_field(). fbsql_field_table (PHP 4 >= 4.0.6) Lit le nom de la table d’origine d’un champs string fbsql_field_table (resource result, int field_offset) fbsql_field_table() retourn le nom de la table d’où est issue le champs d’offset field_offset. Les numéros de colonne commencent à 0. 326 FrontBase fbsql_field_type (PHP 4 >= 4.0.6) Lit le type d’une colonne string fbsql_field_type (resource result, int field_offset) fbsql_field_type() est similaire à la fonction fbsql_field_name(). Les arguments sont identiques, mais le type du champs est retourné. Il peut valoir "int", "real", "string", "blob" ou d’autres valeurs, comme décrit dans la documentation FrontBase (http://www.frontbase.com/cgi-bin/WebObjects/FrontBase.woa/wa/productsPage?currentPage=Documentation). Exemple 1. Exemple avec fbsql_field_type() <?php fbsql_connect("localhost:3306"); fbsql_connect("localhost", "_SYSTEM", ""); $result = fbsql_query("SELECT * FROM onek;"); $fields = fbsql_num_fields($result); $rows = fbsql_num_rows($result); $i = 0; $table = fbsql_field_table($result, $i); echo "Votre table ’".$table."’ a ".$fields." colonnes et ".$rows." lignes <br>"; echo "La table dispose des champs suivants <br>"; while ($i < $fields) { $type = fbsql_field_type ($result, $i); $name = fbsql_field_name ($result, $i); $len = fbsql_field_len ($result, $i); $flags = fbsql_field_flags($result, $i); echo $type." ".$name." ".$len." ".$flags."<br>"; $i++; } fbsql_close(); ?> fbsql_free_result (PHP 4 >= 4.0.6) Libère le résultat de la mémoire bool fbsql_free_result (resource result) fbsql_free_result() va libérer toute la mémoire utilisée par le résultat associé à la ressource result. fbsql_free_result() n’a besoin d’être appelé que si vous craignez que votre script ne va consommer trop de mémoire, lorsqu’une requête retourne de très grand résultats. Toutes les ressources mémoire utilisées par le script sont de toutes manières libérées à la fin du script. fbsql_insert_id (PHP 4 >= 4.0.6) Lit le dernier identifiant généré par une requête INSERT int fbsql_insert_id (resource [link_identifier]) fbsql_insert_id() retourne l’identifiant généré par la colonne de type DEFAULT UNIQUE, lors de la dernière requête INSERT, avec la connexion link_identifier. Si link_identifier est omis, la dernière connexion ouverte est utilisée. 327 FrontBase fbsql_insert_id() retournera 0 si la dernière requête n’a pas généré de valeur dans la colonne DEFAULT UNIQUE Si vous devez sauver cette valeur pour plus tard, n’oubliez pas d’appeler fbsql_insert_id() tout de suite après la requête qui a généré cette valeur. Note : La valeur de la fonction FrontBase SQL "LAST_INSERT_ID()" retourne toujours la dernière valeur générée par DEFAULT UNIQUE et n’est jamais annulée entre les requêtes. fbsql_list_dbs (PHP 4 >= 4.0.6) Liste les bases de données resource fbsql_list_dbs (resource [link_identifier]) fbsql_list_dbs() retourne un résultat contenant la liste des bases de données disponibles sur le serveur [link_identifier]. Utilisez la fonction fbsql_tablename() pour passer en revue ce résultat. Exemple 1. Exemple avec fbsql_list_dbs() <?php $link = fbsql_connect(’localhost’, ’myname’, ’secret’); $db_list = fbsql_list_dbs($link); while ($row = fbsql_fetch_object($db_list)) { echo $row->Database . "\n"; } ?> L’exemple ci-dessus va afficher ceci : database1 database2 database3 .. Note : L’exemple ci-dessus peut aussi bien fonctionner avec la fonction fbsql_fetch_row() ou toute autre similaire. fbsql_list_fields (PHP 4 >= 4.0.6) Liste les champs d’un résultat FrontBase resource fbsql_list_fields (string database_name, string table_name, resource [link_identifier]) fbsql_list_fields() lit les informations à propos de la table table_name, dans la base de données table_name, sur la connexion link_identifier. Un résultat de requête est retourné, et pourra être utilisé avec les fonctions fbsql_field_flags(), fbsql_field_len(), fbsql_field_name() et fbsql_field_type(). Un identifiant de résultat est une ressource PHP, représentée par un entier positif. fbsql_list_fields() retourne -1 en cas d’erreur. Une chaîne décrivant l’erreur sera alors placée dans la variable $phperrmsg. Un message d’erreur sera aussi affiché, à moins que la fonction n’ai été appelée avec l’opérateur de suppression des erreurs @. 328 FrontBase Exemple 1. Exemple avec fbsql_list_fields() <?php $link = fbsql_connect(’localhost’, ’myname’, ’secret’); $fields = fbsql_list_fields("database1", "table1", $link); $columns = fbsql_num_fields($fields); for ($i = 0; $i < $columns; $i++) { echo fbsql_field_name($fields, $i) . "\n";; } ?> L’exemple ci-dessus va afficher : field1 field2 field3 .. fbsql_list_tables (PHP 4 >= 4.0.6) Liste les tables dans une base de données FrontBase resource fbsql_list_tables (string database, resource [link_identifier]) fbsql_list_tables() liste les tables dans la base de données database, et retourne un résultat, tout comme fbsql_db_query(). fbsql_tablename() sert à extraire la liste des tables dans ce résultat. fbsql_next_result (PHP 4 >= 4.0.6) Déplace le pointeur interne vers le résultat suivant bool fbsql_next_result (resource result_id) Lorsque vous envoyez plus d’une commande SQL au serveur, ou que vous exécutez une procédure stockée avec de multiple résultats, cela va conduire le serveur à retourner plusieurs jeu de lignes. fbsql_next_result() va vérifier l’existence de plusieurs résultats disponibles sur le serveur. Si un autre jeu de résultat existe, fbsql_next_result() va détruire de résultat précédent, et préparer la lecture dans les nouvelles lignes. fbsql_next_result() retourne TRUE si un autre résultat est disponbile, ou FALSE sinon. Exemple 1. Exemple avec fbsql_next_result() <?php $link = fbsql_connect("localhost", "_SYSTEM", "secret"); fbsql_select_db("MyDB", $link); $SQL = "Select * from table1; select * from table2;"; $rs = fbsql_query($SQL, $link); do { while ($row = fbsql_fetch_row($rs)) {} } while (fbsql_next_result($rs)); fbsql_free_result($rs); fbsql_close($link); ?> 329 FrontBase fbsql_num_fields (PHP 4 >= 4.0.6) Lit le nombre de champs dans un résultat int fbsql_num_fields (resource result) fbsql_num_fields() retourne le nombre de champs dans le résultat result. Voir aussi fbsql_db_query(), fbsql_query(), fbsql_fetch_field() et fbsql_num_rows(). fbsql_num_rows (PHP 4 >= 4.0.6) Lit le nombre de lignes dans un résultat int fbsql_num_rows (resource result) fbsql_num_rows() retourne le nombre de lignes dans le résultat result. Cette fonction n’est valable qu’avec les commandes SELECT. Pour connaître le nombre de lignes dans une requête INSERT, UPDATE ou DELETE, utilisez fbsql_affected_rows(). Exemple 1. Exemple fbsql_num_rows() <?php $link = fbsql_connect("localhost", "username", "password"); fbsql_select_db("database", $link); $result = fbsql_query("SELECT * FROM table1;", $link); $num_rows = fbsql_num_rows($result); echo "$num_rows Rows\n"; ?> Voir aussi fbsql_affected_rows(), fbsql_connect(), fbsql_select_db() et fbsql_query(). fbsql_pconnect (PHP 4 >= 4.0.6) Ouvre une connexion persistante à un serveur FrontBase resource fbsql_pconnect (string [hostname] [, string username [, string password]]) fbsql_pconnect() retourne une ressource représentant la connection au serveur FrontBase en cas de succès, ou bien FALSE en cas d’erreur. fbsql_pconnect() établit une connexion persistante à un serveur FrontBase. En cas d’omission, les valeurs suivantes sont utilisées par défaut : host =’localhost’, username = nom de l’utilisateur qui possède le processus, et password = pas de mot de passe. Pour choisir le port d’accès au serveur FrontBase, voyez fbsql_select_db(). fbsql_pconnect() se comporte comme fbsql_connect() avec deux différences majeures. Premièrement, lors de la connexion, fbsql_pconnect() essaie de trouver une connexion permanante déjà ouverte sur cet hote, avec le même nom d’utilisateur et de mot de passe. Si une telle connexion est trouvée, son identifiant est retourné, sans ouvrir de nouvelle connexion. Deuxièmement, la connexion au serveur MySQL ne sera pas terminée avec la fin du script. Au lieu de cela, le lien sera conservé pour un prochain accès (fbsql_close() ne terminera pas une connexion persistante établie par fbsql_pconnect()). C’est pourquoi ce type de connexion est dite ’persistante’. 330 FrontBase fbsql_query (PHP 4 >= 4.0.6) Exécute une requête sur un serveur FrontBase resource fbsql_query (string query [, resource link_identifier]) fbsql_query() envoie la requête query à la base de données courante, sur le serveur représenté par sa connexion link_identifier. Si link_identifier est omis, la dernière connexion ouverte est utilisée. Si aucune connexion n’a été ouverte, fbsql_query() essaie d’établir une connexion en appelant la fonction fbsql_connect() sans aucun argument. Note : La requête doit être terminée par un point-virgule! fbsql_query() retourne une ressource en cas de succès, ou FALSE, en cas d’échec. La requête suivante est invalide, et fbsql_query() échouera puis retournera FALSE: Exemple 1. Exemple avec fbsql_query()(1) <?php $result = fbsql_query("SELECT * WHERE 1=1;") or die("Requête invalide"); ?> La requête suivante est invalide si my_col n’est pas une colonne dans la table my_tbl : fbsql_query() échouera puis retournera FALSE : Exemple 2. Exemple avec fbsql_query()(2) <?php $result = fbsql_query("SELECT my_col FROM my_tbl") or die ("Invalid query"); ?> fbsql_query() échouera si vous n’avez pas les droits d’accès sur l’une des bases de données utilisée dans la requête. Lorsque la requête réussit, vous pouvez utilisez fbsql_num_rows() pour savoir combien de lignes ont été retournée par une requête SELECT, ou bien fbsql_affected_rows() pour les autres requêtes (DELETE, INSERT, REPLACE et UPDATE). Pour les requêtes SELECT, fbsql_query() retourne une ressource de résultat, que vous pouvez passer à fbsql_result(). Lors vous avez fini de lire le résultat, vous pouvez libérer les ressources utilisées en appelant fbsql_free_result(). Cependant, la mémoire sera automatiquement libérée à la fin du script. Voir aussi fbsql_affected_rows(), fbsql_db_query(), fbsql_free_result(), fbsql_result(), fbsql_select_db() et fbsql_connect(). fbsql_result (PHP 4 >= 4.0.6) Lit des données dans un résultat mixed fbsql_result (resource result, int row, mixed [field]) fbsql_result() lit le contenu du champs field, dans la ligne row, du résultat result. L’argument field peut être l’offset du champs, ou bien son nom, ou bien le nom de sa table plus point plus son nom. Si la colonne a été aliasée, utilisez de préférence l’alias. 331 FrontBase Lorsque vous travaillez sur de grands résultats, il est vivement recommandé d’utiliser les fonctions qui lisent toute une ligne d’un coup, plutôt que fbsql_result() qui travaille ligne par ligne. Elles sont beaucoup plus rapides. Notez aussi que les offset numériques sont plus rapides que les offset nominaux. L’utilisation de fbsql_result() ne doivent pas être mélangé avec d’autres fonctions qui utilisent aussi le résultat result. Alternative vivement recommandées : fbsql_fetch_row(), fbsql_fetch_array() et fbsql_fetch_object(). fbsql_select_db (PHP 4 >= 4.0.6) Sélectionne une base de données FrontBase resource fbsql_select_db (string database_name, resource [link_identifier]) fbsql_select_db() retourne TRUE en cas de succès et FALSE en cas d’erreur. fbsql_select_db() remplace la base de données active courante par database_name, sur la connexion ouverte et représentée par link_identifier. Si link_identifier est omis, la dernière connexion ouverte sera utilisée. Si aucune connexion n’a été ouverte, fbsql_select_db() essaiera de se connecter en appelant fbsql_connect() sans argument. Le client contacte FBExec pour connaître le numéro de port à utiliser pour la connexion à la base de données. Si le nom de la base est un numéro, le système l’utilisera comme numéro de port, et ne le demandera pas à FBExec. Le serveur Frontbase peut être démarré avec la commande : FRontBase -FBExec=No -port=<port number> <database name>. Tous les prochains appel à fbsql_query() se feront dans la base database_name. Voir aussi fbsql_connect(), fbsql_pconnect() et fbsql_query(). fbsql_tablename (unknown) Lit le nom de la table d’un champs string fbsql_tablename (resource result, int i) fbsql_tablename() retourne le nom de la table d’origine du champs i, dans le résultat result. La fonction fbsql_num_rows() peut être utilisée pour connaître le nombre de tables dans un résultat. Exemple 1. Exemple avec fbsql_tablename() <?php fbsql_connect("localhost:3306"); $result = fbsql_list_tables("wisconsin"); $i = 0; while ($i < fbsql_num_rows($result)) { $tb_names[$i] = fbsql_tablename($result, $i); echo $tb_names[$i] . "<br>"; $i++; } ?> fbsql_warnings (PHP 4 >= 4.0.6) Active ou désactive les alertes FrontBase boolean fbsql_warnings (boolean [OnOff]) 332 FrontBase fbsql_warnings() retourne TRUE si les alertes sont actives et FALSE en cas d’erreur. fbsql_warnings() active ou désactive les alertes FrontBase suivant que OnOff est à TRUE ou FALSE. 333 XXV. FilePro Ces fonctions permettent de lire des données enregistrées dans des bases non modifiables, sur des serveurs filePro. filePro est une marque de fP Technologies, Inc. Vous pouvez avoir plus de détails sur filePro à http://www.fptech.com/. 334 FilePro filepro (PHP 3, PHP 4 >= 4.0b1) Lit et vérifie un fichier. bool filepro (string directory) filepro() lit et vérifie un fichier, puis enregistre le nombre de champs et de lignes. Aucun verrouillage n’est pratiqué : il vaut alors mieux ne pas modifier la base filePro lorsqu’elle est ouverte par PHP. filepro_fieldname (PHP 3, PHP 4 >= 4.0b1) Retourne le nom d’un champs. string filepro_fieldname (int field_number) filepro_fieldname() retourne le nom du champs d’index field_number. filepro_fieldtype (PHP 3, PHP 4 >= 4.0b1) Retourne le type d’un champs. string filepro_fieldtype (int field_number) Retourne le type du champs d’index field_number. filepro_fieldwidth (PHP 3, PHP 4 >= 4.0b1) Retourne la taille d’un champs. int filepro_fieldwidth (int field_number) Retourne la taille du champs d’index field_number. filepro_retrieve (PHP 3, PHP 4 >= 4.0b1) Retourne la valeur d’un champs. string filepro_retrieve (int row_number, int field_number) filepro_retrieve() retourne la valeur du champs d’index row_number, et à la ligne field_number. filepro_fieldcount (PHP 3, PHP 4 >= 4.0b1) Retourne le nombre de champs dans une base filePro. int filepro_fieldcount (void) 335 FilePro filepro_fieldcount() retourne le nombre de champs (ou colonnes) d’une base filePro. Voir aussi filepro(). filepro_rowcount (PHP 3, PHP 4 >= 4.0b1) Retourne le nombre de champs dans une base filePro. int filepro_rowcount (void) filepro_rowcount() retourne le nombre de lignes dans une base filePro. Voir aussi filepro(). 336 XXVI. Système de fichiers 337 Système de fichiers basename (PHP 3, PHP 4 >= 4.0b1) Sépare le nom du fichier et le nom du dossier. string basename (string path) basename() prend en paramètre le chemin complet d’un fichier et en extrait le nom du fichier. Sous Windows, les caractères (/) et antislash (\) sont utilisés comme séparateurs de dossier. Sous les autres OS, seul le caractère slash (/) est utilisé. Exemple 1. Exemple avec basename() <?php $path = "/home/httpd/html/index.php3"; $file = basename($path); // $file est affecté avec "index.php3" ?> Voir aussi dirname(). chgrp (PHP 3, PHP 4 >= 4.0b1) Change le groupe possesseur du fichier. int chgrp (string filename, mixed group) chgrp() essaie de changer le groupe propriétaire du fichier. Seul le super-utilisateur (root) peut changer le groupe propriétaire d’un fichier arbitrairement. Les utilisateurs classiques ne peuvent changer le groupe propriétaire d’un fichier que si l’utilisateur propriétaire du fichier est membre du groupe. chgrp() renvoie TRUE en cas de succès, sinon renvoie FALSE. Voir aussi chown() et chmod(). Note : chgrp() ne fonctionne pas sous Windows. chmod (PHP 3, PHP 4 >= 4.0b1) Change le mode du fichier. int chmod (string filename, int mode) chmod() remplace le mode du fichier filename par le mode mode. Il est à noter que le mode mode est considéré comme un nombre en notation octale. Afin de vous en assurer, vous pouvez préfixer cette valeur par un zéro (mode): <?php chmod( "/somedir/somefile", 755 ); // notation décimale; probablement FALSE chmod( "/somedir/somefile", 0755 ); // notation octale; valeur du mode correcte ?> 338 Système de fichiers chmod() renvoie TRUE en cas de succès, FALSE sinon. Voir aussi chown() et chgrp(). Note : chmod() ne fonctionne pas sous Windows. chown (PHP 3, PHP 4 >= 4.0b1) Change le groupe propriétaire du fichier. int chown (string filename, mixed user) chown() change le groupe propriétaire du fichier. Seul le super-utilisateur (root) peut changer le propriétaire arbitrairement d’un fichier. chown() renvoie TRUE en cas de succès, "FALSE" sinon. Note : Sous Windows, chown() ne fait rien et retourne TRUE. Voir aussi chown() et chmod(). Note : chown() est inopérante sous Windows. clearstatcache (PHP 3, PHP 4 >= 4.0b1) Efface le cache de stat() void clearstatcache (void) L’appel à la fonction stat ou lstat est relativement coÛteux en terme de temps d’exécution. Pour cela, le résultat du dernier appel à l’une des fonctions de statut, (voir la liste ci-dessous), est sauvegardé pour ré-utilisation ultérieure. Si vous voulez forcer la vérification du statut d’un fichier, dans le cas où le fichier aurait pu être modifié ou aurait disparu, vous devez utiliser la fonction clearstatcache() afin d’effacer de la mémoire les résultats du dernier appel à la fonction. La valeur du cache n’est valable que pour la durée d’une requête. Les fonctions affectées sont : stat(), lstat(), file_exists(), is_writable(), is_readable(), is_executable(), is_file(), is_dir(), is_link(), filectime(), fileatime(), filemtime(), fileinode(), filegroup(), fileowner(), filesize(), filetype(), et fileperms(). copy (PHP 3, PHP 4 >= 4.0b1) Copie un fichier. int copy (string source, string dest) copy() fait une copie du fichier. Elle renvoie TRUE en cas de succès, FALSE sinon. 339 Système de fichiers Exemple 1. Exemple avec copy() if ( !copy($file, $file.’.bak’) ) { print("La copie du fichier $file n’a pas réussi...<br>\n"); } Voir aussi rename(). delete (unknown) Effacer void delete (string file) Ceci est une fausse entrée du manuel pour ceux qui recherchent en fait la fonction unlink() ou unset(). Voir aussi unlink() pour effacer des fichiers et unset() pour effacer des variables. dirname (PHP 3, PHP 4 >= 4.0b1) Renvoie le nom du dossier. string dirname (string path) Si path contient le chemin d’un fichier ou dossier, dirname() retournera le nom du dossier qui le contient. Sous Windows, les slash (/) et anti-slash (\) sont utilisés comme séparateurs de dossier. Dans les autres environnements, seul le slash (/) est utilisé. Exemple 1. Exemple avec dirname() <?php $path = "/etc/passwd"; $file = dirname($path); // $file contient "/etc" ?> Voir aussi basename(). diskfreespace (PHP 3>= 3.0.7, PHP 4 >= 4.0b4) Renvoie l’espace disque disponible dans le répertoire. float diskfreespace (string directory) diskfreespace() retournera le nombre d’octets disponibles sur le disque correspondant contenant le dossier directory. 340 Système de fichiers Exemple 1. Exemple avec diskfreespace() <?php $df = diskfreespace("/"); // $df contient le nombre d’octets libres sur "/" ?> disk_total_space (PHP 4 CVS only) Retourne la taille d’un dossier float disk_total_space (string directory) disk_total_space() lit récursivement toutes les tailles du dossier directory et retourne la somme. directory peut être aussi une partition de disque. Exemple 1. Exemple avec disk_total_space() <?php $df = disk_total_space("/"); // $df contient le nombre d’octets libres // dans le dossier "/" ?> fclose (PHP 3, PHP 4 >= 4.0b1) Ferme un fichier. bool fclose (resource fp) fclose() ferme le fichier fp. fclose() retourne TRUE en cas de succès, et FALSE en cas d’échec. Le pointeur de fichier doit être valide, et avoir été correctement ouvert par fopen() ou fsockopen(). feof (PHP 3, PHP 4 >= 4.0b1) Teste la fin du fichier. int feof (resource fp) feof() retourne TRUE si le pointeur fp est à la fin du fichier, ou si une erreur survient, sinon, retourne FALSE. Le pointeur de fichier doit être valide, et avoir été correctement ouvert par fopen(), popen(), ou fsockopen(). 341 Système de fichiers fflush (PHP 4 >= 4.0.1) Envoi tout le contenu généré dans un fichier int fflush (resource fp) fflush() force l’écriture de toutes les données bufferisées dans le fichier désigné par fp. fflush() retourne TRUE en cas de succès, et FALSE sinon. fp est un pointeur de fichier ouvert avec fopen(), popen(), ou fsockopen(). fgetc (PHP 3, PHP 4 >= 4.0b1) Renvoie le caractère que pointe le pointeur du fichier. string fgetc (resource fp) fgetc() retourne une chaîne contenant un seul caractère, lu depuis le fichier pointé par fp. fgetc() retourne FALSE à la fin du fichier (tout comme feof()). Le pointeur de fichier doit être valide, et avoir été correctement ouvert par fopen(), popen(), ou fsockopen(). Voir aussi fread(), fopen(), popen(), fsockopen() et fgets(). fgetcsv (PHP 3>= 3.0.8, PHP 4 >= 4.0b1) Renvoie la ligne courante et cherche les champs CSV array fgetcsv (resource fp, int length, string [delimiter]) Identique à fgets() mais fgetcsv() analyse la ligne qu’il lit et recherche les champs CSV, qu’il va retourner dans un tableau les contenant. Le délimiteur de champs delimiter est la virgule, à moins que vous ne fournissiez un troisième argument. fp doit être un pointeur valide, et avoir été correctement ouvert par fopen(), popen(), ou fsockopen(). length doit être plus grand que la plus grande ligne trouvée dans un fichier CSV (en comptant les caractères de fin de ligne). fgetcsv() retourne FALSE en cas d’erreur, ou en cas de fin du fichier. Note : une ligne vide dans un fichier CSV sera retournée dans le tableau comme une chaîne vide, et ne sera pas traitée comme une erreur. Exemple 1. Exemple avec fgetcsv() <?php $row = 1; $fp = fopen ("test.csv","r"); while ($data = fgetcsv ($fp, 1000, ",")) { $num = count ($data); print "<p> $num champs dans la ligne $row: <br>"; $row++; for ($c=0; $c<$num; $c++) { print $data[$c] . "<br>"; } } fclose ($fp); ?> 342 Système de fichiers fgets (PHP 3, PHP 4 >= 4.0b1) Renvoie la ligne courante sur laquelle se trouve le pointeur du fichier. string fgets (int fp, int length) fgets() retourne la chaîne lue jusqu’à la longueur length - 1 octet, ou bien la fin du fichier, ou encore un retour chariot (le premier des trois qui sera rencontré). Si une erreur survient, fgets() retourne FALSE. Erreur courante : Les programmeurs habitués à la programmation ’C’ noteront que fgets() ne se comporte pas comme son équivalent C lors de la rencontre de la fin du fichier. fp doit être valide, et avoir été correctement ouvert par fopen(), popen(), ou fsockopen(). Un exemple simple : Exemple 1. Lecture d’un fichier ligne par ligne <?php $fd = fopen ("/tmp/inputfile.txt", "r"); while (!feof($fd)) { $buffer = fgets($fd, 4096); echo $buffer; } fclose ($fd); ?> Voir aussi fread(), fopen(), popen(), fgetc(), fsockopen() et socket_set_timeout(). fgetss (PHP 3, PHP 4 >= 4.0b1) Renvoie la ligne courante sur laquelle se trouve le pointeur du fichier et élimine les balises HTML string fgetss (int fp, int length, string [allowable_tags]) Identique à fgets(), mais fgetss() supprime toutes les balises HTML et PHP qu’il trouve dans le texte lu. Vous pouvez aussi préciser les balises qui seront ignorées dans le troisième paramètre, optionnel. Note : allowable_tags a été ajouté dans PHP 3.0.13, PHP 4B3. Voir aussi fgets(), fopen(), fsockopen(), popen() et strip_tags(). file (PHP 3, PHP 4 >= 4.0b1) Lit le fichier et renvoie le résultat dans un tableau. array file (string filename [, int use_include_path]) Identique à readfile(), hormis le fait que file() retourne le fichier dans un tableau. Chaque élément du tableau correspond à une ligne du fichier, et les retour-chariots sont placés en fin de ligne. 343 Système de fichiers Vous pouvez utiliser l’option use_include_path : en la mettant à "1", vous rechercherez aussi dans le dossier include_path. <?php // Lire une page web dans un tableau, et l’afficher $fcontents = file( ’http://www.php.net’ ); while ( list( $numero_ligne, $ligne ) = each( $fcontents ) ) { echo "<B>Ligne $numero_ligne:</B> ".htmlspecialchars( $ligne ) . "<br>\n"; } // lire une page web dans une chaîne $fcontents = join( ”, file( ’http://www.php.net’ ) ); ?> Voir aussi readfile(), fopen(), fsockopen() et popen(). file_exists (PHP 3, PHP 4 >= 4.0b1) Vérifie si un fichier existe. int file_exists (string filename) file_exists() retourne TRUE si le fichier filename existe, et FALSE sinon. file_exists() ne fonctionne pas sur les fichiers distants. Les fichiers doivent être accessibles par le système de fichier du serveur. Le résultat de file_exists() est mis en cache. Reportez-vous à clearstatcache() pour plus de détails. fileatime (PHP 3, PHP 4 >= 4.0b1) Renvoie la date à laquelle le fichier a été accédé pour la dernière fois. int fileatime (string filename) fileatime() renvoie la date à laquelle le fichier a été accédé pour la dernière fois, ou FALSE en cas d’erreur. fileatime() ne fonctionne pas sur les fichiers distants. Les fichiers doivent être accessibles par le système de fichier du serveur. Le résultat de fileatime() est mis en cache. Reportez-vous à clearstatcache() pour plus de détails. filectime (PHP 3, PHP 4 >= 4.0b1) Renvoie l’heure à laquelle l’inode a été accédé pour la dernière fois. int filectime (string filename) filectime() renvoie l’heure à laquelle l’inode filename a été accédé pour la dernière fois, ou FALSE en cas d’erreur. filectime() ne fonctionne pas sur les fichiers distants. Les fichiers doivent être accessibles par le système de fichier du serveur. Note: Sur la plupart des serveurs UNIX, un fichier est considéré comme modifié si les données de son inode sont modifiées. C’est-à-dire lorsque les permissions (utilisateur, groupe ou autre) ont été modifiées. Voyez aussi filemtime() (que vous pourrez utiliser lorsque vous créerez des indications telles que "Dernière modification : " sur les pages web) et fileatime(). 344 Système de fichiers Notez aussi que sur certains systèmes UNIX, le ctime d’un fichier texte est considéré comme sa date de création. Cela est faux! Il n’y a pas de date de création de fichier sous la plupart des systèmes UNIX. Le résultat de filectime() est mis en cache. Reportez-vous à clearstatcache() pour plus de détails. filegroup (PHP 3, PHP 4 >= 4.0b1) Lire le nom du groupe int filegroup (string filename) filegroup() renvoie le groupe qui possède le fichier filename, ou FALSE en cas d’erreur. L’identifiant de groupe est retourné au format numérique, utilisez posix_getgrgid() pour retrouver le nom du groupe. filegroup() ne fonctionne pas sur les fichiers distants. Les fichiers doivent être accessibles par le système de fichier du serveur. Le résultat de filegroup() est mis en cache. Reportez-vous à clearstatcache() pour plus de détails. Note : filegroup() est inopérante sous Windows. fileinode (PHP 3, PHP 4 >= 4.0b1) Renvoie le numéro d’inode du fichier. int fileinode (string filename) fileinode() renvoie le numéro d’inode du fichier filename, ou FALSE en cas d’erreur. Le résultat de fileinode() est mis en cache. Reportez-vous à clearstatcache() pour plus de détails. fileinode() ne fonctionne pas sur les fichiers distants. Les fichiers doivent être accessibles par le système de fichier du serveur. Note : fileinode() est inopérante sous Windows. filemtime (PHP 3, PHP 4 >= 4.0b1) Renvoie la date de dernière modification du fichier. int filemtime (string filename) filemtime() renvoie la date de dernière modification du fichier filename, ou FALSE en cas d’erreur. Le résultat de filemtime() est mis en cache. Reportez-vous à clearstatcache() pour plus de détails. filemtime() ne fonctionne pas sur les fichiers distants. Les fichiers doivent être accessibles par le système de fichier du serveur. filemtime() retourne l’heure d’écriture des blocs données d’un fichier. Utilisez date() sur ce résultat pour obtenir une date de modification humainement lisible. 345 Système de fichiers fileowner (PHP 3, PHP 4 >= 4.0b1) Renvoie le nom du propriétaire du fichier. int fileowner (string filename) fileowner() renvoie le nom du possesseur du fichier filename, ou FALSE en cas d’erreur. L’identification du possesseur de fichier est numérique : il faut utiliser posix_getpwuid() pour retrouver le nom d’utilisateur. fileowner() ne fonctionne pas sur les fichiers distants. Les fichiers doivent être accessibles par le système de fichier du serveur. Le résultat de fileowner() est mis en cache. Reportez-vous à clearstatcache() pour plus de détails. Note : fileowner() est inopérante sous Windows. fileperms (PHP 3, PHP 4 >= 4.0b1) Renvoie les permissions affectées au fichier. int fileperms (string filename) fileperms() renvoie les permissions affectées au fichier filename, ou FALSE en cas d’erreur. fileperms() ne fonctionne pas sur les fichiers distants. Les fichiers doivent être accessibles par le système de fichier du serveur. Le résultat de fileperms() est mis en cache. Reportez-vous à clearstatcache() pour plus de détails. filesize (PHP 3, PHP 4 >= 4.0b1) Renvoie la taille du fichier. int filesize (string filename) filesize() renvoie la taille du fichier filename, ou FALSE en cas d’erreur. filesize() ne fonctionne pas sur les fichiers distants. Les fichiers doivent être accessibles par le système de fichier du serveur. Le résultat de filesize() est mis en cache. Reportez-vous à clearstatcache() pour plus de détails. filetype (PHP 3, PHP 4 >= 4.0b1) Retourne le type de fichier string filetype (string filename) filetype() renvoie le type du fichier filename. Les réponses possibles sont : fifo, char, dir, block, link, file, et unknown. filetype() retourne FALSE en cas d’erreur. filetype() ne fonctionne pas sur les fichiers distants. Les fichiers doivent être accessibles par le système de fichier du serveur. Le résultat de filetype() est mis en cache. Reportez-vous à clearstatcache() pour plus de détails. 346 Système de fichiers flock (PHP 3>= 3.0.7, PHP 4 >= 4.0b1) Verrouille le fichier. boolean flock (int fp, int operation) PHP dispose d’un système complet de verrouillage de fichiers. Tous les programmes qui accèdent au fichier doivent utiliser la même méthode de verrouillage pour qu’il soit efficace. flock() agit sur le fichier fp qui doit avoir été ouvert au préalable. operation est une des valeurs suivantes : • Acquisition d’un verrou : operation = 1. • Acquisition d’un verrou exclusif (écriture), operation = 2. • Libération d’un verrou (partagé ou exclusif), operation = 3. • Si vous voulez que flock() ne se bloque pas durant le verrouillage, ajoutez 4 à operation. flock() permet de réaliser un système simple de verrous écriture / lecture, qui peut être utilisé sur n’importe quelle plate-forme (Unix et Windows compris). flock() retourne TRUE en cas de succès, et FALSE sinon. (le verrou n’a pas pu être obtenu). Avertissement Sur la plupart des OS, flock() est implémenté au niveau processus. Lors de l’utilisation des API d’un serveur multi-thread, comme ISAPI, vous ne pouvez pas vous fier à flock() pour protéger vos fichiers contre des accès concurrents du même serveur. fopen (PHP 3, PHP 4 >= 4.0b1) Ouverture d’un fichier ou d’une URL. int fopen (string filename, string mode, int [use_include_path]) Si filename commence par "http://" (insensible à la casse), une connexion HTTP 1.x est ouverte avec le serveur spécifié, et un pointeur sur la réponse fournie est retourné. Une en-tête ’Host:’ est envoyé avec la requête, afin de gérer les virtual hosts basés sur les noms. Notez que le pointeur de fichier retourné représente le corps de la réponse, et qu’il n’est pas possible d’accéder aux en-têtes HTTP avec cette fonction. Les versions antérieures à PHP 4.0.6, ne gère pas les redirections automatiques, ce qui oblige à ajouter les slash finaux "/" pour indiquer un dossier. Si filename commence par "ftp://" (insensible à la casse), une connexion FTP est ouverte avec le serveur spécifié, et un pointeur sur la réponse fournie est retourné. Si le serveur ne supporte par le mode FTP passif, fopen() échouera. Vous pouvez ouvrir des fichiers en lecture seulement, ou en écriture seulement (le full duplex n’est pas supporté). Si filename commence par "php://stdin", "php://stdout", ou "php://stderr", le flot correspondant sera ouvert. (Cela a été introduit en PHP 3.0.13; dans les anciennes versions, les fichiers "/dev/stdin" ou "/dev/fd/0" devaient être utilisés pour accéder à ces flots). Si filename commence par n’importe quoi d’autre, PHP tentera de lire ce fichier dans le système local, et un pointeur sur le fichier ouvert sera retourné. Si l’ouverture échoue, fopen() retourne FALSE. mode peut prendre les valeurs suivantes : • ’r’ - Ouvre en lecture seule, et place le pointeur de fichier au début du fichier. 347 Système de fichiers • ’r+’ - Ouvre en lecture et écriture, et place le pointeur de fichier au début du fichier. • ’w’ - Ouvre en écriture seule; place le pointeur de fichier au début du fichier et réduit la taille du fichier à 0. Si le fichier n’existe pas, on tente de le créer. • ’w+’ - Ouvre en lecture et écriture; place le pointeur de fichier au début du fichier et réduit la taille du fichier à 0. Si le fichier n’existe pas, on tente de le créer. • ’a’ - Ouvre en écriture seule; place le pointeur de fichier à la fin du fichier file. Si le fichier n’existe pas, on tente de le créer. • ’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 créer. De plus, mode peut contenir la lettre ’b’. Cette option n’est utile que sur les systèmes qui font la différence entre les fichiers binaires et les fichiers textes (en bref, c’est une fonctionnalité Windows, totalement inutile sous Unix). S’il n’est pas nécessaire, il sera ignoré. Vous pouvez utiliser le troisième paramètre optionnel pour explorer le dossier include_path, en le mettant à 1. Exemple 1. Exemple avec fopen() <?php $fp = fopen("/home/rasmus/file.txt", "r"); $fp = fopen("http://www.php.net/", "r"); $fp = fopen("ftp://user:[email protected]/", "w"); ?> Si vous rencontrez des problèmes en lecture ou écriture de fichier et que vous utilisez PHP en version module de serveur, n’oubliez pas que les fichiers auxquels vous accédez ne sont pas nécessairement accessibles au processus serveur. Sous Windows, assurez-vous de bien échapper les anti-slash utilisés dans le chemin du fichier, ou bien utilisez des slash. <?php $fp = fopen("c:\\data\\info.txt", "r"); ?> Voir aussi fclose(), fsockopen(), socket_set_timeout() et popen(). fpassthru (PHP 3, PHP 4 >= 4.0b1) Affiche la partie du fichier située après le pointeur du fichier. int fpassthru (int fp) fpassthru() lit tout le reste d’un fichier jusqu’à la fin, et dirige le résultat vers la sortie standard. Si une erreur survient, fpassthru() retourne FALSE. Le pointeur de fichier doit être valide, et doit avoir été correctement ouvert par fopen(), popen(), ou fsockopen(). Après lecture, fpassthru() va fermer le fichier (le pointeur fp sera alors invalide). Si vous voulez simplement afficher le contenu d’un fichier, il suffit d’utiliser readfile(), ce qui épargnera l’appel à fopen(). Voir aussi readfile(), fopen(), popen() et fsockopen(). 348 Système de fichiers fputs (PHP 3, PHP 4 >= 4.0b1) Ecrit dans un fichier. int fputs (int fp, string str, int [length]) fputs() est un alias de fwrite(), et lui est identique en tous points. Notez que length est un paramètre optionnel, et s’il n’est pas spécifié, toute la chaîne est écrite. fread (PHP 3, PHP 4 >= 4.0b1) Lecture du fichier en mode binaire. string fread (int fp, int length) fread() lit jusqu’à length octets dans le fichier reférencé par fp. La lecture s’arrête lorsque length octets ont été lus, ou que l’on a atteint la fin du fichier, ou qu’une erreur survient (le premier des trois). <?php // Lit un fichier, et le place dans une chaîne $filename = "/usr/local/quelquechose.txt"; $fd = fopen($filename, "r"); $contents = fread($fd, filesize ($filename)); fclose($fd); ?> Note : Sur les systèmes qui différencient les fichiers textes et binaires (i.e. Windows) le fichier doit être ouvert avec la lettre ’b’ ajoutée au paramètre de mode de la fonction fopen(). Note : <?php $filename = "c:\\fichiers\\uneimage.gif"; $fd = fopen($filename, "rb"); $contents = fread($fd, filesize ($filename)); fclose($fd); ?> Voir aussi fwrite(), fopen(), fsockopen(), popen(), fgets(), fgetss(), file() et fpassthru(). fscanf (PHP 4 >= 4.0.1) Analyse un fichier en fonction d’un format mixed fscanf (int handle, string format [, string var1]) fscanf() est similaire à sscanf(), mais elle prend comme entrée un fichier, associé à handle et l’interprète en fonction du format format. Si seulement deux paramètres sont passés à la fonction, les valeurs analysées seront retournées sous 349 Système de fichiers forme de tableau. Si des arguments optionnels sont passés, la fonction retournera le nombre de valeurs assignées. Les options doivent être passées par référence. Exemple 1. Exemple fscanf() <?php $fp = fopen ("users.txt","r"); while ($userinfo = fscanf ($fp, "%s\t%s\t%s\n")) { list ($name, $profession, $countrycode) = $userinfo; //... traitement des données } fclose($fp); ?> Exemple 2. users.txt janus argonaute rodin sculpteur sam oncle leonard inventeur gr fr us it Voir aussi fread(), fgets(), fgetss(), sscanf(), printf() et sprintf(). fseek (PHP 3, PHP 4 >= 4.0b1) Modifie le pointeur de fichier. int fseek (int fp, int offset) fseek() modifie le curseur de position dans le fichier fp. La nouvelle position mesurée en octets à partir du début du fichier, est obtenue en additionnant la distance offset à la position whence. Ce paramètre peut prendre les valeurs suivantes : SEEK_SET - La position finale vaut offset octets. SEEK_CUR - La position finale vaut la position courante ajoutée à offset octets. SEEK_END - La position finale vaut la position courante par rapport à la fin du fichier, ajoutée de offset. Si whence n’est pas spécifiée, il vaut par défaut SEEK_SET. fseek() retourne TRUE en cas de succès, et sinon -1. Notez que positionner le pointeur au delà de la fin du fichier n’est pas une erreur. fseek() ne peut pas être utilisé sur les pointeurs retournés par fopen() s’ils sont au format HTTP ou FTP. Voir aussi ftell() et rewind(). fstat (PHP 4 >= 4.0RC1) Lit les informations sur un fichier à partir d’un pointeur de fichier array fstat (int fp) fstat() rassemble les informations sur le fichier dont on connaît le pointeur fp. fstat() est similaire à la fonction stat(), hormis le fait qu’elle utilise un pointeur de fichier, au lieu d’un nom de fichier. fstat() retourne un tableau avec les éléments suivants : • 1 : volume • 2 : inode 350 Système de fichiers • 3 : mode de protection du inode • 4 : nombre de liens • 5 : id de l’utilisateur propriétaire • 6 : id du groupe propriétaire • 7 : type du volume de l’inode * • 8 : taille en octets • 9 : date du dernier accès • 10 : date de la dernière modification • 11 : date du dernier changement • 12 : taille de bloc du système pour les entrées/sorties(*) • 13 : Nombre de blocs alloués * - uniquement sur les systèmes qui supportent le type st_blksize. Les autres systèmes (i.e. Windows) retournent -1. Les résultats de fstat() sont mis en cache. Reportez-vous à la fonction clearstatcache() pour plus de détails. ftell (PHP 3, PHP 4 >= 4.0b1) Renvoie la position du pointeur du fichier. int ftell (int fp) ftell() retourne la position courante du pointeur dans le fichier repéré par le pointeur fp, i.e., son offset. Si une erreur survient, retourne FALSE. Le pointeur de fichier doit être valide, et avoir été correctement ouvert par fopen() ou popen(). Voir aussi fopen(), popen(), fseek() et rewind(). ftruncate (PHP 4 >= 4.0RC1) Tronque un fichier. int ftruncate (int fp, int size) ftruncate() prend le pointeur de fichier fp et le tronque à la taille de size.ftruncate() retourne TRUE en cas de succès, et FALSE sinon. fwrite (PHP 3, PHP 4 >= 4.0b1) Ecriture du fichier en mode binaire. int fwrite (int fp, string string, int [length]) fwrite() écrit le contenu de la chaîne string dans le fichier pointé par fp. Si la longueur length est fournie, l’écriture s’arrêtera après length octets, ou à la fin de la chaîne (le premier des deux). Notez que si length est fourni, alors l’option de configuration magic_quotes_runtime sera ignorée, et les slash seront conservés. 351 Système de fichiers Note : De plus, mode peut contenir la lettre ’b’. Cette option n’est utile que sur les systèmes qui font la différence entre les fichiers binaires et les fichiers textes (en bref, c’est une fonctionnalité Windows, totalement inutile sous Unix). S’il n’est pas nécessaire, il sera ignoré. Voir aussi fread(), fopen(), fsockopen(), popen() et fputs(). set_file_buffer (PHP 3>= 3.0.8, PHP 4 >= 4.0.1) Fixe la bufferisation de fichier int set_file_buffer (int fp, int buffer) L’écriture de fichier avec fwrite() utilise normalement un buffer de 8K. Cela signifie que si deux processus essaient d’écrire dans le même fichier, ils font une pause tous les 8ko pour laisser le temps à l’autre d’écrire à son tour. set_file_buffer() permet de modifier la taille du buffer de sortie pour le pointeur de fichier fp à buffer octets. Si buffer vaut 0, l’écriture se fera sans buffer. Cela force un processus à écrire toutes ses données dans un fichier avant que les autres puissent y accéder. set_file_buffer() retourne 0 en cas de succès, ou EOF si la requête ne peut pas être honorée. L’exemple suivant montre comment utiliser la fonction set_file_buffer() pour créer un fichier sans buffer. Exemple 1. Exemple avec set_file_buffer() <?php $fp=fopen($file, "w"); if($fp){ set_file_buffer($fp, 0); fputs($fp, $output); fclose($fp); } ?> Voir aussi fopen() et fwrite(). is_dir (PHP 3, PHP 4 >= 4.0b1) Indique si le nom de fichier est un dossier. boolean is_dir (string filename) is_dir() retourne TRUE si filename existe et est un dossier. Le résultat de is_dir() est mis en cache. Voir la fonction clearstatcache() pour plus de détails. is_dir() ne fonctionne pas sur les fichiers distants. Les fichiers doivent être accessibles par le système de fichier du serveur. Voir aussi is_file() et is_link(). is_executable (PHP 3, PHP 4 >= 4.0b1) Indique si le fichier est exécutable. boolean is_executable (string filename) 352 Système de fichiers is_executable() retourne TRUE si filename existe et est exécutable. Le résultat de is_executable() est mis en cache. Voir la fonction clearstatcache() pour plus de détails. is_executable() ne fonctionne pas sur les fichiers distants. Les fichiers doivent être accessibles par le système de fichier du serveur. Voir aussi is_file() et is_link(). is_file (PHP 3, PHP 4 >= 4.0b1) Indique si le fichier est un véritable fichier. boolean is_file (string filename) is_file() retourne TRUE si filename existe et est un fichier (et pas un dossier). Le résultat de is_file() est mis en cache. Voir la fonction clearstatcache() pour plus de détails. is_file() ne fonctionne pas sur les fichiers distants. Les fichiers doivent être accessibles par le système de fichier du serveur. Voir aussi is_dir() et is_link(). is_link (PHP 3, PHP 4 >= 4.0b1) Indique si le fichier est un lien symbolique. boolean is_link (string filename) is_link() retourne TRUE si filename existe et est un lien symbolique. Le résultat de is_link() est mis en cache. Voir la fonction clearstatcache() pour plus de détails. is_link() ne fonctionne pas sur les fichiers distants. Les fichiers doivent être accessibles par le système de fichier du serveur. Voir aussi is_dir() et is_file(). Note : is_link() est inopérante sous Windows. is_readable (PHP 3, PHP 4 >= 4.0b1) Indique un fichier est autorisé en lecture boolean is_readable (string filename) is_readable() retourne TRUE si filename existe et est accessible en lecture. N’oubliez pas que PHP accède aux fichiers avec les mêmes autorisations que l’utilisateur qui fait tourner le serveur web (souvent, c’est ’nobody’, personne). Le résultat de is_readable() est mis en cache. Voir la fonction clearstatcache() pour plus de détails. is_readable() ne fonctionne pas sur les fichiers distants. Les fichiers doivent être accessibles par le système de fichier du serveur. Voir aussi is_writable(). 353 Système de fichiers is_writable (PHP 4 ) Indique si un fichier est autorisé en écriture. boolean is_writable (string filename) is_writable() retourne TRUE si filename existe et est accessible en écriture. N’oubliez pas que PHP accède aux fichiers avec les mêmes autorisations que l’utilisateur qui fait tourner le serveur web (souvent, c’est ’nobody’, personne). is_writable() ne fonctionne pas sur les fichiers distants. Les fichiers doivent être accessibles par le système de fichier du serveur. Le résultat de is_writable() est mis en cache. Voir la fonction clearstatcache() pour plus de détails. Voir aussi is_readable(). is_writeable (PHP 3, PHP 4 >= 4.0b1) Indique si un fichier est autorisé en écriture. boolean is_writeable (string filename) is_writeable() est un alias de is_writable(). is_uploaded_file (PHP 3>= 3.0.17, PHP 4 >= 4.0.3) Indique si le fichier a été téléchargé par HTTP POST boolean is_uploaded_file (string filename) is_uploaded_file() est disponible à partir des versions PHP 3.0.16 et 4.0.2. is_uploaded_file() retourne TRUE si le fichier filename a été téléchargé par HTTP POST. Cela est très utile pour vous assurer qu’un utilisateur n’essaie pas d’accéder intentionnellement à un fichier auquel il n’a pas droit (comme /etc/passwd). Ce type de vérification est spécialement important s’il est possible que les fichiers téléchargés révélent leur contenu à l’utilisateur, ou même aux utilisateurs du même système. Voir aussi move_uploaded_file(), et la section Chargement de fichier pour un exemple simple. link (PHP 3, PHP 4 >= 4.0b1) Crée un lien. int link (string target, string link) link() crée un lien. Voir aussi symlink() pour créer des liens symboliques et readlink() avec linkinfo(). Note : link() est inopérante sous Windows. 354 Système de fichiers linkinfo (PHP 3, PHP 4 >= 4.0b1) Renvoie les informations à propos d’un lien. int linkinfo (string path) linkinfo() renvoie les informations à propos d’un lien, c’est-à-dire le champs st_dev de la structure d’information UNIX (comme en langage C). linkinfo() sert à vérifier si un lien (repéré par path) existe (en utilisant la même méthode que la macro S_ISLNK de stat.h). linkinfo() retourne FALSE en cas d’erreur. Voir aussi symlink(), link() et readlink(). Note : linkinfo() est inopérante sous Windows. mkdir (PHP 3, PHP 4 >= 4.0b1) Crée un dossier. int mkdir (string pathname, int mode) mkdir() tente de créer un dossier dans le chemin pathname. Notez que vous aurez à préciser le mode en base octale, ce qui signifie que vous aurez probablement un 0 comme premier chiffre. Le mode sera aussi modifié par le umask courant, que vous pouvez modifier avec la fonction umask(). <?php mkdir ("/chemin/de/mon/dossier", 0700); ?> mkdir() retourne TRUE en cas de succès, et FALSE en cas d’échec. Voir aussi rmdir(). move_uploaded_file (PHP 4 >= 4.0.3) Déplace un fichier téléchargé. boolean move_uploaded_file (string filename, string destination) move_uploaded_file() est disponible à partir des versions PHP 3.0.16 et 4.0.2. move_uploaded_file() s’assure que le fichier filename est un fichier téléchargé par HTTP POST. Si le fichier est valide, il est déplacé jusqu’à destination. Si filename n’est pas valide, rien ne se passe, et move_uploaded_file() retournera FALSE. Si filename est un fichier téléchargé, mais que pour une raison quelconque, il ne peut être déplacé, rien ne se passe, et move_uploaded_file() retourne FALSE. De plus, une alerte sera affichée. Ce type de vérification est spécialement important s’il est possible que les fichiers téléchargés révèlent leur contenu à l’utilisateur, ou même aux utilisateurs du même système. Voir aussi move_uploaded_file() et la section Chargement de fichier pour un exemple simple. 355 Système de fichiers pathinfo (PHP 4 >= 4.0.3) Retourne des informations sur un chemin système array pathinfo (string path) pathinfo() retourne un tableau associatif, contenant les informations sur le chemin path. Les éléments suivants sont retournés : dirname, basename et extension. Exemple 1. Exemple avec pathinfo() <?php $path_parts = pathinfo("/www/htdocs/index.html"); echo $path_parts["dirname"] . "\n"; echo $path_parts["basename"] . "\n"; echo $path_parts["extension"] . "\n"; ?> Va afficher : /www/htdocs index.html html Voir aussi dirname(), basename() et realpath(). pclose (PHP 3, PHP 4 >= 4.0b1) Ferme un processus de pointeur de fichier. int pclose (int fp) pclose() ferme un processus de pointeur de fichier ouvert par popen(). Le pointeur de fichier doit être valide, et avoir été ouvert correctement par popen(). pclose() retourne le statut final du processus exécuté. Voir aussi popen(). popen (PHP 3, PHP 4 >= 4.0b1) Crée un processus de pointeur de fichier. int popen (string commet, string mode) popen() ouvre un processus fils en faisant un fork de la commande. popen() retourne un pointeur de fichier identique à celui retourné par fopen(), hormis le fait qu’il sera unidirectionnel (lecture seule, ou écriture seule), et doit être terminé par pclose(). Ce pointeur peut être utilisé avec fgets(), fgetss() et fputs(). Si une erreur survient, retourne FALSE. 356 Système de fichiers <?php $fp = popen("/bin/ls", "r"); ?> Voir aussi pclose(). readfile (PHP 3, PHP 4 >= 4.0b1) Affiche un fichier. int readfile (string filename, int [use_include_path]) readfile() lit le fichier filename et l’envoit à la sortie standard. readfile() retourne le nombre d’octets lus depuis le fichier. Si une erreur survient, retourne FALSE. Si filename commence par "http://" (insensible à la casse), une connexion HTTP 1.0 sera ouverte avec le serveur spécifié, et le texte de la réponse sera affiché sur la sortie standard. Les versions antérieures à PHP 4.0.6, ne gère pas les redirections automatiques, ce qui oblige à ajouter les slash finaux "/" pour indiquer un dossier. Si filename commence par "ftp://" (insensible à la casse), une connexion FTP est ouverte avec l’hôte spécifié et la réponse du serveur est affichée. Si le serveur ne supporte les connexions passives, la requête échouera. Si filename ne commence par aucun des cas précédents, le fichier sera ouvert sur l’hôte local, et envoyé à la sortie standard. Vous pouvez utiliser le deuxième paramètre optionnel pour explorer le dossier include_path, en passant la valeur de 1. Voir aussi fpassthru(), file(), fopen(), include(), require() et virtual(). readlink (PHP 3, PHP 4 >= 4.0b1) Renvoie le nom du fichier vers lequel pointe un lien symbolique. string readlink (string path) readlink() fait la même chose que la fonction readlink en C : elle retourne le contenu du lien symbolique repéré par path, ou FALSE en cas d’erreur. Voir aussi symlink(), readlink() et linkinfo(). Note : readlink() est inopérante sous Windows. rename (PHP 3, PHP 4 >= 4.0b1) Renomme un fichier. int rename (string oldname, string newname) rename() rente de renommer le fichier oldname en newname. rename() retourne TRUE en cas de succès et FALSE sinon. 357 Système de fichiers rewind (PHP 3, PHP 4 >= 4.0b1) Replace le pointeur de fichier au début. int rewind (int fp) rewind() replace le pointeur du fichier fp au début. Si une erreur survient, retourne FALSE. Le pointeur de fichier doit être valide, et avoir été correctement ouvert par fopen(). Voir aussi fseek() et ftell(). rmdir (PHP 3, PHP 4 >= 4.0b1) Efface un dossier. int rmdir (string dirname) rmdir() tente d’effacer le dossier dont le chemin est dirname. Le dossier doit être vide, et le script doit avoir les autorisations adéquates. Si une erreur survient, rmdir() retourne FALSE. Voir aussi mkdir(). stat (PHP 3, PHP 4 >= 4.0b1) Renvoie les informations à propos d’un fichier. array stat (string filename) stat() renvoie les informations à propos du fichier filename. stat() retourne un tableau avec les éléments suivants : • 0 : volume • 1 : inode • 2 : droits d’accès au fichier (mode de protection du inode). A convertir en octal. Voir aussi fileperms(). • 3 : nombre de liens • 4 : id de l’utilisateur propriétaire • 5 : id du groupe propriétaire • 6 : type du volume de l’inode * • 7 : taille en octets • 8 : date du dernier accès • 9 : date de la dernière modification • 10 : date du dernier changement • 11 : taille de bloc du système pour les entrées/sorties * • 12 : nombre de blocs alloués * - uniquement sur les systèmes qui supportent le type st_blksize. Les autres systèmes (i.e. Windows) retournent -1. stat() retourne FALSE en cas d’erreur. 358 Système de fichiers stat() ne gère pas les URL comme peut le faire fopen(). Les résultats de stat() sont mis en cache. Reportez-vous à la fonction clearstatcache() pour plus de détails. lstat (PHP 3>= 3.0.4, PHP 4 >= 4.0b1) Renvoie les informations à propos d’un fichier ou d’un lien symbolique. array lstat (string filename) lstat() est identique à stat() mais elle accepte aussi un lien symbolique comme argument. lstat() retourne un tableau avec les éléments suivants : • 0 : volume • 1 : inode • 2 : droits d’accès au fichier (mode de protection du inode). A convertir en octal. Voir aussi fileperms(). • 3 : nombre de liens • 4 : id de l’utilisateur propriétaire • 5 : id du groupe propriétaire • 6 : type du volume de l’inode * • 7 : taille en octets • 8 : date du dernier accès • 9 : date de la dernière modification • 10 : date du dernier changement • 11 : taille de bloc du système pour les entrées/sorties * • 12 : nombre de blocs alloués * - uniquement sur les systèmes qui supportent le type st_blksize. Les autres systèmes (i.e. Windows) retournent -1. Les résultats de lstat() sont mis en cache. Reportez-vous à la fonction clearstatcache() pour plus de détails. realpath (PHP 4 >= 4.0b4) Retourne le chemin canonique absolu. string realpath (string path) realpath() résoud tous les liens symboliques, et remplace toutes les références ’/./’, ’/../’ et ’/’ de path puis retourne le chemin canonique absolu ainsi trouvé. Le résultat ne contient aucun lien symbolique, ’/./’ ou ’/../’. Exemple 1. Exemple realpath() <?php $real_path = realpath("../../index.php"); ?> 359 Système de fichiers symlink (PHP 3, PHP 4 >= 4.0b1) Crée un lien symbolique. int symlink (string target, string link) symlink() crée un lien symbolique pour l’objet target avec le nom de link. Voir aussi link() pour créer des liens durs et readlink() ainsi que linkinfo(). Note : symlink() est inopérante sous Windows. tempnam (PHP 3, PHP 4 >= 4.0b1) Crée un fichier avec un nom unique. string tempnam (string dir, string prefix) tempnam() crée un fichier temporaire unique dans le dossier dir. Si le dossier n’existe pas, tempnam() va générer un nom de fichier dans le dossier temporaire du système. Avant PHP 4.0.6, le comportement de tempnam() dépendait de l’OS sous-jacent. Sous Windows, la variable d’environnement TMP remplace le paramètre dir; sous Linux, la variable d’environnement TMPDIR a la priorité, tandis que pour les OS en système V R4, le paramètre dir sera toujours utilisé, si le dossier qu’il représente existe. Consultez votre documentation pour plus de détails. tempnam() retourne le nom du fichier temporaire, ou la chaîne NULL en cas d’échec. Exemple 1. Exemple avec tempnam() <?php $tmpfname = tempnam("/tmp", "FOO"); ?> tmpfile (PHP 3>= 3.0.13, PHP 4 >= 4.0b4) Crée un fichier temporaire int tmpfile (void) tmpfile() crée un fichier temporaire avec un nom unique, ouvert en écriture, et retourne un pointeur de fichier, identique à ceux retournés par fopen(). Ce fichier sera automatiquement effacé lorsqu’il sera fermé (avec fclose()), ou lorsque le script sera terminé. Pour plus de détails, consultez votre documentation système sur la fonction tmpfile(3), et sur stdio.h. Voir aussi tempnam(). 360 Système de fichiers touch (PHP 3, PHP 4 >= 4.0b1) Affecte une nouvelle date de modification à un fichier. int touch (string filename, int time) touch() tente de forcer la date de modification du fichier nommé filename à la date de time. Si time est omis, c’est l’heure courante qui est utilisée. Si le fichier n’existe pas, il est créé. touch() retourne TRUE en cas de succès, et FALSE sinon. Exemple 1. Exemple avec touch() if ( touch($NomDeFichier) ) { print "La date de modification de $NomDeFichier a été fixée à maintenant"; } else { print "Désolé, il est impossible de changer la date de modification de $NomDeFichier"; } umask (PHP 3, PHP 4 >= 4.0b1) Change le "umask" courant. int umask (int mask) umask() change le umask de PHP : mask & 0777 et retourne le vieux umask. Lorsque PHP est utilisé comme module de serveur, le umask reprend sa valeur à la fin de chaque script. umask() appelé sans argument retourne simplement le umask courant. unlink (PHP 3, PHP 4 >= 4.0b1) Efface un fichier. int unlink (string filename) unlink() efface filename. Identique à la fonction Unix C unlink(). unlink() retourne FALSE en cas d’échec. Voir aussi rmdir() pour supprimer des dossiers. Note : unlink() ne fonctionne pas sous Windows. 361 XXVII. Forms Data Format Forms Data Format (FDF) est un format de fomulaire pour les documents PDF. Vous pouvez lire la documentation (en anglais) à http://partners.adobe.com/asn/developer/acrosdk/forms.html pour plus de détails sur les tenants et les aboutissants. Note : Si vous rencontrez des problèmes de configuration de PHP avec le support fdftk, vérifiez bien que le fichier d’en-têtes FdfTk.h et la librairie libFdfTk.so sont bien situés. Elle devrait être dans les dossiers fdftk-dir/include et fdftk-dir/lib. Cela ne sera pas le cas si vous avez simplement décompressé la distribution FdfTk. L’esprit de FDF est similaire à celui des formulaires HTML. Les différences résident dans les moyens de transmission des données au serveur, lorsque le bouton "submit" (soumettre) est pressé (ce qui est du ressort de Form Data Format) et le format de formulaire lui-même (qui est plutôt du ressort de Portable Document Format, PDF). Gérer des données FDF est un des objectifs des fonctions FDF. Mais il y en a d’autres. Vous pouvez aussi prendre un formulaire PDF, et pré-remplir les champs, sans modifier le formulaire lui-même. Dans ce cas, on va créer un document FDF (fdf_create()), remplir les champs (fdf_set_value()) et l’associer à un fichier PDF (fdf_set_file()). Finalement, le tout sera envoyé au client, avec le type MIME "application/vnd.fdf". Le module "Acrobat reader" de votre navigateur va reconnaître ce type MIME, et lire le fichier PDF, puis le remplis avec FDF. Si vous éditez un fichier FDF avec un éditeur de texte, vous trouverez un catalogue d’objet avec le nom de FDF. Cet objet peut contenir des entrées telles que Fields, F, Status etc.. Les entrées les plus couramment utilisées sont Fields, qui indique une liste de champs de contrôle, et F qui contient le nom du fichier PDF a qui appartiennent ces données. Ces entrées sont désignées dans la documentation PDF sous le nom de /F-Key ou /Status-Key. La modification de ces entrées est possible avec les fonctions fdf_set_file() et fdf_set_status(). Les champs sont modifiables avec les fonctions fdf_set_value(), fdf_set_opt() etc.. Les exemples suivants montre comme évaluer les données du formulaire. Exemple 1. Evaluer un document FDF <?php // Sauver le fichier FDF dans un fichier temporaire. $fdffp = fopen("test.fdf", "w"); fwrite($fdffp, $HTTP_FDF_DATA, strlen($HTTP_FDF_DATA)); fclose($fdffp); // Ouvrir le fichier temporaire, et utiliser les données. // Le formulaire pdf contenait différents fichiers texte, avec pour nom : // volume, date, comment, publisher, preparer, ainsi que deux boîtes // à cocher show_publisher et show_preparer. $fdf = fdf_open("test.fdf"); $volume = fdf_get_value($fdf, "volume"); echo "La valeur du champs volume était : ’<B>$volume</B>’<br>"; $date = fdf_get_value($fdf, "date"); echo "La valeur du champs date était ’<B>$date</B>’<br>"; $comment = fdf_get_value($fdf, "comment"); echo "La valeur du champs comment était ’<B>$comment</B>’<br>"; if(fdf_get_value($fdf, "show_publisher") == "On") { $publisher = fdf_get_value($fdf, "publisher"); echo "La valeur du champs publisher était : ’<B>$publisher</B>’<br>"; } else echo "La valeur du champs ne doit pas être affichée.<br>"; if(fdf_get_value($fdf, "show_preparer") == "On") { $preparer = fdf_get_value($fdf, "preparer"); echo "La valeur du champs preparer était ’<B>$preparer</B>’<br>"; } else echo "La valeur du champs Preparer ne doit pas être affiché.<br>"; fdf_close($fdf); ?> 362 FDF fdf_open (PHP 3>= 3.0.6, PHP 4 >= 4.0b1) Ouvre un document FDF. resource fdf_open (string filename) fdf_open() ouvre un fichier avec formulaire. Le fichier doit contenir les données retournées par le formulaire PDF. Actuellement, le fichier doit être créée ’manuellement’, en utilisant la fonction fopen() et en y écrivant le contenu du tableau HTTP_FDF_DATA avec la fonction fwrite(). Un mécanisme comparable aux formulaires HTML qui créent une variable pour chaque champs entrant, n’existe pas. Exemple 1. Accéder aux données du formulaire <?php // Sauver le fichier FDF dans un fichier temporaire. $fdffp = fopen("test.fdf", "w"); fwrite($fdffp, $HTTP_FDF_DATA, strlen($HTTP_FDF_DATA)); fclose($fdffp); // Ouvrir le fichier temporaire, et utiliser les données. $fdf = fdf_open("test.fdf"); ... fdf_close($fdf); ?> Voir aussi fdf_close(). fdf_close (PHP 3>= 3.0.6, PHP 4 >= 4.0b1) Ferme un document FDF. boolean fdf_close (resource fdf_document) fdf_close() ferme le document FDF. Voir aussi fdf_open(). fdf_create (PHP 3>= 3.0.6, PHP 4 >= 4.0b1) Crée un nouveau document FDF. int fdf_create (void ) fdf_create() crée un nouveau document FDF. Cette fonction est nécessaire pour ceux qui veulent pré remplir les champs d’un formulaire dans un fichier PDF. Exemple 1. Pré remplir un formulaire PDF <?php $outfdf = fdf_create(); fdf_set_value($outfdf, "volume", $volume, 0); fdf_set_file($outfdf, "http:/testfdf/resultlabel.pdf"); fdf_save($outfdf, "outtest.fdf"); fdf_close($outfdf); Header("Content-type: application/vnd.fdf"); 363 FDF $fp = fopen("outtest.fdf", "r"); fpassthru($fp); unlink("outtest.fdf"); ?> Voir aussi fdf_close(), fdf_save() et fdf_open(). fdf_save (PHP 3>= 3.0.6, PHP 4 >= 4.0b1) Sauver un document FDF. int fdf_save (string filename) fdf_save() sauve un document FDF. Le FDF Toolkit fournit un moyen d’envoyer le contenu d’un document FDF à au fichier de sortie stdout si le paramètre filename vaut ’.’. Ceci ne fonctionne pas si PHP est sous la forme d’un module Apache. Dans ce cas, il faudra écrire le résultat dans un fichier, et utiliser fpassthru() pour l’afficher au client. Voir aussi fdf_close() et pour avoir un exemple fdf_create(). fdf_get_value (PHP 3>= 3.0.6, PHP 4 >= 4.0b1) Mot la valeur d’un champs. string fdf_get_value (int fdf_document, string fieldname) fdf_get_value() retourne la valeur d’un champs. Voir aussi fdf_set_value(). fdf_set_value (PHP 3>= 3.0.6, PHP 4 >= 4.0b1) Fixe la valeur d’un champs. boolean fdf_set_value (int fdf_document, string fieldname, string value, int isName) fdf_set_value() fixe la valeur d’un champs. Le dernier paramètre détermine si la valeur doit être convertie en nom PDF (isName = 1) ou affecter une chaîne PDF à un contrôle (isName = 0). Voir aussi fdf_get_value(). fdf_next_field_name (PHP 3>= 3.0.6, PHP 4 >= 4.0b1) Lit le nom du champs suivant. string fdf_next_field_name (int fdf_document, string fieldname) fdf_next_field_name() retourne le nom du champs après le champs fieldname ou le nom du premier champs, si le second paramètre est NULL. Voir aussi fdf_set_value() et fdf_get_value(). 364 FDF fdf_set_ap (PHP 3>= 3.0.6, PHP 4 >= 4.0b1) Fixe l’apparence d’un champs. boolean fdf_set_ap (int fdf_document, string field_name, int face, string filename, int page_number) fdf_set_ap() fixe l’apparence d’un champs (i.e. la valeur de la clé /AP). Les valeurs possibles de face sont sont 1=FDFNormalAP, 2=FDFRolloverAP, 3=FDFDownAP. fdf_set_status (PHP 3>= 3.0.6, PHP 4 >= 4.0b1) Fixe la valeur de la clé /STATUS. boolean fdf_set_status (int fdf_document, string status) fdf_set_status() fixe la valeur de la clé /STATUS. Voir aussi fdf_get_status(). fdf_get_status (PHP 3>= 3.0.6, PHP 4 >= 4.0b1) Lit la valeur de la clé /STATUS. string fdf_get_status (int fdf_document) fdf_get_status() retourne la valeur de la clé /STATUS. Voir aussi fdf_set_status(). fdf_set_file (PHP 3>= 3.0.6, PHP 4 >= 4.0b1) Fixe la valeur de la clé /F. boolean fdf_set_file (int fdf_document, string filename) fdf_set_file() Fixe la valeur de la clé /F. la clé /F est simplement une référence sur un formulaire PDF qui doit être pré-remplis. Dans un environnement web, c’est une URL (e.g. http:/testfdf/resultlabel.pdf). Voir aussi fdf_get_file() et pour un exemple, fdf_create(). fdf_get_file (PHP 3>= 3.0.6, PHP 4 >= 4.0b1) Lit la valeur de la clé /F. string fdf_get_file (int fdf_document) fdf_set_file() lit la valeur de la clé /F. Voir aussi fdf_set_file(). 365 FDF fdf_set_flags (PHP 4 >= 4.0.2) Modifie une option d’un champs boolean fdf_set_flags (int fdf_document, string fieldname, int whichFlags, int newFlags) fdf_set_flags() modifie certaines options du champs fieldname. Voir aussi fdf_set_opt(). fdf_set_opt (PHP 4 >= 4.0.2) Modifie une option d’un champs boolean fdf_set_opt (int fdf_document, string fieldname, int element, string str1, string str2) fdf_set_opt() modifie les options du champs fieldname. Voir aussi fdf_set_flags(). fdf_set_submit_form_action (PHP 4 >= 4.0.2) Modifie l’action javascript d’un champs boolean fdf_set_submit_form_action (int fdf_document, string fieldname, int trigger, string script, int flags) fdf_set_submit_form_action() affecte un javascript au champs fieldname, exécuté lors de la validation d’un formulaire. Voir aussi fdf_set_javascript_action(). fdf_set_javascript_action (PHP 4 >= 4.0.2) Modifie l’action javascript d’un champs boolean fdf_set_javascript_action (int fdf_document, string fieldname, int trigger, string script) fdf_set_javascript_action() affecte un javascript au champs fieldname, exécuté lors de la validation d’un formulaire. Voir aussi fdf_set_submit_form_action(). fdf_set_encoding (unknown) Modifie l’encodage des caractères bool fdf_set_encoding (int fdf_document, string encoding) fdf_set_encoding() modifie l’encodage des caractères du document FDF fdf_document. Le paramètre encoding doit être un nom d’encodage valide, tels que "Shift-JIS" ou "Unicode". 366 FDF fdf_set_encoding() a été ajoutée en PHP 4.0.7. 367 XXVIII. FTP FTP : File Transfer Protocol (Protocole de transfert de fichiers). Ces fonctions implémentent un client pour accéder aux serveurs FTP, comme défini dans http://www.faqs.org/rfcs/rfc959.html. Les constantes suivantes sont définies dans le module FTP : FTP_ASCII et FTP_BINARY. Pour activer le module FTP de votre configuration PHP, il faut utiliser l’option --enable-ftp en PHP 4, et l’option --with-ftp en PHP 3 avec le script de configuration. Exemple 1. Exemple de connexion FTP <?php // création de la connexion $conn_id = ftp_connect("$ftp_server"); // authentification avec nom de compte et mot de passe $login_result = ftp_login($conn_id, "$ftp_user_name", "$ftp_user_pass"); // vérification de la connexion if ((!$conn_id) || (!$login_result)) { echo "La connexion FTP a échoué!"; echo "Tentative de connexion à $ftp_server avec $user"; die; } else { echo "Connecté à $ftp_server, avec $user"; } // téléchargement d’un fichier $upload = ftp_put($conn_id, "$destination_file", "$source_file", FTP_BINARY); // Vérification de téléchargement if (!$upload) { echo "Le téléchargement Ftp a échoué!"; } else { echo "Téléchargement de $source_file sur $ftp_server en $destination_file"; } // fermeture de la connexion FTP. ftp_quit($conn_id); ?> 368 FTP ftp_connect (PHP 3>= 3.0.13, PHP 4 >= 4.0b4) Ouvre une connexion FTP resource ftp_connect (string host, int [port]) ftp_connect() retourne un flot FTP en cas de succès, et FALSE sinon. ftp_connect() ouvre une connexion FTP avec l’hôte host. Le paramètre port spécifie le port de connexion. S’il est omis, le port 21 sera utilisé. ftp_login (PHP 3>= 3.0.13, PHP 4 >= 4.0b4) Authentification d’une connexion FTP bool ftp_login (resource ftp_stream, string username, string password) ftp_login() retourne TRUE en cas de succès, et FALSE sinon. ftp_login() authentifie le flot FTP. ftp_pwd (PHP 3>= 3.0.13, PHP 4 >= 4.0b4) Retourne le nom du dossier courant. string ftp_pwd (resource ftp_stream) ftp_pwd() retourne le nom du dossier courant, ou FALSE en cas d’erreur. ftp_cdup (PHP 3>= 3.0.13, PHP 4 >= 4.0b4) Change de dossier, et passe au dossier parent. bool ftp_cdup (resource ftp_stream) ftp_cdup() retourne TRUE en cas de succès, et FALSE sinon. ftp_cdup() change de dossier, et passe au dossier parent. ftp_chdir (PHP 3>= 3.0.13, PHP 4 >= 4.0b4) Change le dossier courant. bool ftp_chdir (resource ftp_stream, string directory) ftp_chdir() retourne TRUE en cas de succès, et FALSE sinon. ftp_chdir() change le dossier courant en directory. 369 FTP ftp_mkdir (PHP 3>= 3.0.13, PHP 4 >= 4.0b4) Crée un dossier. string ftp_mkdir (resource ftp_stream, string directory) ftp_mkdir() retourne le nom du dossier ainsi créé en cas de succès, et FALSE sinon. ftp_mkdir() crée le dossier nommé directory. ftp_rmdir (PHP 3>= 3.0.13, PHP 4 >= 4.0b4) Efface un dossier. bool ftp_rmdir (resource ftp_stream, string directory) ftp_rmdir() retourne TRUE en cas de succès, et FALSE sinon. ftp_rmdir() efface le dossier directory. ftp_nlist (PHP 3>= 3.0.13, PHP 4 >= 4.0b4) Retourne la liste des fichiers dans un dossier. array ftp_nlist (resource ftp_stream, string directory) ftp_nlist() retourne un tableau de nom de fichiers en cas de succès, et FALSE sinon. ftp_rawlist (PHP 3>= 3.0.13, PHP 4 >= 4.0b4) Fait une liste détaillée de fichiers dans un dossier. array ftp_rawlist (resource ftp_stream, string directory) ftp_rawlist() exécute la commande FTP LIST, et retourne le résultat dans un tableau. Chaque élément du tableau correspond à une ligne du résultat de la commande. Le résultat n’est pas analysé, et est retourné brut. L’identifiant de système retourné par ftp_systype() sera utile pour déterminer la façon d’interpréter le résultat. ftp_systype (PHP 3>= 3.0.13, PHP 4 >= 4.0b4) Retourne un identifiant de type de serveur FTP. string ftp_systype (resource ftp_stream) ftp_systype() retourne le type de serveur, ou FALSE en cas d’erreur. 370 FTP ftp_pasv (PHP 3>= 3.0.13, PHP 4 >= 4.0b4) Active ou désactive le mode passif. bool ftp_pasv (resource ftp_stream, int pasv) ftp_pasv() retourne TRUE en cas de succès, et FALSE sinon. ftp_pasv() active le mode passif si pasv est à TRUE (et le désactive si pasv est à FALSE). En mode passif, les données de connexion sont initiées par le client, plutôt que par le serveur. ftp_get (PHP 3>= 3.0.13, PHP 4 >= 4.0b4) Télécharge un fichier depuis un serveur FTP. bool ftp_get (resource ftp_stream, string local_file, string remote_file, int mode) ftp_get() retourne TRUE en cas de succès, et FALSE sinon. ftp_get() télécharge le fichier remote_file depuis le serveur FTP, et le sauve dans le fichier local local_file. Le mode de transfert mode spécifié doit être soit FTP_ASCII ou FTP_BINARY. ftp_fget (PHP 3>= 3.0.13, PHP 4 >= 4.0b4) Télécharge un fichier depuis un serveur FTP et le sauve dans un fichier déjà ouvert. bool ftp_fget (resource ftp_stream, int fp, string remote_file, int mode) ftp_fget() retourne TRUE en cas de succès, et FALSE sinon. ftp_fget() télécharge le fichier remote_file depuis le serveur FTP, et l’écrit dans le fichier identifié par fp. Le mode de transfert mode spécifié doit être FTP_ASCII ou FTP_BINARY. ftp_put (PHP 3>= 3.0.13, PHP 4 >= 4.0b4) Charge un fichier sur un serveur FTP. bool ftp_put (resource ftp_stream, string remote_file, string local_file, int mode) ftp_put() retourne TRUE en cas de succès, et FALSE sinon. ftp_put() enregistre le fichier local_file sur le serveur FTP, sous le nom de remote_file. Le mode de transfert mode spécifié doit être FTP_ASCII ou FTP_BINARY. ftp_fput (PHP 3>= 3.0.13, PHP 4 >= 4.0b4) Charge un fichier ouvert sur un serveur FTP. bool ftp_fput (resource ftp_stream, string remote_file, int fp, int mode) ftp_fput() retourne TRUE en cas de succès, et FALSE sinon. 371 FTP ftp_fput() charge les données issues du fichier identifié par fp jusqu’à la fin du fichier. Le résultat est stocké dans le fichier remote_file sur le serveur FTP. Le mode de transfert mode spécifié doit être FTP_ASCII ou FTP_BINARY. ftp_size (PHP 3>= 3.0.13, PHP 4 >= 4.0b4) Retourne la taille d’un fichier. int ftp_size (resource ftp_stream, string remote_file) ftp_size() retourne la taille du fichier en cas de succès, et FALSE sinon. ftp_size() retourne la taille d’un fichier sur un serveur FTP. Si une erreur survient, ou que le fichier n’existe pas, la valeur -1 est retournée. Certains serveurs FTP ne supportent pas cette fonction. ftp_mdtm (PHP 3>= 3.0.13, PHP 4 >= 4.0b4) Retourne la date de dernière modification d’un fichier sur un serveur FTP. int ftp_mdtm (resource ftp_stream, string remote_file) ftp_mdtm() retourne un UNIX timestamp en cas de succès, et FALSE sinon. ftp_mdtm() lit la date de dernière modification d’un fichier et retourne le UNIX timestamp. Si une erreur survient, ou si le fichier n’existe pas,la valeur -1 est retournée. Certains serveurs FTP ne supportent pas cette fonction. ftp_rename (PHP 3>= 3.0.13, PHP 4 >= 4.0b4) Renomme un fichier sur un serveur FTP. bool ftp_rename (resource ftp_stream, string from, string to) ftp_rename() retourne TRUE en cas de succès, et FALSE sinon. ftp_rename() renomme le fichier ou dossier from en to, sur le serveur ftp_stream. ftp_delete (PHP 3>= 3.0.13, PHP 4 >= 4.0b4) Efface un fichier sur un serveur FTP. bool ftp_delete (resource ftp_stream, string path) ftp_delete() retourne TRUE en cas de succès, et FALSE sinon. ftp_delete() efface le fichier path sur un serveur FTP. ftp_site (PHP 3>= 3.0.15, PHP 4 >= 4.0RC1) Envoie la commande SITE au serveur. bool ftp_site (resource ftp_stream, string cmd) 372 FTP ftp_site() retourne TRUE en cas de succès, et FALSE sinon. ftp_site() envoie la commande cmd au serveur FTP. Les commandes SITE ne sont pas normalisées, et peuvent varier d’un serveur à l’autre. Elles permettent de gérer notamment les permissions de fichier, et les groupes. ftp_quit (PHP 3>= 3.0.13, PHP 4 >= 4.0b4) Ferme une connexion FTP. bool ftp_quit (resource ftp_stream) ftp_connect() ferme la connexion ftp_stream. 373 XXIX. Fonctions Ces fonctions effectuent les manipulations liées à la gestion des fonctions. 374 Fonctions call_user_func_array (PHP 4 >= 4.0.4) Appelle une fonction utilisateur avec les paramètres rassemblés en tableau mixed call_user_func_array (string function_name [, array paramarr]) call_user_func_array() appelle la fonction utilisateur function_name avec les paramètres paramarr, rassemblés dans un tableau. Par exemple: <?php function debug($var, $val) echo "***DEBUGGING\nVARIABLE: $var\nVALUE:"; if (is_array($val) || is_object($val) || is_resource($val)) print_r($val); else echo "\n$val\n"; echo "***\n"; } $c = mysql_connect(); $host = $HTTP_SERVER_VARS["SERVER_NAME"]; call_user_func_array (’debug’, array("host", $host)); call_user_func_array (’debug’, array("c", $c)); call_user_func_array (’debug’, array("HTTP_POST_VARS", $HTTP_POST_VARS)); ?> Voir aussi call_user_func(), call_user_method() et call_user_method_array(). Note : call_user_func_array() a été ajouté en version PHP 4.05. call_user_func (PHP 3>= 3.0.3, PHP 4 >= 4.0b1) Appelle une fonction utilisateur mixed call_user_func (string function_name [, mixed parameter [, mixed ...]]) call_user_func() appelle la fonction utilisateur function_name, et lui passe les paramètres parameter. Par exemple : function barbier ($type) { print "Vous vouliez une coupe $type, pas de problème"; } call_user_func (’barbier’, "iroquois"); call_user_func (’barbier’, "militaire"); call_user_func (’barbier’, "au bol"); Voir aussi call_user_func_array(), call_user_method() et call_user_method_array(). 375 Fonctions create_function (PHP 4 >= 4.0.1) Crée une fonction anonyme (style lambda) string create_function (string args, string code) create_function() crée une fonction anonyme, à partir des paramètres passés, et retourne un nom de fonction unique. Généralement, les arguments args sont présentés sous la forme d’une chaîne à guillemets simples, et la même recommandation vaut pour code. La raison de l’utilisation des guillemets simples est de proteger les noms de variables du remplacement par leur valeur. Si vous utilisez les guillemets doubles, n’oubliez pas d’échapper les noms de variables (i.e. \$avar). Vous pouvez utiliser cette fonction pour (par exemple) créer une fonction à partir d’informations récoltés durant l’éxécution. Exemple 1. Création d’une fonction anonyme avec create_function() <?php $newfunc = create_function(’$a,$b’,’return "ln($a) + ln($b) = ".log($a * $b);’); echo "Nouvelle fonction anonyme : $newfunc\n"; echo $newfunc(2,M_E)."\n"; // affichera : // Nouvelle fonction anonyme : lambda_1 // ln(2) + ln(2.718281828459) = 1.6931471805599 ?> Ou, pour pouvoir appliquer une fonction générique à une liste d’arguments. Exemple 2. Traitement générique par fonction avec create_function() <?php function process($var1, $var2, $farr) { for ($f=0; $f < count($farr); $f++) echo $farr[$f]($var1,$var2)."\n"; } // création d’une série de fonction mathématiques $f1 = ’if ($a>=0) {return "b*a^2 = ".$b*sqrt($a);} else {return FALSE;}’; $f2 = "return \"min(b^2+a, a^2,b) = \".min(\$a*\$a+\$b,\$b*\$b+\$a);"; $f3 = ’if ($a> 0 && $b != 0) {return "ln(a)/b = ".log($a)/$b;} else {return FALSE;}’; $farr = array( create_function(’$x,$y’, ’return "un peu de trigo : ".(sin($x) + $x*cos($y));’), create_function(’$x,$y’, ’return "une hypoténuse: ".sqrt($x*$x + $y*$y);’), create_function(’$a,$b’, $f1), create_function(’$a,$b’, $f2), create_function(’$a,$b’, $f3) ); echo "\nUtilisation de la première liste de fonctions anonymes\n"; echo "paramétres: 2.3445, M_PI\n"; process(2.3445, M_PI, $farr); // Maintenant une liste de fonction sur chaîne de caractères $garr = array( create_function(’$b,$a’,’if (strncmp($a,$b,3) == 0) return "** \"$a\" ’. ’et \"$b\"\n** Ces chaînes de ressemblent!! (regarde les trois premiers caractères)";’), create_function(’$a,$b’,’; return "CRCs: ".crc32($a)." , ".crc32(b);’), create_function(’$a,$b’,’; return "similarité(a,b) = ".similar_text($a,$b,&$p)."($p%)";’) ); echo "\nUtilisation de la secondes liste de fonctions anonymes\n"; process("Twas brilling and the slithy toves", "Twas the night", $garr); ?> Et lorsque vous utilisez le code ci-dessus, l’affichage va être 376 Fonctions Utilisation de la première liste de fonctions anonymes paramétres: 2.3445, M_PI Un peu de trigo: -1.6291725057799 Une hypoténuse: 3.9199852871011 b*a^2 = 4.8103313314525 min(b^2+a, a^2,b) = 8.6382729035898 ln(a/b) = 0.27122299212594 Utilisation de la seconde liste de fonctions anonymes ** "Twas the night" et "Twas brilling and the slithy toves" ** Ces chaînes de ressemblent!! (regarde les trois premiers caractères) CRCs: -725381282 , 1908338681 similarité(a,b) = 11(45.833333333333%) Mais l’utilisation la plus courante des fonctions lambda est la fonction de callback, par exemple lors de l’utilisation de array_walk() ou usort() Exemple 3. Utilisation de fonctions anonymes comme fonction de callback <?php $av = array("la ","une ","cette ","une certaine "); array_walk($av, create_function(’&$v,$k’,’$v = $v."maison";’)); print_r($av); // En PHP 3 utilisez var_dump() // affiche: // Array // ( // [0] => la maison // [1] => une maison // [2] => cette maison // [3] => une certaine maison // ) // un tableau de chaîne classé par taille $sv = array("petite","moyenne","tres longue","vraiment tres longue"); print_r($sv); // affiche: // Array // ( // [0] => petite // [1] => moyenne // [2] => tres longue // [3] => vraiment tres longue // ) // Tri par ordre de taille décroissant usort($sv, create_function(’$a,$b’,’return strlen($b) - strlen($a);’)); print_r($sv); // outputs: // Array // ( // [0] => vraiment tres longue // [1] => tres longue // [2] => moyenne // [3] => petite // ) ?> func_get_arg (PHP 4 >= 4.0b4) Retourne un élément de la liste des arguments mixed func_get_arg (int arg_num) 377 Fonctions func_get_arg() retourne l’argument à la position arg_num dans la liste d’argument d’une fonction utilisateur. Les arguments sont comptés en commençant à zéro. func_get_arg() générera une alerte si elle est appelée hors d’une fonction. Si arg_num est plus grand que le nombre d’arguments passés, une alerte est générée et la fonction retourne FALSE. <?php function foo() { $numargs = func_num_args(); echo "Nombre d’arguments: $numargs<br>\n"; if ($numargs >= 2) { echo "Le second argument est: " . func_get_arg (1) . "<br>\n"; } } foo(1, 2, 3); ?> func_get_arg() peut être utilisé conjointement à func_num_args() et func_get_args() pour permettre aux fonctions utilisateurs d’accepter un nombre variable d’arguments. Note : func_get_arg() a été ajoutée en PHP 4. func_get_args (PHP 4 >= 4.0b4) Retourne les arguments d’une fonction sous forme de tableau array func_get_args (void ) func_get_args() retourne un tableau dont les éléments correspondent aux éléments de la liste d’arguments de la fonction. func_get_args() générera une alerte si elle est appelée hors d’une fonction. <?php function foo() { $numargs = func_num_args(); echo "Nombre d’arguments: $numargs<br>\n"; if ($numargs >= 2) { echo "Le second argument est: " . func_get_arg (1) . "<br>\n"; } $arg_list = func_get_args(); for ($i = 0; $i < $numargs; $i++) { echo "L’argument $i est: " . $arg_list[$i] . "<br>\n"; } } foo (1, 2, 3); ?> func_get_arg() peut être utilisé conjointement à func_num_args() et func_get_args() pour permettre aux fonctions utilisateurs d’accepter un nombre variable d’arguments. Note : func_get_arg() a été ajoutée en PHP 4. 378 Fonctions func_num_args (PHP 4 >= 4.0b4) Retourne le nombre d’arguments passé à la fonction int func_num_args (void ) func_num_args() retourne le nombre d’arguments passé à la fonction utilisateur courante. func_num_args() générera une alerte si elle est appelée hors d’une fonction. <?php function foo() { $numargs = func_num_args(); echo "Nombre d’arguments: $numargs\n"; } foo (1, 2, 3); // affiche ’Nombre d’arguments: 3’ ?> func_get_arg() peut être utilisé conjointement à func_num_args() et func_get_args() pour permettre aux fonctions utilisateurs d’accepter un nombre variable d’arguments. Note : func_get_arg() a été ajoutée en PHP 4. function_exists (PHP 3>= 3.0.7, PHP 4 >= 4.0b1) Indique si une fonction est définie. boolean function_exists (string function_name) function_exists() vérifie la liste des fonctions définies par l’utilisateur, et retourne TRUE si function_name y est trouvé, FALSE sinon. <?php if (function_exists(’imap_open’)) { echo "Les fonctions IMAP sont disponibles.<br>\n"; } else { echo "Les fonctions IMAP ne sont pas disponibles.<br>\n"; } ?> Notez qu’une fonction peut exister, même si elle est indisponible, à cause de la configuration ou des options de compilation. Voir aussi method_exists(). get_defined_functions (PHP 4 >= 4.0.4) Liste toutes les fonctions définies array get_defined_functions (void ) get_defined_functions() retourne un tableau multi- dimensionnel, contenant la liste de toutes les fonctions définies, aussi bien les fonctions internes à PHP que celle déjà définie par l’utilisateur. Les noms des fonctions internes sont accessibles via $arr["internal"], et les fonctions utilisateur sont accessibles via $arr["user"]. 379 Fonctions <?php function maligne($id, $data) { return "<tr><th>$id</th><td>$data</td></tr>\n"; } $arr = get_defined_functions(); print_r($arr); ?> Ce script va afficher : Array ( [internal] => Array ( [0] => zend_version [1] => func_num_args [2] => func_get_arg [3] => func_get_args [4] => strlen [5] => strcmp [6] => strncmp ... [750] => bcscale [751] => bccomp ) [user] => Array ( [0] => maligne ) ) Voir aussi get_defined_vars(). register_shutdown_function (PHP 3>= 3.0.4, PHP 4 >= 4.0b1) Enregistre une fonction pour exécution à l’extinction int register_shutdown_function (string func) register_shutdown_function() enregistre la fonction func pour exécution à l’extinction du script. Erreur courante : Etant donné qu’aucun affichage n’est possible depuis la fonction func, vous ne pouvez pas y mettre d’informations de débuggage par print() ou echo()! register_tick_function (PHP 4 >= 4.0.3) Enregistre une fonction exécutée à chaque tick void register_tick_function (string func [, mixed arg]) register_tick_function() enregistre la fonction func pour être exécutée à chaque fois qu’un tick est appelé. 380 Fonctions unregister_tick_function (PHP 4 >= 4.0.3) Annule la fonction exécutée à chaque tick void unregister_tick_function (string func [, mixed arg]) unregister_tick_function() annule l’exécution automatique de func à chaque tick. 381 XXX. GNU Gettext Les fonctions gettext implémente l’API NLS (Native Language Support) qui peut servir à internationaliser vos scripts PHP. Lisez la documentation GNU pour plus d’explications sur ces fonctions. 382 gettext bindtextdomain (PHP 3>= 3.0.7, PHP 4 >= 4.0b1) Fixe le chemin d’un domaine. string bindtextdomain (string domain, string directory) bindtextdomain() fixe le chemin du domaine domain à directory. dcgettext (PHP 3>= 3.0.7, PHP 4 >= 4.0b1) Remplace le domaine lors d’une recherche. string dcgettext (string domain, string message, int category) dcgettext() permet de remplacer le domaine courant lors de la rechrche d’un message. Elle permet aussi de spécifier une catégorie. dgettext (PHP 3>= 3.0.7, PHP 4 >= 4.0b1) Remplace le domaine courant. string dgettext (string domain, string message) dgettext() remplace le domaine courant. gettext (PHP 3>= 3.0.7, PHP 4 >= 4.0b1) Recherche un message dans le domaine courant. string gettext (string message) gettext() retourne une chaîne traduite, si elle en a trouvé une dans la table de traduction, ou bien le message message, s’il n’a pas été trouvé. Vous pouvez utiliser le caractère souligné (_) comme alias de cette fonction. Exemple 1. Vérfication gettext() <?php // Choix l’allemand putenv("LANG=de"); // Spécifie la localisation des tables de traduction bindtextdomain("myPHPApp", "./locale"); // Choisi le domaine textdomain("myPHPApp"); // Affiche un message de test print (gettext ("Bienvenue sur mon application PHP")); ?> 383 gettext textdomain (PHP 3>= 3.0.7, PHP 4 >= 4.0b1) Fixe le domaine par défaut. string textdomain (string text_domain) textdomain() fixe le domaine à utiliser lors de recherche avec gettext(). Ce domaine dépend généralement de l’application. Le domaine par défaut précédent est retourné. Appelez cette fonction sans paramètre pour avoir la valeur courante, sans la modifier. 384 XXXI. GMP Ces fonctions vous permettent de travailler avec des nombres de taille arbitraire, en utilisant la librairie GNU MP. Pour pouvoir y accéder, vous devez compiler PHP avec le support GMP en utilisant l’option --with-gmp. Vous pouvez télécharger GMP sur le site de http://www.swox.com/gmp/. Ce site propose aussi un manuel GMP. Vous devez utiliser GMP version 2 ou plus récent pour utiliser ces fonctions. Certaines d’entre elles peuvent requérir une version encore plus récente de GMP. Ces fonctions ont été ajoutée dans PHP 4.0.4. Note : La plupart des fonctions GMP acceptent des nombres GMP comme arguments, définis ci-dessous comme resource. Cependant, la plus part de ces fonctions acceptent aussi des nombres et des chaînes à partir du moment où on peut les convertir en nombre. Si une fonction utilisant les entiers est plus rapide, elle sera automatiquement appelée si les arguments fournis sont des entiers. Cela se fait de manière transparante : vous pouvez donc utiliser des entiers avec les fonctions GMP sans perte de vitesse. Voir aussi gmp_init(). Exemple 1. Factorielle avec GMP <?php function fact($x) { if($x <= 1) return 1; else return gmp_mul($x,fact($x-1)); } print gmp_strval(fact(1000))."\n"; ?> Cet exemple va calculer factiorielle de 1000 (un plutôt grand nombre) très vite. 385 GMP gmp_init (PHP 4 >= 4.0.