Listing du fichier tutphp7.php
00001 <?php
00002 include("std7.php") ;
00003
00004 $PHP = s_span("PHP","grouge") ; # pratique pour colorier toutes les occurences du mot PHP
00005 $PHP4 = $PHP.s_span(" 4","grouge") ;
00006 $PHP5 = $PHP.s_span(" 5","grouge") ;
00007 $PHP7 = $PHP.s_span(" 7","grouge") ;
00008 $HTML = s_span("HTML","gvertf") ;
00009 $XHTML = ghVert("XHTML") ; # c'est plus court à écrire, n'est-ce pas ?
00010 $FTP = s_span("FTP","gvertf") ;
00011 $XML = s_span("XML","gbleu") ;
00012 $Perl = s_span("PERL","gbleu") ;
00013
00014 debutPage("tuteur PHP","strict") ;
00015 debutSection() ;
00016 h1("Un petit tuteur $PHP -- a small $PHP tutorial") ;
00017 h2(snbsp(8)."gilles.hunault@univ-angers.fr","grouge") ;
00018
00019 h1(aname("Table","tdm")." des matières") ;
00020
00021 div("cadre demiLargeur") ;
00022 p() ;
00023 nbsp(7) ;
00024 echo s_span("Voulez-vous voir un ".href("../tdc.htm","tour de cartes")." en $PHP ?","gvertf") ;
00025 finp() ;
00026 findiv() ;
00027
00028
00029 $GLOBALS["sect"] = 0 ; # sans doute pas une bonne idée, à discuter en cours...
00030
00031 p() ; $sect++ ; echo "$sect. ".href("#tth_sEc1$sect"," Présentation de $PHP ","bouton_fin orange_pastel nou") ; finp() ; $sous = 0 ;
00032
00033 $sous++ ; p() ; echo " $sect.$sous ".href("#tth_sEc$sect.$sous","Versions de $PHP") ; finp() ;
00034
00035 $sous++ ; p() ; echo " $sect.$sous ".href("#tth_sEc$sect.$sous","Exemples de code $PHP") ; finp() ;
00036
00037 p() ; $sect++ ; echo "$sect. ".href("#tth_sEc$sect."," Eléments du langage de $PHP ","bouton_fin jaune_pastel nou") ; finp() ;
00038
00039 $sous++ ; p() ; echo " $sect.$sous ".href("#tth_sEc$sect.1","Commentaires, variables, affectations etc.") ; finp() ; $sous = 0 ;
00040
00041 $sous++ ; p() ; echo " $sect.$sous ".href("#tth_sEc$sect.2","Tests et Boucles") ; finp() ;
00042
00043 $sous++ ; p() ; echo " $sect.$sous ".href("#tth_sEc$sect.3","Sous-programmes") ; finp() ;
00044
00045 $sous++ ; p() ; echo " $sect.$sous ".href("#tth_sEc$sect.4","Objets") ; finp() ;
00046
00047 $sous++ ; p() ; echo " $sect.$sous ".href("#tth_sEc$sect.5","Encodages") ; finp() ;
00048
00049 $sous++ ; p() ; echo " $sect.$sous ".href("#tth_sEc$sect.6","Sessions") ; finp() ;
00050
00051 $sous++ ; p() ; echo " $sect.$sous ".href("#tth_sEc$sect.7","Documentation") ; finp() ;
00052
00053
00054 ######################################################################################################################################
00055
00056 /* essayons d'automatiser un peut tout cela */
00057
00058 function section($section,$sectClass="bouton_fin jaune_pastel nou") {
00059
00060 $GLOBALS["sect"]++ ;
00061 $GLOBALS["sous"] = 0 ;
00062 $sect = $GLOBALS["sect"] ;
00063 p() ;
00064 echo "$sect. ".href("#tth_sEc$sect.",snbsp().$section.snbsp(),$sectClass) ;
00065 finp() ;
00066
00067 } # fin de fonction section
00068
00069 ###-----------------------------------------------------------------------------------------------------------------------------------
00070
00071 function sousSection($sousSection) {
00072
00073 $sect = $GLOBALS["sect"] ;
00074 $GLOBALS["sous"]++ ;
00075 $sous = $GLOBALS["sous"] ;
00076 p() ;
00077 echo " $sect.$sous ".href("#tth_sEc$sect.$sous",$sousSection) ;
00078 finp() ;
00079
00080 } # fin de fonction sousSection
00081
00082 ###-----------------------------------------------------------------------------------------------------------------------------------
00083
00084 function sousSectionLien($lien,$sousSection,$finp="") {
00085
00086 $sect = $GLOBALS["sect"] ;
00087 $GLOBALS["sous"]++ ;
00088 $sous = $GLOBALS["sous"] ;
00089 p() ;
00090 echo " $sect.$sous ".href($lien,$sousSection) ;
00091 echo $finp ;
00092 finp() ;
00093
00094 } # fin de fonction sousSection
00095
00096 ######################################################################################################################################
00097
00098
00099 section("Programmation classique en $PHP") ;
00100
00101 sousSection("Exemple 1 : un Bonjour complet") ;
00102
00103 sousSection("Exemple 2 : Table de multiplication") ;
00104
00105 sousSection("Exemple 3 : Calcul de moyennes de classe") ;
00106
00107
00108 section("Exemples spécifiques en $PHP") ;
00109
00110 sousSection("Tableaux associatifs et Expressions régulières") ;
00111
00112 sousSection("Nombre de fichiers dans un répertoire") ;
00113
00114 sousSection("Requêtes SQL dont SQLite et MySQL") ;
00115
00116
00117 section("Exemples plus techniques en $PHP") ;
00118
00119 sousSectionLien("http://forge.info.univ-angers.fr/~gh/Wanalexies/f_dicos.php","Dictionnaires d'un fichier texte") ;
00120
00121 sousSectionLien("http://forge.info.univ-angers.fr/~gh/Idas/Wcabiq/f_classif.php","Classification hiérarchique de données bactériologiques") ;
00122
00123 sousSectionLien("http://forge.info.univ-angers.fr/~gh/Idas/Wcabiq/f_identif.php","Identification automatique de vecteurs d'absence-présence") ;
00124
00125 sousSectionLien("http://forge.info.univ-angers.fr/~gh/jphistopct.php","Graphiques")." avec ".href("http://jpgraph.net/","jpgraph") ;
00126
00127 sousSectionLien("http://forge.info.univ-angers.fr/~gh/frames/framesindex.php","Diaporamas en $PHP") ;
00128
00129 sousSectionLien("../Leadb","Site LEADB (bioinformatique)") ;
00130
00131 sousSectionLien("http://forge.info.univ-angers.fr/~gh/affichette.php","Production de pdf")." via LaTeX " ;
00132
00133 sousSectionLien("http://forge.info.univ-angers.fr/~gh/Pagsd/lagrange3.php","Tracé de graphe mathématique")." via Dot " ;
00134
00135 # sousSectionLien("http://forge.info.univ-angers.fr/~gh/internet/chanteurs3.php","Interrogation dynamique de Google") ;
00136
00137
00138 section("En guise de conclusion sur $PHP","bouton_fin vert_pastel nou") ;
00139
00140 $sect = 0 ;
00141
00142 #########################################################################################################################
00143
00144 $sect++ ; h2(aname($sect.". Présentation de $PHP","tth_sEc$sect.")) ; $sous = 0 ; # section 1
00145
00146 #########################################################################################################################
00147
00148 blockquote() ; # section
00149
00150 p("texte") ;
00151 echo b("$PHP")." est un langage de programmation pour les serveurs Web, orienté base de données. " ;
00152 echo " Ce qui signifie qu'il permet de gérer des pages ".b("$HTML dynamiques")." sur le serveur et en particulier de " ;
00153 echo " construire des pages Web correspondant à des résultats de requêtes sur des bases de données de type " ;
00154 echo b("SQL").". " ;
00155 echo " Selon ses auteurs, sa syntaxe est proche du C, de Java et \n" ;
00156 echo " de $Perl. " ;
00157 echo b("$PHP")." se compose d'un langage de programmation classique \n" ;
00158 echo "(affectations, tests, boucles, fonctions...), de fonctions Web (y compris pour les protocoles, services et utilitaires \n" ;
00159 echo " comme LDAP, POP3, PDF, ZIP...) \n" ;
00160 echo " et de fonctions base de données (SQLite,MySQL,PostgreSQL..). " ;
00161 finp() ;
00162
00163 $sous++ ; h3(aname("$sect.$sous Versions de $PHP","tth_sEc$sect.$sous")) ;
00164
00165 blockquote() ; # sous-section
00166
00167 p("texte") ;
00168 echo " Nous décrivons ici l'utilisation de la version 7 de $PHP, \n" ;
00169 echo " avec quelques compléments sur les versions plus anciennes ($PHP 3, 4, 5). \n" ;
00170 echo " comme par exemple pour la programmation objets apparue avec $PHP4. \n" ;
00171 echo " Ce tuteur est largement inspiré de la documentation officielle, \n" ;
00172 echo " vous pouvez donc l'utiliser en 2020. \n" ;
00173 finp() ;
00174
00175 p("texte") ;
00176 echo " $PHP s'exécute sur le serveur et non pas sur le client (navigateur). C'est pourquoi on ne voit que \n" ;
00177 echo " le résultat de l'exécution du programme $PHP à l'aide d'un navigateur. \n" ;
00178 echo " Suivant la configuration du serveur, une erreur $PHP à l'exécution \n" ;
00179 echo " affiche un message ou se contente de renvoyer une page vide. \n" ;
00180 echo " On peut écrire une page Web avec n'importe quel éditeur de textes, sous Windows ou Linux, mais la coloration syntaxique est \n" ;
00181 echo " certainement une caractéristique minimale pour qu'un éditeur de textes soit acceptable pour $PHP. Donc exit Notepad et vi, \n" ;
00182 echo " et bienvenue à ".b("Notepad++").", ".b("vim")." ".b("Microsoft Visual Code")." ou ".b("Geany")."... \n" ;
00183 finp() ;
00184
00185 p("texte") ;
00186 echo " Une fois le programme écrit, il faut le transférer sur le serveur, dans un répertoire particulier, souvent ".s_span("public_html","gvert")." \n" ;
00187 echo " Pour la faculté des sciences d'Angers, ce répertoire est nommé ".s_span("forge_html","gvertf").". \n" ;
00188 finp() ;
00189
00190 p("texte") ;
00191 echo " Si vous connaissez déjà $Perl, vous pouvez profiter du \n" ;
00192 echo href("http://www.cs.wcupa.edu/~rkline/perl2php/","tableau synoptique")." \n" ;
00193 echo " des instructions $Perl et $PHP. \n" ;
00194 finp() ;
00195
00196 p("texte") ;
00197 echo " $PHP est disponible sous Windows, sous MacOs et sous Unix. \n" ;
00198 echo " Le site officiel est \n" ;
00199 finp() ;
00200
00201 div("center") ;
00202 echo href("http://www.php.net","http://www.php.net","gbleu nou") ;
00203 findiv() ;
00204
00205 p("texte") ;
00206 echo " $PHP est aussi \n" ;
00207 echo " livré en standard avec le serveur \n" ;
00208 echo b("Apache")." \n" ;
00209 echo " et l'interpréteur $PHP dans des distributions \"LAMP\" comme ".href("http://www.easyphp.org/","EasyPHP").", \n" ;
00210 echo " ".href("http://www.wampserver.com/presentation.php","Wamp")." et \n" ;
00211 echo " ".href("http://www.apachefriends.org/en/xampp.html","Xampp").". \n" ;
00212 finp() ;
00213
00214 finblockquote() ; # sous-section
00215
00216 $sous++ ; h3(aname("$sect.$sous Exemples de code $PHP","tth_sEc$sect.$sous")) ;
00217
00218 blockquote() ; # sous-section
00219
00220 p("texte") ;
00221 echo " Pour utiliser $PHP, une fois le logiciel installé, configuré \n" ;
00222 echo " il suffit d'écrire des fichiers de type ".s_span(".php","gvert")." plutôt que ".b(".htm")." ou \n" ;
00223 echo b(".html")." \n" ;
00224 echo " et le \n" ;
00225 echo " tour est joué (lire la ".href("../internet/serveurs.php","note locale")." sur les serveurs angevins). \n" ;
00226 finp() ;
00227
00228 p("texte") ;
00229 echo " L'appel à $PHP est commencé par le marqueur \n" ;
00230 echo b("<?php") ;
00231 echo " et se termine par le marqueur \n" ;
00232 echo b("?>").". \n" ;
00233 finp() ;
00234
00235 p("texte") ;
00236 echo " Il faut noter que dans la version 3 dès le premier appel à $PHP, \n" ;
00237 echo " le serveur Web gèrait une \"session\" qui gardait en mémoire un certain nombre \n" ;
00238 echo " d'informations, comme par exemple les variables $PHP \n" ;
00239 echo " mais ce n'est plus le cas depuis la version 4 et il faut donc faire un appel explicite à ".b("start_session()")."... \n" ;
00240 finp() ;
00241
00242 p("texte") ;
00243 echo " Le fichier suivant, nommé ".s_span("xmp01.php","gbleuf")." \n" ;
00244 finp() ;
00245
00246 # un affichage peu maintenable ! le code ' pre_fichier("xmp01.php") ; ' serait plus "clean"
00247
00248 pre("plusgros") ;
00249 echo span("gbleu") ;
00250 echo " <html> \n" ;
00251 echo " <head> \n" ;
00252 echo " <title> (gH) : un premier exemple en $PHP</title> \n" ;
00253 echo " </head> \n" ;
00254 echo " <body> \n" ;
00255 echo " Bonjour, <?php echo \" tout le monde \" ;?> \n" ;
00256 echo " </body> \n" ;
00257 echo " </html> \n" ;
00258 finspan() ;
00259 finpre() ;
00260
00261 p("texte") ;
00262 echo " est une page Web qui utilise le mode normal pour afficher " ;
00263 echo s_span(" Bonjour ","gvert")." et qui " ;
00264 echo " fait appel à $PHP pour afficher " ;
00265 echo s_span(" tout le monde","gvert").". " ;
00266 finp() ;
00267
00268 p("texte") ;
00269 echo b("Attention :")." l'imbrication " ;
00270 echo " des marqueurs Web classiques et ceux de " ;
00271 echo " $PHP n'a pas besoin d'être équilibrée tant " ;
00272 echo " que cela donne une page correcte, même si ce n'est pas une pratique recommandée." ;
00273 finp() ;
00274
00275 p("texte") ;
00276 echo " Par exemple, le fichier ".s_span("xmp02.php","gbleuf")." qui contient " ;
00277 finp() ;
00278
00279 # un affichage plus raisonnable et un fichier testable
00280
00281 pre_fichier("xmp02.php","cadre") ;
00282
00283 p("texte") ;
00284 echo " est syntaxiquement correct, alors que le marqueur ".b("<?php")." commence avant que le marqueur ".b("</ul>")." termine " ;
00285 echo " la liste (ce qui est normal, ici, puisque c'est $PHP qui termine la liste). " ;
00286 echo " Cette pratique, possible certes, n'est pas une bonne pratique. Il vaut mieux faire écrire à $PHP " ;
00287 echo "des fragments de code $XHTML valides dits ".em("self contained").". " ;
00288 finp() ;
00289
00290 p("texte") ;
00291 echo " On peut ouvrir et fermer $PHP plusieurs fois dans une même page, comme dans " ;
00292 finp() ;
00293
00294 pre_fichier("xmp03.php","cadre") ;
00295
00296 p("texte") ;
00297 echo " En termes de sécurité, $PHP est intéressant car c'est le serveur qui interprète la page. " ;
00298 echo " L'utilisateur ne voit que la page produite. Ainsi, la demande de l'affichage du texte source de la " ;
00299 echo " page précédente donne " ;
00300 finp() ;
00301
00302 pre_fichier("xmp03.html","cadrebleu") ;
00303
00304 p("texte") ;
00305 echo " comme si toute le texte avait été écrit \"normalement\". " ;
00306 finp() ;
00307
00308 finblockquote() ; # sous-section
00309
00310 finblockquote() ; # section
00311
00312 #########################################################################################################################
00313
00314 $sect++ ; h2(aname($sect.". Eléments du langage de $PHP","tth_sEc$sect.")) ; $sous = 0 ; # section 2
00315
00316 #########################################################################################################################
00317
00318 blockquote() ; # section
00319
00320 $sous++ ; h3(aname("$sect.$sous Commentaires, variables, affectations etc.","tth_sEc$sect.$sous")) ;
00321
00322 blockquote() ; # sous-section
00323
00324 p("texte") ;
00325 echo " Un commentaire peut être délimité par ".ghBleu('/'.'*') ;
00326 echo " et ".ghBleu('*'.'/') ;
00327 echo " ou suivre le symbole ".ghBleu('#') ;
00328 echo " ou le symbole double ".ghBleu('//').". " ;
00329 echo " L'intérêt d'avoir plusieurs jeux de commentaires est de pouvoir commenter à différents " ;
00330 echo " niveaux (titres, commentaires d'explication, petits commentaires brefs de structure...). " ;
00331 finp() ;
00332
00333 p("texte") ;
00334 echo " Une variable est repérée par le symbole ".ghBleu('$')." et l'affectation se " ;
00335 echo ' fait avec '.ghBleu("=").'. ' ;
00336 echo ' Par exemple '.ghBleu('$jmois = 0 ;').' met la valeur 0 ' ;
00337 echo ' dans la variable '.ghBleu('jmois').'. ' ;
00338 echo " $PHP n'est pas typé explicitement, ce qui signifie qu'on n'a " ;
00339 echo " pas besoin de préciser le type d'une variable. En interne, $PHP " ;
00340 echo ' utilise les types ' ;
00341 echo b("integer").', ' ;
00342 echo b("float").', ' ;
00343 echo b("string").', ' ;
00344 echo b("array").' et ' ;
00345 echo b("object").'. ' ;
00346 finp() ;
00347
00348 p("texte") ;
00349 echo " Les variables chaines de caractères utilisent les deux jeux de délimiteurs " ;
00350 echo b("'")." et " ;
00351 echo b('"')." ainsi que les séquences escape comme ".b("\\n"), b('\$')."..." ;
00352 echo " Lorsque le délimiteur ".b('"')." est utilisé, les variables à l'intérieur de la chaine " ;
00353 echo " sont ".em("interpolées").", c'est à dire remplacées par leur contenu. Voici un exemple " ;
00354 finp() ;
00355
00356 blockquote() ;
00357 table() ;
00358 tr() ;
00359 td() ; echo ghBleu(' $i = 2 ; ') ; fintd() ;
00360 fintr() ;
00361 tr() ;
00362 td() ; echo ghBleu(' echo " \$i vaut $i " ;"') ; fintd() ;
00363 td() ; echo ghVert(' # affiche $i vaut 2"') ; fintd() ;
00364 fintr() ;
00365 tr() ;
00366 td() ; echo ghBleu(' echo " \\\$i vaut \$i " ;"') ; fintd() ;
00367 td() ; echo ghVert(' # affiche \$i vaut $i"') ; fintd() ;
00368 fintr() ;
00369 fintable() ;
00370 finblockquote() ;
00371
00372 p("texte") ;
00373 echo " Les instructions $PHP doivent être terminées par des points-virgules. " ;
00374 echo " Les définitions de fonction et de classes d'objets ne sont pas des instructions mais des déclarations. " ;
00375 echo " Elles ne doivent pas être terminées par des points-virgules (en mettre ne constitue pas toujours une erreur)." ;
00376 finp() ;
00377
00378 p("texte") ;
00379 echo " Un tableau en $PHP est une variable qui utilise des crochets avec une valeur (indice) entre les " ;
00380 echo " crochets. L'indice peut être quelconque, ce qui fournit à la fois les tableaux classiques " ;
00381 echo " (indice numérique) et les ".em(b("hashs"))." ou ".em(b("tableaux associatifs"))." (indices chaine de caractères). Ainsi " ;
00382 echo ghBleu('$age["Pierre"] = 12 ;')." met 12 dans le tableau ".b("age") ;
00383 echo " à l'indice ".b("Pierre").". " ;
00384 echo " La syntaxe explicite \"moderne\" ".ghBleu('$t = [1,5,12] ; ')." est aussi acceptée en $PHP7. " ;
00385 finp() ;
00386
00387 p("texte") ;
00388 echo " La fonction ".ghBleu(b("count()"))." renvoie le nombre d'éléments dans le " ;
00389 echo " tableau et on accède aux différents éléments du tableau avec ".ghBleu(b("each()"));
00390 echo " ou à partir de ".ghBleu(b("next()"))." et de ".ghBleu(b("prev()")).". " ;
00391 echo " Les tableaux peuvent être triés avec " ;
00392 echo ghBleu(b("sort()")).", " ;
00393 echo ghBleu(b("asort()")).", " ;
00394 echo ghBleu(b("arsort()")).", " ;
00395 echo ghBleu(b("ksort()"))."... " ;
00396 finp() ;
00397
00398 p("texte") ;
00399 echo " Certains tableaux sont créés dynamiquement. Ainsi " ;
00400 echo ghBleu("explode(char,chaine)")." renvoie un tableau où chaque élément correspondant au découpage de " ;
00401 echo " la chaine, ".b("char")." étant le séparateur. Par exemple " ;
00402 finp() ;
00403
00404 div("center") ;
00405 p("texte") ;
00406 echo ghBleu('explode(" ; "," il pleut ; je mange ; tu dors " ) ; ') ;
00407 finp() ;
00408 findiv() ;
00409
00410 p("texte") ;
00411 echo " renvoie un tableau a trois éléments " ;
00412 echo " dont le premier (situé à l'indice zéro) est ".b("il pleut").". " ;
00413 echo " Si on utilise plus d'un indice, on met des crochets autour de chaque indice. Ainsi l'élément matriciel traditionnel " ;
00414 echo " M".sub("i,j")." d'une matrice se note ".ghBleu('$M[$i][$j]') ;
00415 echo "en $PHP. " ;
00416 finp() ;
00417
00418 p("texte") ;
00419 echo " La fonction ".b("print_r")." permet d'afficher proprement et rapidement tout le contenu d'un objet ou d'un tableau." ;
00420 finp() ;
00421
00422 p("texte") ;
00423 echo " Pour mettre le contenu d'un champ issu d'un formulaire dans une variable, " ;
00424 echo " il faut passer par le \"".href("https://www.php.net/manual/fr/language.variables.superglobals.php","super-tableau")."\" ".b("_GET").". " ;
00425 echo " Par exemple avec le code $HTML suivant, pour récupérer la valeur de l'age, " ;
00426 finp() ;
00427
00428 pre("gbleu plusgros") ;
00429 echo ' <form action=... method="get"> '."\n" ;
00430 echo ' Id : <input type="text" name="age" /><br>'."\n" ;
00431 echo ' <input type="submit" value="envoi" /> '."\n" ;
00432 echo ' </form> '."\n" ;
00433 finpre() ;
00434
00435 p("texte") ;
00436 echo " il faut écrire " ;
00437 finp() ;
00438
00439 pre("gbleu") ;
00440 echo ' $x = $_GET["age"] ; ' ;
00441 finpre() ;
00442
00443 p("texte") ;
00444 echo " mais il serait sans doute plus correct de nommer ".b("age")." la variable associée, soit le code : " ;
00445 echo ghBleu('$age = $_GET["age"] ;').". On notera que la fonction " ;
00446 echo b("isset()")." permet de tester s'il y a quelquechose au bon indice dans le tableau ".b("_GET") ;
00447 echo " et que pour la méthode ".b("POST").", le super-tableau est nommé ".b("_POST").". " ;
00448 finp() ;
00449
00450 p("texte") ;
00451 echo " Enfin, les variables d'environnement sont considérées comme des variables $PHP normales, " ;
00452 echo " même si la fonction ".ghBleu("getenv()")." donne accès aux variables systèmes. " ;
00453 finp() ;
00454
00455 p("texte") ;
00456 echo " Lors de l'affectation, $PHP permet de nombreux raccourcis ".em(b("à la C")).", comme " ;
00457 finp() ;
00458
00459 pre("gbleu plusgros") ;
00460 echo ghBleu('$a = ++$b = $c; ') ;
00461 finpre() ;
00462
00463 p("texte") ;
00464 echo " ce que nous ne conseillons pas pour des questions de lisibilité. " ;
00465 finp() ;
00466
00467 p("texte") ;
00468 echo " L'opérateur ".ghBleu(b("%")) ;
00469 echo " renvoie le reste de la division entière (ou ".em("modulo")."). " ;
00470 echo " La concaténation de chaine se fait avec un point et " ;
00471 echo ghBleu(b('$a = $a . $b'))." peut se raccourcir en ".ghBleu(b('$a .= $b')).". " ;
00472 echo " Les opérateurs logiques ont les \"doux\" noms " ;
00473 echo ghBleu(b("and"))." , " ;
00474 echo ghBleu(b("or"))." , " ;
00475 echo ghBleu(b("xor"))." , " ;
00476 echo ghBleu(b("!"))." (not) et les opérateurs de comparaison sont standards : " ;
00477 echo ghBleu(b("=="))." , " ;
00478 echo ghBleu(b("<="))." , " ;
00479 echo ghBleu(b(">="))." . " ;
00480 finp() ;
00481
00482 p("texte") ;
00483 echo " Pour les habitués au C et à $Perl, il est possible d'utiliser la construction " ;
00484 echo ghBleu(b('$a ? $b : $c ;')) ;
00485 echo " comme raccourci pour l'affection classique ".ghBleu(b('if $a then $b else $c')).", " ;
00486 echo " ce que nous ne conseillons pas non plus pour des questions de lisibilité. " ;
00487 finp() ;
00488
00489 finblockquote() ; # sous-section
00490
00491 div("cadre") ;
00492 blockquote() ; # division
00493 p() ;
00494 echo " Vous trouverez à l'adresse ".href("../internet/montresource.php?nomfic=l2aprog01.php","prog01","bouton_fin vert_pastel nou") ;
00495 echo " de nombreux exemples d'affectations et des compléments sur les variables. " ;
00496 finp() ;
00497 finblockquote() ; # division
00498 findiv() ;
00499
00500 $sous++ ; h3(aname("$sect.$sous Tests et Boucles","tth_sEc$sect.$sous")) ;
00501
00502 blockquote() ; # sous-section
00503
00504 p("texte") ;
00505 echo " Le test en ".b("SI")." se fait avec ".ghBleu("if (condition) { ... }").". On peut utiliser " ;
00506 echo ghBleu("else")." pour l'alternative inverse et " ;
00507 echo ghBleu("elseif") ." pour des alternatives multiples. " ;
00508 echo " L'instruction ".ghBleu("switch")." est également disponible pour les structures de cas générales. " ;
00509 echo b(" Attention : ")." les parenthèses sont obligatoires pour les conditions. " ;
00510 finp() ;
00511
00512 p("texte") ;
00513 echo " La boucle ".b("TANT QUE")." utilise ".ghBleu("while (condition) { ... }")." . " ;
00514 echo " La forme " .ghBleu("do {...} while (condition)")." réalise la boucle ".b("répéter... jusqu'à")." puisqu'elle " ;
00515 echo " effectue le test en fin de boucle. " ;
00516 finp() ;
00517
00518 p("texte") ;
00519 echo " La boucle pour classique en $PHP " ;
00520 echo " est ".ghBleu("for (debut;fin;increment) { ...}") ;
00521 echo " mais il existe aussi une boucle ".b("foreach").". " ;
00522 finp() ;
00523
00524 p("texte") ;
00525 echo " Une bonne habitude à prendre est de consulter le manuel de $PHP (".href("http://php.net","php.net")." pour avoir le détail " ;
00526 echo " des instructions et fonctions $PHP. On y trouve aussi des exemples de script, comme pour la page sur " ;
00527 echo href("http://php.net/manual/fr/control-structures.foreach.php","foreach").". " ;
00528 finp() ;
00529
00530 finblockquote() ; # sous-section
00531
00532 div("cadre") ;
00533 blockquote() ; # division
00534 p() ;
00535 echo " Vous trouverez à l'adresse ".href("../internet/montresource.php?nomfic=l2aprog02.php","prog02","bouton_fin vert_pastel nou") ;
00536 echo " de nombreux exemples sur les tests et les boucles. " ;
00537 finp() ;
00538 finblockquote() ; # division
00539 findiv() ;
00540
00541 $sous++ ; h3(aname("$sect.$sous Sous-programmes","tth_sEc$sect.$sous")) ;
00542
00543 blockquote() ; # sous-section
00544
00545 p("texte") ;
00546 echo " Un sous-programme en $PHP est forcément une fonction, déclarée par " ;
00547 echo ghBleu(b("function Nom (liste d'Arguments) { ... ; } ")).". " ;
00548 finp() ;
00549
00550 p("texte") ;
00551 echo " La valeur renvoyée éventuellement doit être spécifiée par ".ghBleu(b("return")).". Pour envoyer plus d'une valeur, " ;
00552 echo " il faut soit convertir le tout en chaine de caractères (\"sérialiser\"), soit renvoyer un " ;
00553 echo " tableau explicite comme dans ".ghBleu(b("return array(\$i, \$j)")).". " ;
00554 finp() ;
00555
00556 p("texte") ;
00557 echo " Les arguments d'une fonction sont obligatoires sauf s'ils ont une valeur par défaut. Le passage par référence plutôt que par valeur se fait en " ;
00558 echo " rajoutant ".ghBleu(b("&"))." soit dans l'en-tête de la fonction soit au moment de l'appel. Si l'argument est suivi " ;
00559 echo " de ".ghBleu(b("= valeur")).", il s'agit d'un paramètre facultatif et ce qui suit le symbole égal sera pris comme valeur par défaut. " ;
00560 echo " Si on met le symbole ".ghBleu("@")." devant le nom d'une fonction, le message d'erreur éventuel (en cas d'erreur) n'est pas affiché. " ;
00561 finp() ;
00562
00563 p() ;
00564 echo " Vous trouverez à l'adresse ".href("../internet/montresource.php?nomfic=l2aprog03.php","prog03","bouton_fin vert_pastel nou") ;
00565 echo " de nombreux exemples sur les tableaux et les définitions de fonctions. " ;
00566 finp() ;
00567
00568 finblockquote() ; # sous-section
00569
00570 $sous++ ; h3(aname("$sect.$sous Objets","tth_sEc$sect.$sous")) ;
00571
00572 blockquote() ; # sous-section
00573
00574 p("texte") ; ;
00575 echo " Les objets en $PHP, disponibles depuis $PHP4, utilisent le paradigme de " ;
00576 echo href("http://hachesse.developpez.com/objetphp/","classe").", comme C et Java (et non pas de le paradigme " ;
00577 echo " de ".href("https://developer.mozilla.org/fr/docs/Learn/JavaScript/Objects/Prototypes_Objet","prototype") ;
00578 echo " comme le fait Javascript). S'il y n'a pas de typage explicite, il y a déclaration des données (ou attributs, " ;
00579 echo " propriétés) avec le mot-clé ".b("var")." et déclaration des méthodes (ou fonctions propres) via le mot-clé ".b("function").". " ;
00580 echo " Les constructeurs (".b("new")."), instanciations et autres manipulations sont donc \"classiques\". " ;
00581 echo " Voici un exemple de programmation objet en $PHP7 : " ;
00582 finp() ;
00583
00584 pre_fichier("objets_php7.php","cadre") ;
00585
00586 p();
00587 echo " Résultat de son exécution en ligne de commandes :" ;
00588 finp() ;
00589
00590 pre_fichier("objets_php7.txt","cadrejaune") ;
00591
00592 p("texte") ; ;
00593 echo " Depuis $PHP5, le modèle objet a été revu et complété. Les données (ou attributs) et les fonctions (ou méthodes) " ;
00594 echo " peuvent être déclarées ".b("public").", ".b("private")." ou ".b("protected").". Les constructeurs et destructeurs " ;
00595 echo " utilisent les noms explicites ".b("__construct")." (au lieu du nom de classe en $PHP4) et ".b("__destruct").". " ;
00596 echo " Le manuel officiel de $PHP, nommé ".href("http://www.php.net/manual/fr/language.oop5.php","oop5")." est assez détaillé pour les objets. " ;
00597 echo " De plus on trouve de nombreux documents sur le Web qui détaille les objets en $PHP, comme " ;
00598 echo href("http://fr.wikibooks.org/wiki/Programmation_PHP/La_programmation_orient%C3%A9e_objet","ce wikibook").", " ;
00599 echo " les ".href("http://classes.soe.ucsc.edu/cmps183/Spring06/lectures/OO%20Programming%20in%20PHP.pdf","transparents de M. Slater") ;
00600 echo "(".href("slater.pdf","version locale").", " ;
00601 echo " les ".href("http://somabo.de/talks/200703_montreal_oop.pdf","transparents de 2007-Montreal") ;
00602 echo "(".href("montreal_oop.pdf","version locale").", " ;
00603 echo " ou d'autres livres trouvés avec Google si on cherche " ;
00604 echo href("http://www.google.fr/search?q=php%20oo%20programming%20filetype:pdf","php oo programming filetype:pdf").". " ;
00605 finp() ;
00606
00607 p("texte") ;
00608 echo " Une présentation courte de la couche objet et au passage des méthodes \"magiques\" se trouve dans le " ;
00609 echo " cours ".href("crs_php_objets.pdf","php-objets")." de notre collègue David LESAINT que nous remercions ici pour ce document. " ;
00610 finp() ;
00611
00612 finblockquote() ; # sous-section
00613
00614 $sous++ ; h3(aname("$sect.$sous Encodages","tth_sEc$sect.$sous")) ;
00615
00616 blockquote() ; # sous-section
00617
00618 p("texte") ;
00619 echo " Lorsqu'un navigateur demande une page à un serveur, celui-ci envoie une entête ou ".b("header")." qui peut contenir une déclaration d'encodage. " ;
00620 echo " Il peut alors y avoir conflit avec l'indication d'encodage (".b("charset").") fourni dans l'attribut content de l'élément meta. Pour éviter cela, il est " ;
00621 echo " possible d'utiliser l'instruction ".href("http://php.net/manual/fr/function.header.php","header")." de $PHP, sans doute comme première instruction. " ;
00622 echo " Vous pouvez consulter nos deux programmes " ;
00623 echo href("../internet/forceiso.php","forceiso") ;
00624 echo " et " ;
00625 echo href("../internet/forceutf.php","forceutf") ;
00626 echo " pour vérifier que même le titre est accentué, en ".b("UTF")." comme en ".b("ISO8859").". Les codes-sources sont respectivement " ;
00627 echo href("../internet/montresource.php?nomfic=forceiso.php","source forceiso") ;
00628 echo " et " ;
00629 echo href("../internet/montresource.php?nomfic=forceutf.php","source forceutf").". " ;
00630 echo " Pour ce dernier fichier, vous devriez voir dans le code-source des caractères bizarres comme ".b("é")." au lieu de ".b("é")." car c'est de l'UTF. " ;
00631 finp() ;
00632
00633 p("texte") ;
00634 echo b("Remarque : ")."il faut bien sûr s'assurer que l'éditeur de textes que l'on utilise code bien les caractères avec le \"bon\" encodage car une " ;
00635 echo " page Web ne peut s'afficher correctement que si les 3 informations suivantes sont cohérentes (4 si on compte l' ".b("encoding")." en cas de " ;
00636 echo " déclaration $XML) : " ;
00637 finp() ;
00638
00639 ol() ;
00640 li("l'encodage indiqué par le header ;") ;
00641 li("l'encodage indiqué dans l'élément meta ;") ;
00642 li("l'encodage utilisé par l'éditeur de textes.") ;
00643 finol() ;
00644
00645 p("texte") ;
00646 echo " Nous fournissons dans la petite bibliothèque de fonctions $PHP dites " ;
00647 echo b(href("../internet/php_conceptuel.php","conceptuelles")) ;
00648 echo " accessibles via ".href("../internet/stdphp.php","std.php") ;
00649 echo " une solution \"propre\" comme celle nommée ".b("debutPage()")." pour assurer cette cohérence d'encodage. " ;
00650 finp() ;
00651
00652 finblockquote() ; # sous-section
00653
00654 $sous++ ; h3(aname("$sect.$sous Sessions","tth_sEc$sect.$sous")) ;
00655
00656 blockquote() ; # sous-section
00657
00658 p("texte") ;
00659 echo " Le protocole ".b("HTTP")." est un protocole sans mémoire. Ceci signifie que si vous demandez la page Web ".b("a.php")." il va y avoir exécution du programme " ;
00660 echo " correspondant sur le serveur, avec ses variables et ses affichages éventuels, mais qu'à la fin du programme, toutes les variables de ce programme disparaissent et " ;
00661 echo " que dès lors ".b("HTTP")." ne se \"souvient plus\" de ce qu'il y avait comme variables. Pourtant, dans certains cas, on aimerait conserver une trace de ce qui a été défini ou " ;
00662 echo " choisi, comme dans le cas du \"panier\" lors d'achats sur internet. Pour conserver des variables et leur valeur d'une page à l'autre, $PHP fournit la " ;
00663 echo " notion de ".b(em("session")).", assez bien expliquée dans le manuel $PHP à la rubrique ".href("http://www.php.net/manual/fr/book.session.php","book.session").". " ;
00664 echo " En deux mots : dès le début de la page on écrit ".b("session_start() ;")." et ensuite on peut utiliser le «super tableau» nommé " ;
00665 echo " ".b("\$_SESSION").". Pour y stocker des objets, il faut sans doute les convertir en une représentation caractère adaptée " ;
00666 echo " avec ".href("http://php.net/manual/fr/function.serialize.php","serialize()").". " ;
00667 finp() ;
00668
00669 finblockquote() ; # sous-section
00670
00671 $sous++ ; h3(aname("$sect.$sous Documentation","tth_sEc$sect.$sous")) ;
00672
00673 blockquote() ; # sous-section
00674
00675 p("texte") ;
00676 echo " Même si $PHP n'est pas typé explicitement, $PHP a des fonctions spécialisées pour chaque type de variable. " ;
00677 echo " Par exemple, pour les tableaux il y a count(), sort() pour les chaines de caractères, il y a " ;
00678 echo " strlen(), strtoupper()... Pour chaque rubrique d'utilisation des fonctions, et pour chaque type, il y a " ;
00679 echo " des dizaines de fonctions. Il est important de parcourir le manuel $PHP pour éviter de mal reprogrammer " ;
00680 echo " une fonction déjà existante. Vous pouvez utiliser le tableau suivant tant que vous n'êtes pas " ;
00681 echo " familiarisé avec le ".href("http://www.php.net/manual/fr/index.php","manuel").". " ;
00682 finp() ;
00683
00684 blockquote() ;
00685 blockquote() ;
00686 table(1,20,"collapse") ;
00687 tr() ;
00688 td("C","orange_pastel") ; echo b(href("http://www.php.net/manual/fr/funcref.php" ,"index des rubriques","nou")) ; fintd() ;
00689 td("C","vert_pastel") ; echo b(href("http://www.php.net/manual/fr/book.strings.php" ,"chaines de caractères","nou")) ; fintd() ;
00690 td("C","orange_pastel") ; echo b(href("http://www.php.net/manual/fr/book.array.php" ,"tableaux","nou")) ; fintd() ;
00691 fintr() ;
00692 tr() ;
00693 td("C","vert_pastel") ; echo b(href("http://www.php.net/manual/fr/book.pcre.php" ,"expressions régulières","vert_pastel nou")) ; fintd() ;
00694 td("C","orange_pastel") ; echo b(href("http://php.net/manual/fr/language.oop5.php" ,"objets","orange_pastel nou")) ; fintd() ;
00695 td("C","vert_pastel") ; echo b(href("http://www.php.net/manual/fr/book.filesystem.php" ,"fichiers et OS","vert_pastel nou")) ; fintd() ;
00696 fintr() ;
00697 fintable() ;
00698 finblockquote() ;
00699 finblockquote() ;
00700
00701 p("texte") ;
00702 echo " Il serait illusoire de vouloir apprendre ou maitriser ".b("rapidement")." $PHP de par la profusion de ces fonctions : il y en " ;
00703 echo " a en gros plus de 3 000 dans le \"coeur\" de $PHP. Et avec des noms parfois incohérents, des syntaxes pas toujours standard... " ;
00704 echo " C'est pourquoi nous conseillons d'utiliser des éditeurs \"évolués\" pour écrire du $PHP, comme " ;
00705 echo href("http://www.geany.org/","Geany")." qui est capable d'afficher la liste des fonctions $PHP dès qu'on en saisit les premières lettres... " ;
00706 finp() ;
00707
00708 p("texte") ;
00709 echo " Si $PHP affiche des pages Web via ".b("$HTML").", il est également capable de produire du ".b("PDF")." via des " ;
00710 echo href("http://ourcodeworld.com/articles/read/226/top-5-best-open-source-pdf-generation-libraries-for-php","bibliothèques de fonctions dédiées").". " ;
00711 finp() ;
00712
00713 finblockquote() ; # sous-section
00714
00715 finblockquote() ; # section
00716
00717 #########################################################################################################################
00718
00719 $sect++ ; h2(aname($sect.". Programmation classique en $PHP","tth_sEc$sect.")) ; $sous = 0 ; # section 3
00720
00721 #########################################################################################################################
00722
00723 blockquote() ; # section
00724
00725 $sous++ ; h3(aname("$sect.$sous Exemple 1 : un bonjour complet","tth_sEc$sect.$sous")) ;
00726
00727 blockquote() ; # sous-section
00728
00729 p("texte") ;
00730 echo " Rappelons que ce premier programme doit afficher le mot \"Bonjour\" puis demander à l'utilisateur " ;
00731 echo " son prénom et lui dire au revoir, en affichant la date, l'heure et le prénom en majuscules. " ;
00732 finp() ;
00733
00734 p("texte") ;
00735 echo " L'affichage du mot Bonjour et la saisie du prénom ne relèvent pas vraiment de $PHP, " ;
00736 echo " c'est le rôle d'un formulaire ".b("$HTML").". Une version minimale pour cette saisie est " ;
00737 finp() ;
00738
00739 pre_fichier("bonjour_f.htm","cadrejaune") ;
00740
00741 p("texte") ;
00742 echo " Lorsque l'utilisateur clique sur le bouton \"envoi !\", la machine transmet l'URL " ;
00743 echo b(" http://.../bonjour.php?prenom=XXX") ;
00744 echo " où ".b("XXX")." correspond au texte entré dans le champ " ;
00745 echo " du prénom (ou ".b("http://.../bonjour.php?prenom=")." si le champ est vide). " ;
00746 echo " Signalons qu'il est d'ailleurs possible d'entrer directement cette URL \"à la main\" dans le navigateur, ce qui permet de " ;
00747 echo " tester le programme même sans formulaire, possibilité que nous exploiterons avec le prochain exemple. " ;
00748 finp() ;
00749
00750 p("texte") ;
00751 echo " Un programme $PHP de réponse minimal est " ;
00752 finp() ;
00753
00754 pre_fichier("bonjour.php","cadrejaune") ;
00755
00756 p("texte") ;
00757 echo " Mais on préférera sans doute une version plus habillée, avec des styles ".b("CSS").", " ;
00758 echo" ce qui est plus du ressort d'".b("$HTML")." que de $PHP. " ;
00759 finp() ;
00760
00761 p() ;
00762 echo " Vous pouvez tester ".href("pgenphp3.htm","ici")." ce programme. " ;
00763 finp() ;
00764
00765 finblockquote() ; # sous-section
00766
00767 $sous++ ; h3(aname("$sect.$sous Exemple 2 : Table de multiplication","tth_sEc$sect.$sous")) ;
00768
00769 blockquote() ; # sous-section
00770
00771 p("texte") ;
00772 echo " D'habitude, le programme table de multiplication vient demander un nombre (ou utiliser la valeur " ;
00773 echo " passée en paramètre). Ici nous ne ferons pas de formulaire, car nous utiliserons la valeur " ;
00774 echo " passée sur la ligne de l'URL (avec un rappel du passage de paramètre si l'URL est entrée " ;
00775 echo " telle quelle). " ;
00776 finp() ;
00777
00778 pre_fichier("tdm.php","cadrejaune") ;
00779
00780 p("texte") ;
00781 echo " Il est possible de passer plusieurs paramètres, par exemple pour gérer la largeur de " ;
00782 echo " l'affichage. Le passage de paramètres, commencé par le symbole " ;
00783 echo b("?")." avec un couple ".b("variable=valeur")." se prolonge par le symbole " ;
00784 echo b("&")." suivi d'un autre couple ".b("variable=valeur").". " ;
00785 echo " C'est ce qui est rappelé dans la fonction aide(). " ;
00786 echo " Nous profitons alors du passage de paramètre par défaut de $PHP dans l'appel de la fonction tdm() " ;
00787 echo " dans cette deuxième version :" ;
00788 finp() ;
00789
00790 pre_fichier("tdmv2.php","cadrejaune") ;
00791
00792 p() ;
00793 echo " Vous pouvez tester ".href("pgenphp3.htm","ici")." ce programme. " ;
00794 finp() ;
00795
00796 finblockquote() ; # sous-section
00797
00798 $sous++ ; h3(aname("$sect.$sous Exemple 3 : Calcul de moyennes de classe","tth_sEc$sect.$sous")) ;
00799
00800 blockquote() ; # sous-section
00801
00802 p("texte") ;
00803 echo " Il s'agit ici de calculer la moyenne de notes lues dans un fichier. Nous allons en fait proposer " ;
00804 echo " soit d'entrer les noms et notes dans une zone texte soit d'envoyer le fichier. Nous n'utiliserons " ;
00805 echo " qu'un seul fichier nommé ".href("montresource.php?nomfic=moyenne.php","moyenne.php")." qui s'appellera lui-même avec divers paramètres. " ;
00806 echo" Le programme principal vient seulement choisir le sous-programme à exécuter en " ;
00807 echo " fonction du paramétre ".b("mode").", soit le texte : " ;
00808 finp() ;
00809
00810 pre_fichier("classev1.php","cadrejaune") ;
00811
00812 p("texte") ;
00813 echo " La saisie est un simple formulaire qui vient relancer le script ".b("moyenne.php") ;
00814 echo " avec la bonne valeur pour le paramètre mode, soit : " ;
00815 finp() ;
00816
00817 pre_fichier("classev2.php","cadrejaune") ;
00818
00819 p("texte") ;
00820 echo " La fonction ".b("debutPageHtml()")." gère le document (avec les bons " ;
00821 echo " tags de début ".b("<html>").", ".b("<body>")." etc.). " ;
00822 echo " Chaque saisie particulière utilise son formulaire ".b("$HTML")." :" ;
00823 finp() ;
00824
00825 pre_fichier("classev3.php","cadrejaune") ;
00826
00827 p("texte") ;
00828 echo " La gestion des calculs consiste à appeler le sous-programme ".b("calculs")." avec comme " ;
00829 echo " paramètre une chaine de caractère qui contient toutes les valeurs entrées. Dans le cas d'une saisie " ;
00830 echo " dans le formulaire, on dispose tout de suite de cette variable. Dans le cas de la saisie " ;
00831 echo " sur fichier local, on vient lire le fichier et transférer son contenu dans cette variable. " ;
00832 echo " Nous avions convenu pour le format d'entrée de séparer le nom des notes par une étoile (mais pas " ;
00833 echo " d'imposer un nombre de notes). La partie ".b("calculs")." vient lire la variable caractère " ;
00834 echo " par caractère, remplaçant au passage les sauts de ligne par des espaces et découpe " ;
00835 echo " en mots la variable, en affectant là où il faut dès que l'étoile est trouvée. Pour les " ;
00836 echo " affichages, nous faisons appel à la même fonction puisque nous trions les tableaux " ;
00837 echo em("in situ")." définies comme des variables globales. " ;
00838 finp() ;
00839
00840 p() ;
00841 tarea_fichier("classev4.php","cadrebleu") ;
00842 finp() ;
00843
00844 p() ;
00845 echo " Vous pouvez tester ".href("pgenphp3.htm","ici")." ce programme. " ;
00846 finp() ;
00847
00848 finblockquote() ; # sous-section
00849
00850 finblockquote() ; # section
00851
00852 #########################################################################################################################
00853
00854 $sect++ ; h2(aname($sect.". Exemples spécifiques en $PHP","tth_sEc$sect.")) ; $sous = 0 ; # section 4
00855
00856 #########################################################################################################################
00857
00858 blockquote() ; # section
00859
00860 $sous++ ; h3(aname("$sect.$sous Tableaux associatifs et Expressions régulières","tth_sEc$sect.$sous")) ;
00861
00862 blockquote() ; # sous-section
00863
00864 p("texte") ;
00865 echo " Une fois la syntaxe de base de $PHP maitrisée, il reste à bien savoir utiliser les " ;
00866 echo href("https://fr.wikipedia.org/wiki/Tableau_associatif","tableaux associatifs")." et les expressions régulières, " ;
00867 echo " parce que le code $PHP devient alors concis et efficace. " ;
00868 finp() ;
00869
00870 p("texte") ;
00871 echo " Pour les tableaux, nous conseillons le lien " ;
00872 echo href("http://www.apprendre-php.com/tutoriels/tutoriel-7-les-tableaux-ou-arrays.html","tutoriel-7") ;
00873 echo " sur ".href("http://www.apprendre-php.com/","www.apprendre-php.com").", ce qui amène à " ;
00874 echo " l'instruction ".href("http://php.net/manual/fr/control-structures.foreach.php","foreach").". " ;
00875 echo " En ce qui concerne les expressions régulières, sur le " ;
00876 echo href("http://www.siteduzero.com/","siteduzero.com") ;
00877 echo " on trouve une " ;
00878 echo href("http://www.siteduzero.com/informatique/tutoriels/concevez-votre-site-web-avec-php-et-mysql/les-expressions-regulieres-partie-1-2","gentille introduction") ;
00879 echo " qu'on pourra compléter par la page du " ;
00880 echo href("http://fr.wikipedia.org/wiki/Expression_rationnelle","wiki français")." et du " ;
00881 echo href("http://en.wikipedia.org/wiki/Regular_expression","wiki anglais")." , " ;
00882 echo " par le " ;
00883 echo href("http://phpcodeur.net/articles/php/regex1","tutorial de phpcodeur").", " ;
00884 echo " puis par des exemples orientés Web via " ;
00885 echo href("http://www.latosensu.be/articles/core/php-regex-library/php-regex-library.php","php-regex-library") ;
00886 echo " et enfin, on trouvera de nombreux liens techniques à la page " ;
00887 echo href("http://coding.smashingmagazine.com/2009/06/01/essential-guide-to-regular-expressions-tools-tutorials-and-resources/","essential-guide") ;
00888 echo " sans oublier le " ;
00889 echo href("http://regexp.zug.fr/","fameux testeur de regexp")." nommé ".b("regexp.zug") ;
00890 echo " et notre ".href("tutregexp.php","mini-tuteur")." sur les expressions régulières. " ;
00891 echo finp() ;
00892
00893 p("texte") ;
00894 echo " Les expressions régulières trouvent naturellement leur place dans le test des valeurs saisies par les utilisateurs dans " ;
00895 echo " les formulaires des pages Web mais on s'en sert aussi beaucoup aussi lors de la lecture de fichiers. Il faut savoir qu'en plus des " ;
00896 echo " fonctions classiques sur fichiers comme " ;
00897 echo href("http://php.net/manual/fr/function.fopen.php","fopen()").", " ;
00898 echo href("http://php.net/manual/fr/function.fgets.php","fgets()")." et " ;
00899 echo href("http://php.net/manual/fr/function.fclose.php","fclose()").", " ;
00900 echo " $PHP fournit des fonctions \"intéressantes\" et plus récentes comme " ;
00901 echo href("http://php.net/manual/fr/function.file-get-contents.php","file_get_contents()").". " ;
00902 echo " Rappelons au passage que $PHP sait lire n'importe quelle URL comme un fichier en lecture seule, ce qui permet " ;
00903 echo " de lire par programme $PHP toutes les pages web de tous les sites du monde... en seulement quelques milliards d'heures ! " ;
00904 finp() ;
00905
00906 p() ;
00907 echo " Voici quelques exemples pour les tableaux associatifs et les expressions régulières : " ;
00908 finp() ;
00909
00910 pre_fichier("exemplesER.php","cadre") ;
00911
00912 finblockquote() ; # sous-section
00913
00914 $sous++ ; h3(aname("$sect.$sous Nombre de fichiers dans un répertoire","tth_sEc$sect.$sous")) ;
00915
00916 blockquote() ; # sous-section
00917
00918 p("texte") ;
00919 echo " $PHP dispose de fonctions pour interagir avec le système d'exploitation. Par exemple la fonction ".ghBleu("dir()")." renvoie une variable " ;
00920 echo " (une ".em("instance d'objet")." en fait) de type répertoire. On peut donc lui appliquer la " ;
00921 echo em("méthode")." ".ghBleu("read()")." et la méthode ".ghBleu("close()").". " ;
00922 echo " Comme son nom l'indique, ".ghBleu("read()")." permet de lire les entrées du répertoire, y compris " ;
00923 echo " ".b(".")." et ".b("..")." (sous Unix). " ;
00924 echo " Plus précisément, ".ghBleu("read()")." lit au premier appel la premier entrée du répertoire, " ;
00925 echo " puis l'entrée courante dans le répertoire à partir de la précédente pour les appels " ;
00926 echo " suivants, le pointeur de position étant conservé en interne par $PHP. " ;
00927 finp() ;
00928
00929 p("texte") ;
00930 echo " Pour compter le nombre de fichiers dans un répertoire, il suffit d'appeler la fonction ".ghBleu("dir()") ;
00931 echo " en lui passant comme paramètre le nom du répertoire à consulter puis à exécuter une boucle sur " ;
00932 echo " l'appel de la fonction ".ghBleu("read()").". Par exemple, sur notre système, " ;
00933 echo " nous avons un répertoire ".b("Php/")." qui contient deux sous répertoires, ".b("Documentation/")." et " ;
00934 echo b(" Programmes/").". Nous avons donc écrit une fonction ".ghBleu("dirstat()")." pour compter leur nombre de fichiers. " ;
00935 finp() ;
00936
00937 p("texte") ;
00938 echo " Ainsi le code suivant " ;
00939 finp() ;
00940
00941 pre_fichier("dirstat.php","cadre") ;
00942
00943 p("texte") ;
00944 echo " permet d'obtenir de réaliser un comptage et un affichage qui ressemble à : " ;
00945 finp() ;
00946
00947 pre_fichier("dirstat.txt","cadrebleu") ;
00948
00949 finblockquote() ; # sous-section
00950
00951 $sous++ ; h3(aname("$sect.$sous Requêtes SQL dont SQLite et MySQL","tth_sEc$sect.$sous")) ;
00952
00953 blockquote() ; # sous-section
00954
00955 p("texte") ;
00956 echo " 2017 a vu l'arrivée de ".href("http://maurice-chavelli.developpez.com/tutoriels/php/nouveautes-php-7/","$PHP7").". " ;
00957 echo " Avec cette version de $PHP, seul ".href("http://php.net/manual/fr/book.pdo.php","PDO")." a été conservé pour interfacer SQL. " ;
00958 echo " Il faut donc impérativement passer au modèle objet pour dialoguer avec les bases de données. " ;
00959 echo " Là encore, nous vous proposons de lire le cours ".href("crs_php_bdd.pdf","php-bd")." de notre collègue D. LESAINT pour voir ce formalisme " ;
00960 echo " en oeuvre. Nous fournissons toutefois ci-dessous quelques exemples de programmes $PHP qui utilisent divers dialectes SQL." ;
00961 finp() ;
00962
00963 p("texte") ;
00964 echo " Comme premier exemple, nous utilisons le fichier binaire ".href("elf_sqlite3.bin") ;
00965 echo " qui contient au format ".href("https://www.php.net/manual/fr/book.sqlite.php","SQLIte3")." les données de la table ".b("elves") ;
00966 echo " décrites ".href("../Datasets/elf.htm","ici").", soit la structure et les données suivantes :";
00967 finp() ;
00968
00969 p("texte") ;
00970 tarea_fichier("elves.txt","cadrejaune") ;
00971 finp() ;
00972
00973 p("texte") ;
00974 echo " L'intérêt de SQLITE est que ce gestionnaire de base de données ne requiert ni mot de passe ni administration sophistiquée et " ;
00975 echo " qu'il permet de créer des bases de données en mémoire (sans stockage sur disque). " ;
00976 echo " C'est idéal en mode développement alors que MySQL sera utilisé en test et en production à moins que pour la production on n'utilise PostgresSQL." ;
00977 echo " Voici comment connaitre le nombre d'enregistrements de la table ".b("elves")." :" ;
00978 finp() ;
00979
00980 pre_fichier("db1sqlite.php","cadrebleu") ;
00981
00982 p("texte") ;
00983 echo " L'exécution de ce code ".b("db1sqlite.php")." affiche " ;
00984 finp() ;
00985
00986 pre_fichier("db1sqlite_res.txt","cadrejaune") ;
00987
00988 p("texte") ;
00989 echo "Comme SQLITE crée le fichier de la base de données s'il n'existe pas, il est prudent de vérifier que le fichier est " ;
00990 echo " bien là au bon endroit, sinon SQLITE viendra le recréer, avec aucune donnée. De même, il est possible que la version de $PHP " ;
00991 echo " utilisée ne supporte pas SQLITE3, il vaut mieux le vérifier, soit le code :" ;
00992 finp() ;
00993
00994 pre_fichier("db2sqlite.php","cadrebleu") ;
00995
00996 p("texte") ;
00997 echo " Il est prudent de ne pas exécuter des requêtes sans tester que cela se passe bien, avec ".b("try/catch").". " ;
00998 echo " Par exemple, si dans le programme précédent de comptage du nombre d'enregistrements de la table ".b("elves") ;
00999 echo " on fait la faute de frappe ".b("COUNTE(*)")." au lieu de ".b("COUNT(*)") ;
01000 echo " alors $PHP \"se plante\"." ; # et affiche, disons en ligne de commmandes " ;
01001 finp() ;
01002
01003 pre_fichier("db3sqlite.php","cadrebleu") ;
01004 pre_fichier("db3sqlite_res.txt","cadrejaune") ;
01005
01006 p("texte") ;
01007 echo " Voici le code ".b("db4sqlite.php")." qui intercepte l'erreur :" ;
01008 finp() ;
01009
01010 pre_fichier("db4sqlite.php","cadrebleu") ;
01011
01012 pre_fichier("db4sqlite_res.txt","cadrejaune") ;
01013
01014 p("texte") ;
01015 echo " La couche objet nommée ".ghBleu("PDO")." bien détaillée dans le " ;
01016 echo href("https://www.php.net/manual/fr/book.pdo.php","manuel $PHP") ;
01017 echo " fournit une interface commune aux divers gestionnaires de bases de données. " ;
01018 finp() ;
01019
01020 p("texte") ;
01021 echo " Nous suppons pour l'exemple que MySQL contient une table ".b("ELF")." dans la base ".b("statdata") ;
01022 echo " accessible en lecture pour l'utilisateur ".b("anonymous").", " ;
01023 echo " mot de passe ".b("anonymous").". " ;
01024 echo " Voici comment y accéder :" ;
01025 finp() ;
01026
01027 pre_fichier("db1mysql.php","cadrebleu") ;
01028
01029 p("texte") ;
01030 echo " PDO permet donc d'utiliser SQLite et MySQL avec le même code, ici ".b("db1pdo.php")." : " ;
01031 finp() ;
01032
01033 pre_fichier("db1pdo.php","cadrebleu") ;
01034
01035 pre_fichier("db1pdo_res.txt","cadrejaune") ;
01036
01037 finblockquote() ; # sous-section
01038
01039 finblockquote() ; # section
01040
01041 #########################################################################################################################
01042
01043 $sect++ ; h2(aname($sect.". Exemples plus techniques en $PHP","tth_sEc$sect.")) ; $sous = 0 ; # section 5
01044
01045 #########################################################################################################################
01046
01047 blockquote() ; # section
01048
01049 p("texte") ;
01050 echo " On trouvera ici une collection de scripts plus techniques et plus originaux. " ;
01051 # echo " Le fichier ".href("php7progs.zip","php7progs.zip")." contient les sources de quelques-uns de ces programmes " ;
01052 # echo " et des formulaires associés. " ;
01053 finp() ;
01054
01055 p() ; $sous++ ;
01056 echo " $sect.$sous ".href("http://forge.info.univ-angers.fr/~gh/Wanalexies/f_dicos.php","Dictionnaires d'un fichier texte") ;
01057 finp() ;
01058
01059 p() ; $sous++ ;
01060 echo " $sect.$sous ".href("http://forge.info.univ-angers.fr/~gh/Idas/Wcabiq/f_classif.php","Classification hiérarchique de données bactériologiques") ;
01061 finp() ;
01062
01063 p() ; $sous++ ;
01064 echo " $sect.$sous ".href("http://forge.info.univ-angers.fr/~gh/Idas/Wcabiq/f_identif.php","Identification automatique de vecteurs d'absence-présence") ;
01065 finp() ;
01066
01067 p() ; $sous++ ;
01068 echo " $sect.$sous ".href("http://forge.info.univ-angers.fr/~gh/jphistopct.php","Graphiques")." avec ".href("http://jpgraph.net","Jpgraph") ;
01069 finp() ;
01070
01071 p() ; $sous++ ;
01072 echo " $sect.$sous ".href("http://forge.info.univ-angers.fr/~gh/frames/framesindex.php","Diaporamas en $PHP") ;
01073 finp() ;
01074
01075 p() ; $sous++ ;
01076 echo " $sect.$sous ".href("../Leadb","Site LEADB (bioinformatique)") ;
01077 finp() ;
01078
01079 p() ; $sous++ ;
01080 echo " $sect.$sous ".href("http://forge.info.univ-angers.fr/~gh/affichette.php","Production de pdf")." via LaTeX " ;
01081 finp() ;
01082
01083 p() ; $sous++ ;
01084 echo " $sect.$sous ".href("http://forge.info.univ-angers.fr/~gh/Pagsd/lagrange3.php","Tracé de graphe mathématique")." via Dot " ;
01085 finp() ;
01086
01087 /*
01088 p() ; $sous++ ;
01089 echo " $sect.$sous ".href("http://forge.info.univ-angers.fr/~gh/internet/chanteurs3.php","Interrogation dynamique de Google") ;
01090 finp() ;
01091 */
01092
01093 finblockquote() ; # section
01094
01095 #########################################################################################################################
01096
01097 $sect++ ; h2(aname($sect.". En guise de conclusion sur $PHP","tth_sEc$sect.")) ; $sous = 0 ; # section 6
01098
01099 #########################################################################################################################
01100
01101 blockquote() ; # section
01102
01103 p("texte") ;
01104 echo " Ce texte est un petit tuteur et nous n'avons fait qu'aborder grossièrement $PHP. Ainsi, nous n'avons pas expliqué en détail comment \n" ;
01105 echo " on peut utiliser ".s_span("php -a","grouge")." en ligne de commandes afin de profiter du mode interactif, ni comment on peut écrire des scripts qui \n" ;
01106 echo " s'exécutent dans un terminal, avec ".href("http://php.net/manual/fr/reserved.variables.argc.php",'$argc',"bleuf")." \n" ;
01107 echo " paramètres mis dans le tableau $PHP \n" ;
01108 echo href("http://php.net/manual/fr/reserved.variables.argv.php","\$argv","gbleuf nou")." , ni comment on peut interfacer le \n" ;
01109 echo href("http://php.net/manual/fr/book.dom.php","DOM","gvert nou")." de $HTML et de \n" ;
01110 echo href("../internet/montresource.php?nomfic=repx.php","$XML","grouge nou")." \n" ;
01111 echo " avec $PHP, ni comment on peut lire, écrire, gérer du \n" ;
01112 echo href("tutxml.htm","XML","gnoir nou").", par exemple avec l'extension \n" ;
01113 echo href("http://php.net/manual/fr/book.simplexml.php","simplexml","gleuf nou")." de \n" ;
01114 echo " $PHP. \n" ;
01115 echo " On trouvera ".href("../internet/L2Xml/xmlphp.php","ici")." des exemples de tels traitements $XML en $PHP. \n" ;
01116 finp() ;
01117
01118 p("texte") ;
01119 echo " De même, rien n'a été dit sur les liens entre Javascript et $PHP donc rien sur \n" ;
01120 echo href("tutajax.php","AJAX","gbleuf nou")." , ni avec les graphiques de type PNG, GIF ou \n" ;
01121 echo href("http://fr.wikipedia.org/wiki/Scalable_Vector_Graphics","SVG","gvertf nou").". \n" ;
01122 echo " Si on sait que $PHP peut gérer les divers ".href("http://www.php.net/manual/fr/wrappers.php","protocoles","gvert nou") ;
01123 echo " de transmissions de données, on peut en déduire qu'avec $PHP on peut écrire des gestionnaires \n" ;
01124 echo " $FTP ou des gestionnaires de messagerie en $PHP ou des systèmes de transaction de cartes bancaires en $PHP. Vous comprendrez que \n" ;
01125 echo " $PHP est une mine, une source... à preuve la liste de ".href("http://www.php.net/manual/fr/funcref.php","toutes","gvertf nou")." les fonctions $PHP. \n" ;
01126 finp() ;
01127
01128 p("texte") ;
01129 echo " Pourtant, il faut certainement être un peu critique, car $PHP est un fils un peu «indigne» de $Perl, \n" ;
01130 echo " (voir par exemple ".href("http://tnx.nl/php.html","contrast","grouge nou")."), $PHP est un langage assez mal conçu et encore plus mal \n" ;
01131 echo "implémenté, même s'il est utilisé pratiquement partout... \n" ;
01132 finp() ;
01133
01134 p("texte") ;
01135 echo " Nous finirons donc par vous inviter à lire notre petite bibliothèque de fonctions dites \n" ;
01136 echo b(href("../internet/php_conceptuel.php","conceptuelles","gnoir nou"))." \n" ;
01137 echo " accessibles via ".ahref("../internet/stdphp.php",snbsp()."std.php".snbsp(),"bouton_fin vert_pastel nou").". \n" ;
01138 echo " Ce tuteur est bien sûr écrit avec ces fonctions, c'est pourquoi il n'y a aucune balise $HTML apparente dans le code-source $PHP de la page. " ;
01139 echo " Vous pouvez le vérifier avec " ;
01140 echo href("montresource.php?nomfic=tutphp7.php","le lien en fin de page","orange_stim nou")."." ;
01141 finp() ;
01142
01143 p("texte") ;
01144 echo " Nous vous encourageons aussi à lire nos exercices corrigés \n" ;
01145 echo " de Licence 2".sup("ème")." année pour le développement Web, \n" ;
01146 echo href("../internet/l2.php","niveau élémentaire","gvert nou")." \n" ;
01147 echo " et \n" ;
01148 echo href("../internet/l2a.php","niveau avancé","gbleuf nou")." , nos \n" ;
01149 echo href("../internet/pdc.php","exercices corrigés de Licence Pro","gvert nou").", \n" ;
01150 echo " nos \n" ;
01151 echo href("tutliste.htm","tuteurs de divers langages","grouge nou")." \n" ;
01152 echo " ainsi que nos \n" ;
01153 echo href("../Scripts","cours avec exercices corrigés","grouge nou")." \n" ;
01154 echo " sur $XML, les langages de scripts et les frameworks de \n" ;
01155 echo " développement, car on y parle encore de $PHP... ";
01156 finp() ;
01157
01158
01159 p("texte") ;
01160 echo "Enfin, il faudrait sans doute aussi parler de " ;
01161 echo b("programmation concise")." en $PHP comme " ;
01162 echo href("http://forge.info.univ-angers.fr/~gh/Decra/td4.php#tdm2","ici").", " ;
01163 echo " il faudrait évoquer les tests en $PHP par exemple avec " ;
01164 echo href("https://phpunit.readthedocs.io/fr/latest/writing-tests-for-phpunit.html","phpunit") ;
01165 echo " ou encore l'automatisation des interfaces Web avec des " ;
01166 echo href("https://fr.wikipedia.org/wiki/Navigateur_sans_t%C3%AAte",em("headless browsers")).", " ;
01167 echo " disons avec " ;
01168 echo href("https://github.com/nesk/puphpeteer","puphpeteer") ;
01169 echo " pour finir avec les frameworks de développement $PHP comme indiqués " ;
01170 echo href("https://raygun.com/blog/top-php-frameworks/","ici") ;
01171 echo " afin d'avoir une idée un peu plus complète de ce que représente " ;
01172 echo href("https://yourstory.com/mystory/top-10-websites-developed-in-php",$PHP)." aujourd'hui." ;
01173 finp() ;
01174
01175 p("texte") ;
01176 echo b("Bonne lecture ! \n") ;
01177 finp() ;
01178
01179 finblockquote() ; # section
01180
01181 #########################################################################################################################
01182
01183 pvide() ;
01184 p() ;
01185 echo href("montresource.php?nomfic=tutphp7.php","Code-source $PHP de cette page","orange_stim nou")."." ;
01186 finp() ;
01187
01188 finSection() ;
01189 finPage() ;
01190 ?>
Pour ne pas voir les numéros de ligne, ajoutez &nl=non à la suite du nom du fichier.
Retour à la page principale de (gH)