PHP - News
Transcription
PHP - News
Introduction à PHP Master Créations Images et Multimédia Multilingue / CAWEB 1.Historique Php est né du fruit du travail de Rasmus Lerdorf , une première version du langage voit le jour en 1994. La diffusion du langage debute dès 1995. Le nom initial du projet ( « Personal Home Page tools » sera rebaptisé « hypertext préprocessor ») . A l'heure actuelle ce langage est devenu très populaire chez les web designers, simple d'approche et surtout très puissant , il évolue constamment grâce à une communauté de développeurs très importante. On est aujourd’hui à la version 5 du langage PHP est distribué librement et gratuitement sous licence GNU GPL il est téléchargeable sur http://www.php.net 1.2 Principe de fonctionnement • PHP est avant tout un langage de script (scripting). • Le code inséré dans les pages HTML, est exécuté par le serveur sous réserve que les pages portent l'extension .php3 .php ou .php4. Le fichier contenant du code php est hébergé sur le serveur ; lors d’une requête HTTP , le code HTML est retourné tel quel et le code php est extrait et exécuté par le serveur . Les résultats seront intégrés au flot HTML. • Très simple à appréhender car possédant une syntaxe claire et très proche du langage C, le PHP reste une solution qui conviendra aux débutant comme aux professionnels, pour dynamiser un site Web ou l'interfacer avec une Base de données. 1.3 Php et la concurrence • Le PHP utilise une syntaxe très simple car elle reste très proche du langage C, langage maîtrisé par la plupart des développeurs. • Les autres langages du web sont : - ASP : c’est la réponse de Microsoft à PHP, ASP utilise une syntaxe basée sur VBScript (Version allégée de Visual Basic) - PERL : C’est un langage de script puissant, adapté à Internet mais difficile à maîtriser - CGI : Composants exécutables, rapide mais spécifiques à la plate formeserveur et pose souvent des problèmes de securité tout en étant complexe à développer. - JAVASCRIPT : Javascript est quand à lui interprété par le logiciel client ( = le navigateur ) des problèmes de sécurité sont inhérents à ce mode de fonctionnement - RUBY : Langage de script qui peu être utilisé pour le dvt web on parle surtout de RoR ( Ruby on Rails projet un peu jeune mais prometeur ! ) un framework de dvt web basé sur Ruby. L'appelation « ruby » vient d'un jeu de mot sur Perl. Ruby utilise la programmation dite MVC ( modèle vue contrôleur ) - Python : Comme python c'est un langage de script orienté objet qui utilise le modèle MVC on le couple souvent à Django ou Zope pour le dvt web. - JAVA, Webdev (...) 1.3.1 ASP : <html> <head> <title>De l'ASP dans le cours de ToMa !!!!!!</title> </head> <body bgcolor="white" text="black"> <% Dim strMessage strMessage = "Hello les copains" Response.Write (strMessage) Response.Write ("<br>") Response.Write ("Il est : " & Time()) %> </body> </html> 1.3.2 PERL : #!/usr/local/bin/perl print("content-type : text/html\n\n"); print("Hello les copains !"); ($secondes,$minutes,$heure)=localtime(time); print(''Il est $Heure:$minute:$secondes''); 1.4 Intégration et syntaxe de PHP • Avant d’utiliser PHP il faut s’assurer que notre hébergeur le supporte à moins qu’on désire travailler localement - installation possible sous windows du pack easyphp ( http://www.easyphp.org ) ou sous linux il faut utiliser le systeme de packetages ( rpms ) ou les fichiers binaires. • Les hébergeurs Wanadoo, Free… supportent le PHP (pas intégralement car certaines fonctions comme mail() ne sont pas toujours activées). • Intégrer du php dans une page est très simple à réaliser , une page type combine souvent HTML et PHP , il faut alors introduire une notation particulière pour distinguer les deux langages . 1.4.2 Integration dans une page HTML Il existe 4 méthodes pour intégrer PHP à l'intérieur d’un document HTML : A l'aide des tags courts <? et ?> <? echo (‘’ hello world !!!!"); ?> A l'aide des tags <?php et ?> <?php echo (" hello world !!!!"); ?> A l'aide de délimiteur de type ASP (<% et %>) <% echo (" hello world !!!! "); %> A l'aide de la balise <script language="..."> <script language="PHP"> <!-echo (" hello world !!!!"); //--> </script> 1.4.3 Notions importantes • • Extensions Selon la version du langage, les extensions sont différentes : version 2 (php) : ".phtml" version 3 : ".php3" version 4-5 : ".php" “.php4” … Selon les paramétrages du serveur, les anciennes extensions sont reconnues ou non. Les Variables : C’est une zone de mémoire vive ou on enregistre des informations comme du texte ou des nombres ... • Les règles à retenir : chaque ligne doit se terminer par un point-virgule (";") chaque variable commence par le signe dollar ("$") • Les commentaires peuvent prendre soit une ligne, soit plusieurs lignes. sur une ligne : //commentaire avec deux barres obliques #commentaire avec le signe dièse sur plusieurs lignes, /* lignes de commentaires */ 1.4.4 Premier script <? echo ‘’<marquee>HELLO WORLD</marquee> ‘’; ?> 1.5 Les types de données • • • • Les nombres entiers (integer). $nombre = 123; Les nombres à virgules (doubles). $a = 123.456; Les chaînes de caracteres (string) $chaine = ‘’desscimm"; Les tableaux (array ) $chiffres = array(6,7,5,3); $coolvibes = array("I","won’t","do","what","you","tell","me"); echo $coolvibes[3] ; 1.5.2 Notion de tableau • Les tableaux sont très important à maîtriser en PHP, car ce langage est souvent lié à des bases de données. Ces bases de données retournent plusieurs valeurs, et généralement sous forme de tableau. $site[0] = ‘’www.google.fr"; $site[1] = ‘’www.supersite.fr"; $site[2] = ‘’www.superloose.com"; 1.5.3 Les variables En PHP, les variables sont déclarées par le signe '$'. Elles servent à stocker des données dans le script, pour les réutiliser plus tard. <?php /* Definition des variables */ $a = 2; $b = 4; /* Addition */ $addition = $a + $b; // $addition vaut 6 echo $addition; /* Soustraction */ $soustraction = $b - $a; // $soustraction vaut 2 /* Multiplication */ $multi = $a * $b; // $multi vaut 8 echo $multi; /* Division */ $div = $b / $a; // $div vaut 2 echo $div; ?> • Comme en Javascript , on peut incrémenter ( ou le contraire ) la valeur d'une variable de 1 en écrivant : $variable++; ou $variable--; • 1.5.4 Les variables d’environnement • Il est possible en PHP d'obtenir des informations aussi diverses que le nom du navigateur de l'internaute ou le serveur utilisé. Ces informations sont stockées dans des variables spéciales appellés "variables d'environnement". La commande "phpinfo()" récapitule toutes ces variables : <? phpinfo(); ?> $REMOTE_ADDR par exemple, contient l'adresse IP du client $HTTP_USER_AGENT contiendra le nom du navigateur utilisé 1.5.6 Opérations sur les chaines de caractères • En PHP, la concaténation de deux chaînes se fait à l’aide du symbole "." <? $a = 'php c\’est'; $a = ''php c'est top''; $b = $a . ' top !'; echo $b; ?> 1.6 Les fonctions • PHP propose de nombreuses fonctions, mais on peut definir ses propres fonctions à l’aide de function(). • Exemple fichier fonction.php : <? function Arial($taille,$couleur,$texte) { print("<font face=Arial size=".$taille." color=".$couleur.">".$texte."</font><br/>"); } ?> 1.6 Les fonctions Exemple d’un script utilisant notre fonction <? function Arial($taille,$couleur,$texte) { print("<font face=Arial size=".$taille." color=".$couleur.">".$texte."</font><br/>"); } Arial("2","red", "super ..."); Arial("3","#0F74A3", " Genial ..."); ?> 1.7 Include et Require • Les deux fonctions include et require permettent d'insérer dans un script le code contenu dans un autre fichier. Ex : <?php include "mesfonctions.php";?> <?php require "http://www.cool.com/rastafari.php";?> 1.7 Include et Require • Dans notre exemple : Fichier index.php : <? include "MesFonctions.php"; Arial("2","red", "super ..."); Arial("3","#0F74A3", " Genial ..."); ?> Fichier MesFonctions.php : <? function Arial($taille,$couleur,$texte) { print("<font face=Arial size=".$taille." color=".$couleur.">".$texte."</font><br/>"); } ?> 1.7.2 Différences Include et Require ? • Avant la version 4.0.2, la méthode mot "require" pratiquait l'inclusion du fichier au moment de l'analyse (interprétation par php) et non de l'exécution du script. • Dans les versions actuelles la méthode include encas de non existence du fichier inclus affiche un avertissement et continue l'exécution du script alors que require génère une erreur et interrompt le script. • Il est donc conseillé d'utiliser la méthode require quand le fichier à inclure est vraiment requis par l'application php. Si on préfere la méthode include il faut tester l'existence du fichier ou non. • Si le fichier n'existe pas et qu'on utilise include, la fonction include renverra false ( = booléen ) <?php if( file_exists( 'SuPaFicHier.php' ) ) include 'SuPaFicHier.php'; else die("erreur fatale"); // die equivalent à exit() exit("erreur fatal"); ?> 1.8 Exemples de codes php : passage de variables à un script depuis un formulaire Fichier formulaire.html : <form name="formulaire" method="post" action="page.php"> ton ptit nom : <input type="text" name="nom"> <input type="submit’’ value=‘’envoyer’’> </form> Fichier page.php : <?php echo "bonjour ".$nom; ?> <?php echo "bonjour ".$_POST['nom']; ?> 1.8 Exemples de code php : afficher la date • La fonction date permet de décrire une date en retournant une chaîne de caractères sous le format désiré. Cette date est exprimée en fonction du timestamp qui est le nombre de secondes écoulées depuis le 1 Janvier 1970 (époque UNIX) echo time(); //donnes le nb de secondes écoulées Syntaxe : Chaîne date("format", "timestamp") L'argument timestamp est optionnel. S'il est vide, l'heure et la date courante seront utilisées. • Constantes de formatage : a am ou pm A AM ou PM dJour du mois, avec conservation des zéros "01" et "31"… D Jour de la semaine, abrégé en trois lettres ( en anglais "Mon" "Fri" … ) F Mois en anglais et en entier "january" …. h Heure, de 1 à 12 H Heure, de 0 à 23 ( format 24h) i Minutes J Jour du mois, avec suppression des zéros L Jour de la semaine m Chiffre du mois, de 01 à 12 M Abréviation du nom du mois en anglais Y Année, sur quatre unités "2001" 1.8 Exemples de codes PHP • <?php $datedujour=date(" j/m/Y"); echo $datedujour; ?> 1.8 Exemples de codes : dates et locales • strftime --Formate une date/heure locale avec les options locales string strftime ( string format [, int timestamp] ) Les mois et jours de la semaine, et toutes les chaînes dépendantes de la langue sont fixées avec la commande setlocale() Pour le paramètre format : %a : nom abrégé du jour de la semaine %A : nom complet du jour de la semaine %b : nom abrégé du mois %B : nom complet du mois %d : jour du mois en numérique (intervalle 01 à 31) %H : heure de la journée en numérique, et sur 24-heures %I : heure de la journée en numérique, et sur 12- heures %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 %S : secondes en numérique %T : l'heure actuelle (égal à %H:%M:%S) 1.8 Exemples de codes : dates et locales <?php echo strftime("En Finlandais est "); setlocale(LC_ALL, "fi_FI.UTF-8"); echo strftime("%A, en Français "); setlocale(LC_ALL, "fr_FR.UTF-8"); echo strftime("%A et en Allemand "); setlocale(LC_ALL, "de_DE.UTF-8"); echo strftime("%A"); ?> 1.8 exemples de codes PHP : date de maj • Ce petit script va afficher la dernière date de mise à jour d’une page html à l’aide de la fonction DATE de la fonction filemtime et d’une variable d‘environnement $SCRIPT_FILENAME • <? echo("Dernière modification le "); echo(date("d/m/Y à H:i",filemtime($_SERVER['SCRIPT_FILENAME']))); ?> 2.0 Complément sur la gestion des variables • Un changement dans PHP pourrait rendre son apprentissage plus complexe. Depuis la version 4.2, la valeur par défaut de register_global est à Off cf php.ini ou phpinfo(); • Une variable envoyée par un formulaire (method=POST name =motdepasse) ne sera plus accessible avec $motdepasse mais avec $_POST['motdepasse']. 2.0 Complément sur la gestion des variables • Pourquoi ? – Pour sécuriser le code et empêcher l ’accès et la manipulation des variables . • Le code est en soi plus stable quand on gère les variables de cette manière , on sait exactement ce que l ’on fait Il faut constamment faire attention aux entrée (input) utilisateurs ( formulaires… ) • Pour aller plus loin : http://www.php.net/release_4_1_0.php ( section SECURITY: NEW INPUT MECHANISM ) http://www.php.net/manual/fr/security.registerglobals.php 2.1 REGISTER GLOBAL • La configuration du paramètre register_global est contrôlée dans le fichier de configuration php.ini. • Infos : http://www.php.net/manual/fr/configuration.php • Le paramètre register_global peut prendre deux valeurs, On et Off. Avant la version 4.2.0 la valeur par défaut était On mais cela a changé et il faut adapter son code pour les nouvelles versions ou les mises à jour de php chez votre hebergeur. • On peut voir la valeur du parametre REGISTER GLOBAL à l ’aide de la fonction phpinfo() 2.2 L ’origine des variables • • Par les url : une des façons les plus simples pour faire transiter des variables de pages en pages est l'insertion dans l'URL. On appelle ça communément la méthode GET. Anatomie d'une URL http://mastercaweb.u-strasbg.fr/script.php?variable=toto&foo=bar – http:// : C'est le protocole utilisé pour communiquer. – mastercaweb.u-strasbg.fr/ : C'est le nom d'hote, le nom DNS ou l'adresse IP du serveur référencé par cette url. – script.php : C'est le nom du script. – ? variable=toto &foo=bar : Il s'agit de la query ( requete) Elle permet d'envoyer des informations au script script.php • Avec la configuration register_global à On, le script "script.php" aurait automatiquement $var = 'test', $foo='bar'. Ces variables seraient des variables globales pour le script auquel vous accédez. 2.2 L ’origine des variables • Toutes les fois qu'un paramètre est indiqué dans l ’URL du script, PHP créé un tableau global nommé $HTTP_GET_VARS. • Il s'agit d'un tableau associatif. En prenant l'exemple précédent on aurait : • $HTTP_GET_VARS = array ('variable' => 'toto', 'foo' => 'bar');. • Depuis la version 4.1.0 une variable globale nommée $_GET contient exactement la même chose que $HTTP_GET_VARS. • Ce tableau est nommé superglobal 2.2 L ’origine des variables • Provenance : Formulaire • Une autre méthode commune pour passer une variable à un script est un formulaire sur une page web. 2.2 L ’origine des variables • Quand un utilisateur va cliquer sur le bouton "envoyer" le navigateur va soumettre le formulaire au script "script.php" avec une variable $foo qui aura la valeur que l'utilisateur aura rentrée. • Avec la configuration register_global à On, le script "script.php" aurait automatiquement attribué $foo='bar'. • De façon similaire à l'exemple précédent sur la provenance URL, PHP va générer automatiquement une tableau nommé $HTTP_POST_VARS. • Dans le cas de notre exemple : $HTTP_POST_VARS['foo'] = 'bar';. • Depuis la version 4.1.0 une variable globale nommée $_POST contient exactement la même chose que $HTTP_POST_VARS à savoir $_POST['foo'] qui aura pour valeur bar. 2.2 L ’origine des variables • Provenance : Un cookie : les cookies permettent de stocker des informations sur le disque dur de la machine cliente. • Dans l'exemple qui suit on va placer un cookie : /* durée de validité du cookie 24h */ setcookie('foo', 'bar', time()+86400, '', $HTTP_HOST); • Pour accéder aux valeurs du cookie on utilisera alors $_COOKIES["foo"] qui nous indiqueras sa valeur ie 'bar'. 2.2 L ’origine des variables • Provenance : Environnement ou Serveur : Le système d'exploitation ainsi que les serveur Web disposent de nombreuses variables qui peuvent être utilisées dans un script. • Une de ces variables les plus utilisées sont : Le nom du script lui même ainsi que le nom de l'hôte. • PHP créé automatiquement deux tableaux associatifs $HTTP_ENV_VARS et $HTTP_SERVER_VARS. • Apres PHP 4.1.0 les mêmes tableaux sont nommés : $_ENV et $_SERVER. ( voir fonction print_r ) 2.3 Utilisation des superglobales • Si vous utilisez plus d'une fois des variables passées en paramètre vous pouvez tout simplement les assigner à une variable. ex : $superCool = $_GET[superCool]; • Cela évitera de faire appel à des superglobales à chaque fois. • Cette technique peut aussi permettre d'éviter de recoder tous les scripts en assignant les bonnes valeurs aux bonnes variables en début de script. 2.3.2 Pourquoi superglobales ? • Normalement une variable utilisée dans une fonction est locale à celle ci. • Si on veut utiliser la variable globale dans une fonction global $superCool; • Les superglobales sont des exceptions à cette règle. Vous pouvez utiliser les superglobales $_GET, $_POST, $_COOKIE, $_ENV, $_SERVER et $_SESSION sans avoir besoin de les déclarer en globales. 2.4 Conclusion $_GET contient les variables passées par la méthode GET $_POST contient les variables passées par la méthode POST $_COOKIE contient les variables HTTP cookie $_SERVER contient les variables serveur (par ex. REMOTE_ADDR) contient les variables d'environnement • $_ENV Une fusion des variables GET. POST, COOKIE. • $_REQUEST En d'autres mots toutes les informations qui arrivent de l'utilisateur. Et d'un point de vue purement sécurité, ce n'est pas sûr. contient toutes les variables HTTP • $_SESSION enregistrées par le module de gestion de session • • • • 3.1 Les structures de controle <? while ( love & passion } { for( fight = 0 ; rights < freedom ; rights++ ) fight = standup( rights ); free( babylon ); } ?> 3.1 Les structures de controle if (condition) {exécute le code} <? // On affecte une valeur, à une variable. $un_nombre = 15 ; //Condition : if ( $un_nombre > 9) { // "Si" // on execute le code suivant. echo "Superieur à 9"; } ?> 3.1 Les structures de controle if (condition) {exécute le code} else {exécute le code} <? // On affecte une valeur, à une variable. $un_nombre = 5 ; //Condition : if ( $un_nombre > 9) { // Si // on execute le code suivant. echo "Superieur à 9"; }else{ // Ou echo "Alors Inferieur à 9"; } ?> 3.1 Les structures de controle if (condition) {exécute le code} elseif (condition) {exécute le code} else {exécute le code} <? ?> // On affecte une valeur, à une variable. $un_nombre = 5 ; //Condition : if ( $un_nombre > 9) { // "Si" // on execute le code suivant. echo "Superieur à 9"; }elseif( $un_nombre < 2) { // ou si // alors sinon on execute le code suivant. echo "Inferieur à 2"; }else{ // Ou echo "le nombre est inferieur à 9 et est superieur à 2 "; } 3.1 Les structures de controle • for(évaluation de l'expression (expr1); condition(expr2) ; expr3 ) { exécute le code} <? for ($i=0; $i < 10 ; $i++ ){ echo $i . " est inférieur à 10<br />"; } // Pour la variable $i initialisé à Zéro // Et si $i est inférieur à 10, on exécute le code entre {}. // Apres avoir exécuté le code entre {}, on exécute le code expr3, c'est à dire $i++. // et on reteste la condition ?> 3.1 Les structures de controle while ( condition ) {exécute le code } <? // on initialise la variable '$i' avec la valeur 0 $i = 0; // Tant que la variable $i est inférieur à 10 while ( $i <= 10 ) { // on execute le code suivante // affichage de la variable $i echo "$i<br />"; // incrementation de la variable , peut se noter aussi $i = $i +1 ; $i++; } ?> 3.1 Les structures de controle • Break <? // On initialise $i à 0. $i= 0; // Tant que 1, (boucle infinie) while (1){ // Si $i est supérieur à 10. if ($i > 10 ) { // On stoppe le while avec le break. break; } // Affichage d'un message. echo "Passage en boucle pour la $i eme fois.<br />" ; // incrementation. $i++; } ?> 3.1 Les structures de controle • foreach(évaluation de l'expression ) {exécute le code} <? // On crée une variable $Tableau, et on insére dedans plusieurs éléments. $Tableau = array("Punk","Post","Hard","Jazz"); // On met le pointeur du tableau au début. // Pour chaque élément du $Tableau représenté par $rock $i=0; foreach ($Tableau as $Rock ) { // on execute le code. echo "element $i du tableau : $Rock est un élément du tableau rock !<br />"; $i++; } ?> 3.1 Les structures de controle • switch ($variable) { case "valeur": exécute de code; break; } <? $valeur = "peace"; switch ($valeur){ // Si valeur est égale à peace on execute le code jusqu'au break. case "peace": echo "La valeur contenu dans valeur est 'peace'"; break; case "hate": echo "La valeur contenu dans valeur est 'hate'"; break; // Si on souhaite executé un morceau de code si la valeur ne fait pas partie des cases. default: echo "Je n'ai pas reconnu la valeur '$valeur'"; break; } ?> 3.1.2 Operateurs de comparaisons • • • • • • • • • $a == $b Egal TRUE si $a est égal à $b . $a === $b Identique TRUE si $a est égal à $b et qu'ils sont de même type (introduit en PHP 4). $a != $b Différent TRUE si $a est différent de $b . $a <> $b Différent TRUE si $a est différent de $b . $a !== $b Différent TRUE si $a est différent de $b ou bien qu'ils ne sont pas du même type. (introduit en PHP 4) $a < $b Plus petit que TRUE si $a est strictement plus petit que $b . $a > $b Plus grand TRUE si $a est strictement plus grand que $b . $a <= $b Inférieur ou égal TRUE si $a est plus petit ou égal à $b . $a >= $b Supérieur ou égal TRUE si $a est plus grand ou égal à $b . 3.1.3 Les operateurs logiques • && c'est l'équivalent du ET Ex: $toto=6; $titi=3; ($toto < 10 && $titi > 1) retourne VRAI • || c'est l'équivalent du OU Ex: $toto=6; $titi=3; ($toto==5 || $titi==5) retourne FAUX • ! C'est l'équivalent du NON Ex: $toto=6; $titi=3; !($toto==$titi) retourne VRAI 3.1,4 Création d’un site dynamique en php • Cahier des charges : créer l’ossature d’un site web dynamique • On utilisera plusieurs fichiers : – – – – – – Index.php la page qui permettra de générer le site navigation.htm menu du site homepage.htm page d’accueil du site liens.htm liens ouaibes Cv.htm page avec cv bas_page.htm affichage du bas de page 3.2 Envoyer des mails en php • Envoyer un mail en php est très facile , tout se résume en une ligne , à l’aide de la fonction mail() et de ses paramètres. • La fonction reçoit un minimum de paramètres , à qui veut on écrire tout d’abord , ( champ to: ) quel est le sujet du mail ( subject ) , le contenu de notre message et enfin l’expéditeur (champ from: ) • Le champ ( from: ) permet aussi de spécifier d’éventuels copies ( Cc ) ou copies cachées ( Bcc ). 3.2 Envoyer des mails en php • Envoyer un mail en php est très facile , tout se résume en une ligne , à l’aide de la fonction mail() et de ses paramètres. • La fonction reçoit un minimum de paramètres , à qui veut on écrire tout d’abord , ( champ to: ) quel est le sujet du mail ( subject ) , le contenu de notre message et enfin l’expéditeur (champ from: ) • Le champ ( from: ) permet aussi de spécifier d’éventuels copies ( Cc ) ou copies cachées ( Bcc ). 3.2 Exemples d’utilisation de mail() <? //On envoie un message à [email protected] mail(' [email protected] ', 'sujet : admiration !!!', "Bofh président !!\n Trop bien !!!!!!"); ?> <? ?> $destinataires = ' [email protected], [email protected] '; //On sépare les destinataires par une virgule. $sujet = 'plouf !!!'; mail($destinataires, $sujet, "Trop sympatoche\n kewwwwwwwwwwl ! "); 3.2 adresse de l'expediteur <? $destinataire = '[email protected],[email protected]'; $sujet = 'is there someone ?'; $entete = "From: [email protected]\n"; mail($destinataire, $sujet, "Hello \n someone's here ? ",$entete); ?> <? ?> $destinataire = '[email protected],[email protected]'; $sujet = 'is there someone ?'; $entetes = "From: [email protected]\n"; $entetes .= "Reply-to: [email protected]\n"; mail($destinataire, $sujet, "Hello \n someone's here ? ",$entetes); 3.2.1 Exemple d’utilisation de mail() <?php $to = ‘’[email protected]’’; $sujet = ‘’I luv ur software’’; $contenu = ‘’ Just joking man ! ‘’; $entetes = ‘’From: [email protected]\n‘’; $entetes .= "Reply-to: [email protected]\n"; $entetes .= "Cc: [email protected] \n"; $entetes .= "Bcc: [email protected] \n"; $reponse = mail($to,$sujet,$contenu,$entetes); if ($reponse ){ echo "message tipar !!!!!!!"; } else { die( "Mssieur le facteur je crois qu'on a un problème !!!!"); } ?> 3.3 Site dynamique multilingue • Principe : on va stocker le contenu texte dans des variables spéciales appelées « constantes » . • On utilisera un cookie pour retenir la langue choisie par le visiteur du site • On pourra determiner la langue à utiliser en fonction d'une variable d'env. : HTTP_ACCEPT_LANGUAGE . • On utilisera pour chaque langue un fichier à part pour faciliter la mise à jour. 3.3 Site dynamique multilingue •Les constantes : Ce sont des variables définies à l’aide de la fonction define() define(‘SUPER_CONSTANTE', ‘valeur de ma super constante'); •Par convention les noms des constantes sont toujours en majuscules pour les différencier des autres variables de nos scripts. define(‘SALUTATION’,’Yo c\’est super php!’); echo SALUTATION; 3.3 Site dynamique multilingue : lang_fr.php <?php define(‘MSG_BIENVENUE', 'Bienvenue sur mon site’); define(‘MSG_GENIAL‘,’C\’est super php!’); define(‘MSG_COPYLEFT‘,’Site fait par moi !’); define('LIEN_FR','francais'); define('LIEN_EN','anglais'); ?> 3.4 Site dynamique multilingue : lang_en.php <?php define(‘MSG_BIENVENUE', Welcome to my website’); define(‘MSG_GENIAL‘,’PHP is awesome :!’); define(‘MSG_COPYLEFT‘,’made by myself’); define('LIEN_FR','french'); define('LIEN_EN','english'); ?> 3.5 Intégration des fichiers choixlang.php <? ?> //premier cas pas de cookie ni variable langue initialisée on part sur la langue du navigateur If((!$_GET['lang'])&&(!$_COOKIE['lang'])){ $lang = substr($_SERVER['HTTP_ACCEPT_LANGUAGE'],0,2); setCookie("lang",$lang,time()+86400); } //deuxieme cas une valeur dans le cookie Elseif(($_COOKIE['lang'])&&(!$_GET['lang'])){ $lang=$_COOKIE['lang']; } //sinon on se base sur la lang affecté en param Else{ $lang=$_GET['lang']; setCookie("lang",$lang,time()+86400); } // on switch sur lang pour savoir quel fichier inclure switch($lang){ case "fr": include "lang/lang_fr.php"; break; case "en": include "lang/lang_en.php"; break; default : include "lang/lang_fr.php"; break; } 3.6 Notre page web multilingue index.php <?php require(‘choixlang.php’); ?> <html> <body> <?php echo MSG_BIENVENUE; ?> <br/>Avis sur php : <?php echo MSG_GENIAL; ?> <br/>Auteur : <?php echo MSG_COPYLEFT; ?> <br/><br/> <a href=?lang=fr> <?php echo LIEN_FR; ?> <a href=?lang=en> <?php echo LIEN_EN; ?> </body> </html> 3.7 Les fichiers en PHP • Un fichier stocke sur le disque dur des éléments ( textes,images... ) • Php ignore la structure d’un fichier il traite de la même façon un fichier binaire ( images / sons / prog… ) qu’un fichier texte. • Quand on ouvre un fichier en php on doit indiquer comment php doit evaluer le fichier ( LECTURE - ECRITURE – MODIFICATION ) • On appelle "pointeur de fichier" la variable qui est affecté de la valeur de la fonction d'ouverture de fichier : $fp=fopen("leGentilFichier", 'a+'); fwrite($fp,"Barbatruc !!!!! \n"); 3.7 Lecture rapide d’un fichier • Readfile() : affiche le contenu d’un fichier à l’écran <? // affichage à l’ecran de MonSuperFichier.txt readfile(‘’MonSuperFichier.txt’’); // affichage url readfile(‘’http://www.perdu.com/’’); ?> 3.8 Ouverture d’un fichier La fonction fopen : fopen(NomDuFichier, ModeOuverture) • "r" - Ouvre en lecture seule et pointeur de fichier au début. • "r+" - Ouvre en lecture/écriture et pointeur de fichier au début. • "w" - Ouvre en ecriture seule - pointeur de fichier au début/réduit la taille du fichier à 0. Si le fichier n'existe pas, on tente de le créer. • "w+" - Ouvre en lecture/écriture, pointeur de fichier au début du fichier réduit la taille du fichier à 0. Si le fichier n'existe pas, on tente de le créer. • "a" - Ouvre en ecriture 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. • Fopen renvoie un booléen : • if (!($f=fopen("exemple.txt","r"))) • exit("impossible d'ouvrir le fichier !!!!"); 3.8.2 Fermeture d’un fichier • Un fichier ouvert à l’aide de la fonction fopen doit être fermé on utilise ainsi la fonction fclose fclose (pointeurversmonfichier); 3.8.3 Exemples • <? // ouverture sur un serveur ftp $fp = fopen("ftp://login:mdp@nom_du_serveur_ftp/nom_du_fichier", "w"); // ouverture sur un serveur http $fp = fopen("http://www.perdu.com/","r"); // ouverture d'un fichier en local (sur le serveur); $fp = fopen("/mon_rep/mon_fichier.txt","r"); fclose($fp ); ?> • <? $fp = fopen("c:\MonRepertoire\info.txt", "r"); ?> 3.8.4 Lecture d’un fichier <? // ouverture du fichier en lecture $fp = fopen ( "MonSuperFichier.txt" ," r " ) ; // affichage du fichier fpassthru($fp ) ; fclose($fp ); ?> <? // affichage du fichier readfile(‘’MonSuperFichier.txt’’); ?> 3.8.5 Lecture d’un fichier ligne par ligne • fgets() parcourt un fichier ligne par ligne fgets(PointeurVersMonFichier[,longueur]) • fgets permet de lire une chaine dans un fichier (pointeurVersMonFichier est initialisé à l’aide de fopen) a partir de la position courante dont la longueur est specifié par longueur. 3.8.6 Lecture d’un fichier ligne par ligne • <? // ouverture du fichier $fp = fopen ("/mon_rep/mon_fichier.txt", "r"); while (!feof($fp )) { $contenuFichier = fgets($fp); // Ecrire à l'écran la chaîne lue echo $contenuFichier; } fclose ($fp ); ?> 3.8.7 Ecrire dans un fichier • fwrite (PointeurDeFichier, ChaineAEcrire [, Longueur]) fputs() est un alias de fwrite -> fwrite()=fputs() <? /* ouverture du fichier en mode lecture-écriture : le pointeur est à la fin du fichier */ $fp =fopen('fichier.txt' , 'a+'); // écriture de la ligne fwrite($fp ,"Nouvelle ligne à insérer \n"); // fermeture du fichier fclose ($fp ); ?> 3.8.7 se deplacer dans un fichier • Pour revenir au debut du fichier : rewind() Ex : <? $fichier= fopen(''superfichier.txt'',"r+"); $contenu= fgets($fichier,25); rewind($fichier); // rewiiiiiiiiiiiiiiiiiiiiiiiiind fclose($fichier); ?> • Se deplacer dans un fichier fseek() fseek(PointeurDeFichier,position) <? $fichier= fopen(''superfichier.txt'',"r+"); $contenu= fgets($fichier,25); fseek ($fichier,0); // rewiiiiiiiiiiiiiiiiiiiiiiiiind fclose($fichier); ?> • 3.8.9 Exemple : Ecrire un compteur en php • Il suffit de stocker quelque part le nombre de visite dans une base de donnée ou dans un fichier • On aura besoin d’un fichier "compteur.txt" qui stockera la valeur de notre compteur. On utilisera fwrite et fopen pour ecrire ou lire dans le fichier • Exemple : http://mastercaweb.u-strasbg.fr/bofh/ • Source : http://mastercaweb.ustrasbg.fr/bofh/compteur.phps 3.8.10 Exemples : Ecrire un livre d'or • Il suffit de stocker dans un fichier texte les contributions de nos visiteurs • On aura besoin d’un fichier "livredor.txt" qui stockera ce que nos visiteurs posteront à l'aide d'un formulaire • Exemple : http://mastercaweb.u-strasbg.fr/bofh/livredor/ • Source : http://mastercaweb.u-strasbg.fr/bofh/livredor/src/ 4.0 Les sessions • Les sessions est un moyen simple de conserver des variables sur toutes les pages d ’un site. • Jusqu'ici, on était arrivés à passer des variables de page en page via la méthode GET (en modifiant l'url : page.php? variable=valeur&variable2=valeur2) et via la méthode POST (=un formulaire). • Si on veut transmettre une ou plusieurs variables sur TOUTES les pages de son site, ca devient ingérable avec GET et POST... D'où l'invention des sessions. 4.0 Les sessions • Un visiteur se connecte. On demande à créer une session pour lui : PHP génère un identifiant unique pour ce visiteur du site. • Pour cela, on utilise la fonction session_start(). L ’identifiant est une chaine de caractères assez conséquente codée en hexadécimal. • Ex : a02bbffc6198e6e0cc2715047bc3766f • Ce numéro sert d'identifiant et est appelé "ID de session" (ou PHPSESSID). • PHP transmet automatiquement cet ID de page en page en utilisant un cookie ou via l'url (ex : mapage.php? PHPSESSID=a02bbffc6198e6e0cc2715047bc3766f). 4.0 Les sessions • A partir de là on peut créer une infinité de variables de session. Par exemple : $_SESSION['login'] contient le login du visiteur, $_SESSION['password'] contient le mot de passe etc... • L'avantage, c'est que le serveur conserve ces variables même lorsque la page PHP a fini d'être générée. • Quelque soit la page visitée, on peut récupérer par exemple le login et le mot de passe du visiteur ! • Lorsque le visiteur se déconnecte (il a cliqué sur un bouton "Déconnecter" ou est resté inactif trop longtemps), alors la session est fermée avec la fonction session_destroy() • Il ne faut jamais oublier d'appeler session_start() sur chacune des pages AVANT d'écrire le moindre code HTML. 4.1 Utilité des sessions • Un script qui demande un login / mot de passe pour qu'un visiteur puisse se "connecter" (s'authentifier). Ainsi, on peut enregistrer des variables de session et se souvenir du login du visiteur sur toutes les pages du site ! • Ce qui permet d'ailleurs de créer une zone d'administration sécurisée sur plusieurs fichiers SANS utiliser de .htaccess. Les variables de sessions sont suffisantes pour vérifier si le mot de passe est le bon. • on se sert des sessions sur les sites de vente en ligne. Cela permet de gérer un "panier" : on retient les produits que commande le client, quelle que soit la page où il est. Lorsqu'il valide sa commande, on récupère ces informations et on le fait payer… 4.2 Ecriture d'une variable de session • On utilisera session_start() et la superglobale $_SESSION[] <?php // initialisation session_start() ; $_SESSION['IlEstCommentBofh'] = 'il est cool'; ?> 4.3 Lecture d'une variable <?php // initialisation session_start() ; // tester la présence de la variable 'IlEstCommentBofh' dans la session if ( isset( $_SESSION['IlEstCommentBofh'] ) ) { echo 'IlEstCommentBofh a pour valeur ' ; // lecture de la variable de session 'langage' echo $_SESSION['IlEstCommentBofh'] ; } else { echo 'IlEstCommentBofh inconnu snif snif' ; } ?> 4.4 Fin de session <?php // on initialise et utilise la session session_start(); $_SESSION['IlEstCommentBofh'] = 'Il est cool'; echo $_SESSION['IlEstCommentBofh']; // affiche Il est cool // php is alive il travaille // on détruit la session session_destroy(); unset($_SESSION); $_SESSION['IlEstCommentBofh'] ; // n'affiche rien ?> 5.0 Les expressions régulières • Les expressions régulières sont des modèles créés à l'aide de caractères ASCII permettant de manipuler des chaînes de caractères et de trouver les portions de la chaîne correspondant au modèle. • Ce système vient de POSIX (norme à l'origine sous Unix). De nombreux scripts sous UNIX les utilisent. • Les expressions régulières permettent de rechercher des occurrences (= suite de caractères correspondant à ce que l'on recherche) grâce à une série de caractères spéciaux. L'expression régulière en elle-même est donc une chaîne de caractère contenant des caractères spéciaux et des caractères standards 5.1 Domaine d’application • Vérifier la validité des chaînes de caractères ( saisie dans un formulaire : email, entrée chiffrée, entrée texte, etc...) • Extraire des parties bien précises d'une chaîne, d'un texte, d'une page... • Modifier une date au format us (05-30-1977) au format fr notamment (30/05/1977) • Remplacer automatiquement toutes les adresses "http://" par des liens cliquables (cf forums, guestbook … ) • Pour créer son propre langage simplifié à partir de la norme HTML, bbCode ([b][/b]...) 5.1 Champ d’application • Il existe 2 types d'expressions régulières. • POSIX : ( Portable Operating System Interface plus le X d'UniX )c'est un langage d'expressions régulières mis en avant par PHP • PCRE : ( Perl Compatible Regular Expression ) :ces expressions régulières sont issues d'un autre langage (le Perl) plus complexes, elles sont surtout bien plus rapides et performantes. 5.2 Les fonctions utiles • preg_grep , preg_split , preg_quote , preg_match , preg_match_all , preg_replace , preg_replace_callback • Chaque fonction a sa particularité, certaines permettent de faire simplement une recherche, d'autre une recherche / remplacement, mais leur gros point commun c'est qu'elles utilisent un "langage" identique pour faire une recherche. 5.3 preg_match <? ?> if (preg_match("** REGEX **", "string’’)) { echo 'Le mot que vous cherchez se trouve dans la chaîne'; } else { echo 'Le mot que vous cherchez ne se trouve pas dans la chaîne'; } !(((https?|ftp)://(w{3}\.)?)(?<\!www)(\w+-?)*\.([a-z]{2,6}))! 5.1 Faire des recherches sur les chaines • une regex est toujours entourée de caractères spéciaux appelés délimiteurs. On peut choisir n'importe quel caractère spécial comme délimiteur, dans les exemples suivant on prendra par convention le délimiteur « ! » !Ma regex! /Ma regex/ 'Ma regex' 5.1 Faire des recherches sur les chaines • Pourquoi des délimiteurs ‘’ !MA REGEX! ‘’ ‘’ !MA REGEX!Options ‘’ • Exemple : <? if (preg_match("!ture!", ‘’la culture c’est comme la confiture…")) { echo 'VRAI'; } else { echo 'FAUX'; } ?> 5.1 Faire des recherches sur les chaines • Attention les regex sont sensibles à la casse • Pour ne pas faire la différence majuscules / minuscules on peut ajouter une option à notre regex CHAINE REGEX RESULTAT J’adore aller à Londres !Londres! VRAI J’adore aller à Londres !LONDRES! FAUX CHAINE REGEX RESULTAT J’adore aller à Londres !Londres!i VRAI J’adore aller à Londres !LONDRES!i VRAI 5.1 Faire des recherches sur les chaines • La barre oblique « | » signifie « ou » dans les regex : CHAINE REGEX RESULTAT J’adore aller à Londres !Londres|Amsterdam! VRAI J’adore aller à Muloose !Londres|Amsterdam! FAUX 5.1 faire des recherches dans des chaines • Les regex permettent des recherches précises et très structurés, dans les exemples précédant le mot pouvait se trouver n’importe ou dans la chaîne • ^ (accent circonflexe) : indique le début d'une chaîne. • $ (dollar) : indique la fin d'un chaîne. • Ainsi si on veut qu’un chaine commence par ‘’Yo’’ il faudra noter la regex de cette manière : !^Yo! • De même, si on veut vérifier que le chaîne se termine par ‘’ ca gaze ", on écrira cette regex : !ca gaze$! 5.1 faire des recherches dans des chaines CHAINE REGEX RESULTAT Yo Bob ca gaze !^Yo! VRAI Yo Bob ca gaze !ca gaze$! VRAI Yo Bob ca roule !ca gaze$! FAUX 5.2 Les classes de caractères. • !gr[aio]s! • Entre crochets = la classe de caractères. Cela signifie qu'une des lettres à l'intérieur peut convenir pour notre REGEX. • Notre regex reconnaît donc gras gros et gris 5.2 Les classes de caractères CHAINE REGEX RESULTAT La nuit, tous les chats sont gris !gr[aoi]s! La nuit, tous les chats sont gros !gr[aoi]s! VRAI VRAI Soyez réaliste demander l’impossible !^[aeiouy]! Kawai ![aeiouy]$! FAUX VRAI 5.3 Les intervalles de classes • Grâce au symbole "-" (le tiret), on peut autoriser toute une plage de caractères. Si on veut que la chaine contienne une lettre on écrira pas : [abcdefghijklmnopqrstuvwxyz] on peut utiliser les intervalles. • [a-z] ou [a-e] avec les chiffres : [0-9] , [1-8] … • On peu combiner les plages aussi : [a-z0-9]. Cela signifie "N'importe quelle lettre (minuscule) OU un chiffre". On peut aussi autoriser les majuscules, sans passer par les options : [a-zA-Z0-9]. [a-zA-Z0-9] =[abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789] 5.3 Les classes de caractères. CHAINE REGEX RESULTAT Cette phrase contient une lettre ![a-z]! VRAI cette phrase ne comporte pas de majuscule ni de chiffres ![a-z0-9]! VRAI Cette phrase commence pas par un chiffre !^[0-9]! FAUX <h1>Une balise de titre HTML</h1> !<h[1-6]>! VRAI 5.3 Les classes de caractères • Pour omettre un caractère dans une classe on utilise aussi le symbole ‘^’ CHAINE REGEX RESULTAT Cette phrase ne contient pas de chiffre ![^0-9]! VRAI cette phrase ne comporte pas de majuscule ni de chiffre ![^A-Z0-9]! VRAI Cette phrase ne se termine pas par une voyelle ![^aeiouy]$! FAUX Cette phrase ne commence pas par une minuscule !^[^a-z]! VRAI 5.4 Les quantificateurs • Les quantificateurs, ce sont des symboles qui permettent de dire combien de fois peuvent se répéter un caractère, ou une suite de caractères. • ? (point d'interrogation) : ce symbole indique que la lettre est facultative. Elle peut y être 0 ou 1 fois. Ainsi, !a?! reconnaît 0 ou 1 "a". • + (signe plus) : la lettre est obligatoire. Elle peut apparaître 1 ou plusieurs fois. Ainsi, !a+! reconnaît "a", "aa", "aaa", "aaaa" … • * (étoile) : la lettre est facultative. Elle peut apparaître 0, 1 ou plusieurs fois. Ainsi, !a*! reconnaît "a", "aa", "aaa", "aaaa" etc... Comme c’est facultatif si a n’y est pas ça renvoi vrai aussi !!! • Les quantificateurs s'appliquent à la lettre directement derrière. On peut ainsi autoriser le mot ‘’disque" qu'il soit au singulier comme au pluriel, avec la regex !disques?! 5.4 Les quantificateurs • Pour répéter plusieurs lettres on peut utiliser les parenthèses : • !Prout(prout)*! : reconnaitra Proutproutproutprout … 5.4 Les quantificateurs CHAINE REGEX RESULTAT aaaaa !a+! VRAI bbbb !c?! VRAI Prouuuuuuuuuuut !^Prou+t! VRAI Blablablablabla !^Bla(bla)*$! VRAI 5.4 Les quantificateurs. • ? correspond à {0,1} • + correspond à {1,} • * correspond à {0,} 5.5 Les métacaractères. • « Ce sont des caractères pas comme les autres qui servent normalement à faire quelque chose de particulier. » • En PCRE (des Regex), les métacaractères qu'il faut connaître sont les suivants : !^$()[]{}?+*.\ 5.5 Les métacaractères : les termes reservés • "!" (point d'exclamation) : il sert toujours à indiquer la fin de la Regex. Si on cherche ‘’kestumedis !? ’’ La regex sera : ! kestumedis \!\?! • "]" (crochet fermant) : normalement, le crochet fermant indique la fin de la classe il faut là aussi mettre un antislash devant si on veut l’utiliser dans une regex. • "-" (tiret) : Le tiret sert à définir un intervalle de classe (comme [a-z]). [a-z0-9-] permet de chercher une lettre, un chiffre, ou un tiret. 5.5.2 Exemples : • • On va tester la saisie d’une adresse email dans un formulaire. Les regles pour une adresse email valide : – – – – On a tout d'abord le pseudonyme (au minimum une lettre). Il peut y avoir des lettres minuscules (pas de majuscules), des chiffres, des points, des tirets et des underscores "_". Il y a ensuite une arobase : @ Ensuite il y a le nom du fournisseur d'accès. Pour ce nom, que des minuscles, des chiffres, des tirets, des points et des underscores. Enfin, il y a l'extension (comme ".fr"). Cette extension comporte un point, suivi de 2 à 6 lettres (minuscules). 5.5.2 Valider une adresse email • !^$! Tout d’abord une fin et un début de chaine • Ensuite, on a des lettres, chiffres, tirets, points, underscores, au moins une fois. On utilise donc la classe [a-z0-9._-] à la suite de laquelle on rajoute le signe + : !^[a-z0-9._-]+$! • l'arobase : !^[a-z0-9._-]+@$! • Puis, encore une suite de lettres, chiffres, points, tirets au moins 2 fois : !^[a-z0-9._-]+@[a-z0-9._-]{2,}$! • Pour le point de .fr .com … : !^[a-z0-9._-]+@[a-z0-9._-]{2,}\.$! • Enfin l’extension (en minuscules) : !^[a-z0-9._-]+@[a-z0-9._-]{2,}\.[a-z]{2,6}$! 5.5.2 Valider une adresse email <? if (isset($_POST['mail'])) { if (preg_match("!^[a-z0-9._-]+@[a-z0-9._-]{2,}\.[a-z]{2,6}$!", $_POST['mail'])) { echo 'L\'adresse ' . $_POST['mail'] . ' est <strong>valide</strong> !'; } else { echo 'L\'adresse ' . $_POST['mail'] . ' n\'est pas valide, recommencez !'; } } ?> <form method="post"> <p> <label for="mail">Votre mail ?</label> <input id="mail" name="mail" /><br /> <input type="submit" value="Vérifier le mail" /> </p> </form>