Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống
1
/ 50 trang
THÔNG TIN TÀI LIỆU
Thông tin cơ bản
Định dạng
Số trang
50
Dung lượng
1,14 MB
Nội dung
La portée d’une variable dans une fonction Une variable à l’extérieur d’une fonction possède une portée limitée à la périphérie de la fonction, c’est-à-dire que la variable n’existe pas dans ce périmètre. Seuls un ou plusieurs paramètres seront envoyés dans la fonction par l’intermédiaire des parenthèses, mais le nom de la variable n’a aucune importance. C’est d’ailleurs ce qui fait son intérêt. Parfois cependant, il est intéressant de récupérer une variable qui existe dans la même page en dehors de la fonction. Pour cela, il est possible d’utiliser le mot-clé global afin que la portée de la variable se situant à l’extérieur de la fonction soit étendue à toute la page. Dans l’exemple cité précédemment, il est possible de mettre les sépara- teurs avant la fonction pour une meilleure visibilité : $motif []=" "; $motif []="-"; Ensuite, dans la fonction vous déclarez : global $motif; Ainsi, la fonction pourra utiliser le tableau $motif même s’il est situé à l’extérieur de la fonction. Précédé du mot global, il est opérationnel dans la fonction. Méfiez-vous des variables globales Si vous modifiez votre variable et que vous avez oublié qu’elle est opérante dans la fonction, vous risquez d’avoir une surprise dont il sera difficile de déceler la cause. Les fonctions imbriquées Il est intéressant, parfois, de créer une fonction pour appeler plusieurs fonctions. Ainsi, lorsque vous relirez votre programme, vous obtiendrez une sorte de hiérarchie de fonctions. Les fonctions Double Poche PHP & MySQL • 101 Please purchase PDF Split-Merge on www.verypdf.com to remove this watermark. Nous pourrions avoir, par exemple : function verif_id ($login, $motdepasse, $table){ connexion_base(); recherche_dans_table($table, $login, $motdepasse); } Les fonctions récursives Une fonction peut s’appeler elle-même, de façon récursive. Nous allons le voir avec une suite de Fibonacci. Pour la petite histoire, Leonardo Fibonacci était un moine italien qui vivait 250 ans avant Léonard de Vinci. Il avait remarqué que les végétaux respectaient une suite dans leur croissance. Ainsi, les pétales de fleurs ou les feuilles sur les arbres observaient une sorte de règle. Il en fit une fonction mathématique. Cette fonction génère un nombre en faisant la somme des deux précédents. Les deux premiers sont 0 et 1 puis 0+1=1; 1+1=2; 2+1=3 ; 3+2=5… Si vous continuez, vous parviendrez rapidement à des nombres vertigineux. Voici la fonction : Listing 3.19 : Fonction suite de Fibonacci fibonacci.php <? function fibonacci ($nombre){ if ($nombre<0){ return (0); } elseif($nombre<2){ return ($nombre); } return fibonacci($nombre-1)+fibonacci($nombre-2); } for ($i=0;$i<20;$i++){ $nouveau_nombre=fibonacci($i); echo $nouveau_nombre; echo ’<br>’; } ?> Les deux premiers tests avec if et elseif concernent les deux premiers nombres qu’il faut générer, puis la fonction s’appelle deux fois et retourne 3 Les clefs du PHP 102 • Double Poche PHP & MySQL Please purchase PDF Split-Merge on www.verypdf.com to remove this watermark. le résultat. La boucle for est là pour créer la liste des nombres obtenus. Le calcul au-delà de 30 dépend de la capacité de votre machine. Afficher vos date et heure locales Le programme proposé ici est l’occasion de revoir des fonctions imbri- quées ainsi que d’autres notions telles que les dates, les tableaux et l’opérateur de contrôle d’erreur. Pour afficher le jour de la semaine en français, nous créons un tableau car le jour est un nombre de0à6enpartant du dimanche. Le paramètre envoyé $moment est un timestamp que nous calculons avant l’appel. Nous tenons compte du décalage avec l’heure GMT pendant l’heure d’hiver. L’heure d’hiver commence le dernier dimanche d’octobre à 1h GMT et finit le dernier dimanche de mars à 1h GMT. <? function affiche_jour($moment){ $jour=date("w", $moment); $les_jours=array(’dimanche’, ’lundi’, ’mardi’, ’mercredi’, ’jeudi’, ’vendredi’, ’samedi’); $jour=$les_jours[$jour]; return $jour; } m Figure 3.10 : La fonction de Fibonacci Les fonctions Double Poche PHP & MySQL • 103 Please purchase PDF Split-Merge on www.verypdf.com to remove this watermark. Cette fonction affiche_mois() affiche le mois en français (pas de capitales en français). function affiche_mois ($moment){ $mois=date("n", $moment);//le mois sans 0 devant $les_mois=array(’’, ’janvier’, ’février’, ’mars’, ’avril’, ’mai’, ’juin’, ’juillet’, ’août’, ’septembre’, ’octobre’, ’novembre’, ’décembre’); $mois=$les_mois[$mois]; return $mois; } Voici maintenant la fonction principale qui contient l’algorithme et appelle les autres fonctions pour se nourrir : function affiche_date_locale($moment){ $decalage_hiver=1; Nous vérifions d’abord si un paramètre a été envoyé. Si ce n’est pas le cas, nous prenons le TIMESTAMP Unix courant : if (!$moment){ $temps=time(); } else { $temps=$moment; } Nous créons les TIMESTAMP Unix des moments du changement d’heure pour l’année en cours en heure GMT. Il suffit de trouver le jour de semaine du 31 mars, puis en sachant que le dimanche est un jour 0, d’enlever le nombre du jour de semaine à 31 pour obtenir la date : $jourdesemaine=gmdate("w", mktime(1,0,0, 3,31,gmdate("Y"))); //variable pour connaître le jour de semaine du 31 mars $limite_inf=mktime(1,0,0, 3,31-$jourdesemaine,gmdate("Y")); /*variable pour trouver le dernier dimanche de mars pour l’année courante*/ $jourdesemaine=gmdate("w", mktime(1,0,0, 10,31,gmdate("Y"))); /*variable pour connaître le jour de semaine du 31 octobre*/ $limite_sup=mktime(1,0,0, 10,31-$jourdesemaine,gmdate("Y")); 3 Les clefs du PHP 104 • Double Poche PHP & MySQL Please purchase PDF Split-Merge on www.verypdf.com to remove this watermark. /*variable pour trouver le dernier dimanche d’octobre pour l’année courante*/ Maintenant, nous testons la date pour savoir si elle est comprise entre les deux limites. Dans ce cas, elle est en heure d’été : if ($temps>$limite_inf && $temps<$limite_sup){ $decalage=$decalage_hiver+1; } else { $decalage=$decalage_hiver; } $moment=mktime(gmdate("G")+$decalage,gmdate("i"),0, gmdate("n"),gmdate("j"),gmdate("Y")); Enfin, nous fabriquons le timestamp avec mktime(), en incluant le décalage avec l’heure GMT : Listing 3.20 : Fonctions d’affichage de date : date.php $ladate=affiche_jour($moment) ." ".date("j", $moment)." ". affiche_mois($moment) ." ". date("Y", $moment); /*la date inclut le mois en français grâce à l’appel de la fonction.*/ $heure = date("G",$moment); $minute = date("i", $moment); $ladate.="<BR>"; $ladate.="$heure"; $ladate.="h"; $ladate.="$minute"; return $ladate; } echo @affiche_date_locale(); /*Vous faites précéder la fonction du @ pour éviter le message d’erreur si vous n’envoyez pas de paramètre*/ ?> 3.7 Récapitulatif pour votre application Vous avez créé un fichier fonctions.inc.php dans lequel vous avez inséré votre fonction majuscules(). Maintenant, vous allez si vous le désirez y insérer les fonctions date_nombre(), nombre_date(), affiche_date _locale(), affiche_mois() et affiche_jour(). Nous vous encoura- geons à les modifier comme bon vous semble, pour les adapter dans leur Récapitulatif pour votre application Double Poche PHP & MySQL • 105 Please purchase PDF Split-Merge on www.verypdf.com to remove this watermark. forme d’affichage ou leur contenu. Si vous vivez à Montréal et que votre serveur est sur un autre fuseau horaire, votre décalage avec l’heure GMT sera plutôt -5 en hiver que +1, etc. Nous verrons dans le chapitre 4 comment insérer ces fonctions dans les fichiers de votre application avec une seule ligne de code. Après la clôture de ce chapitre, nous étudierons le traitement des formulaires et leur vérification. 3 Les clefs du PHP 106 • Double Poche PHP & MySQL Please purchase PDF Split-Merge on www.verypdf.com to remove this watermark. 4 MySQL en action Please purchase PDF Split-Merge on www.verypdf.com to remove this watermark. Nous allons bientôt pouvoir nous aventurer en ligne. Mais avant cela, revenons à notre internaute qui souhaite créer son club des Bon Vivants. Il va lui falloir mettre de l’ordre dans ses idées car avec MySQL, il passe à la vitesse supérieure. MySQL a été créée par Michael Widenius de la société TcX, en réaction à certaines insuffisances de la base de données mSQL. La version 1.0 sort en mai 1995. Son créateur décide de la distribuer gratuitement via Internet. L’emploi d’une base de données est lié à l’utilisation des formulaires et à la nécessité de classer les informations données par l’internaute. Il est bien sûr possible d’employer un simple fichier texte avec un séparateur entre les champs mais cette solution comporte plusieurs inconvénients. 4.1 Le fichier face à la base de données Le fichier est fragile. Vous devez créer un double de votre fichier car tout fichier peut être vidé par un accès simultané. Il faut donc en verrouiller l’accès avec un verrou logiciel que le langage PHP fournit. Votre séparateur doit être un signe que vous n’utilisez jamais, pour qu’on ne le confonde pas avec un élément de votre texte. La base de données est gratuite et proposée par tous les hébergeurs. Elle est robuste (en particulier MySQL) et rapide. De plus, elle propose des fonctions qui économisent des lignes de code. L’application de ce chapitre vous permettra de mieux comprendre tout cela. 4.2 Conception de l’application du club Vous disposez d’une base de données MySQL vide. Une base de données sert à classer les informations en vue de les retrouver facilement et d’opérer des rapprochements entre elles afin d’avoir des statistiques. Les données sont ce qu’ilyadeplus important. Tout développeur commence par là. Le site n’est ensuite là que pour présenter et traiter ces données. La première information concerne l’identité des membres et leurs coor- données : ¶ nom, ¶ prénom, 4 MySQL en action 108 • Double Poche PHP & MySQL Please purchase PDF Split-Merge on www.verypdf.com to remove this watermark. ¶ adresse, ¶ code postal, ¶ ville, ¶ pays, ¶ e-mail, ¶ téléphone. Tout le monde n’aura pas envie de laisser une adresse postale ou un téléphone, nous pouvons donc penser que ces informations sont à considérer comme optionnelles. Par contre, il est intéressant de disposer de la ville et du code postal car le but de ce club est la convivialité. Il se peut en effet que des membres soient proches géographiquement et puissent ainsi organiser des rencontres locales. Il faut donc rendre obligatoire le code postal et le pays. L’adresse e-mail est obligatoire pour les contacts entre le webmestre et les membres du club, mais aussi pour les contacts entre les membres du club. Le prénom est intéressant et le nom optionnel. Voyez également si l’adresse postale et le téléphone sont indispensables. Les contacts peuvent se faire par courriel. S’ils le désirent, les membres s’échangeront ces deux informations. Le problème est que le membre du club qui change d’adresse e-mail (ce qui peut arriver souvent) demandera éventuellement au webmestre d’ef- fectuer le changement. Cela peut prendre du temps si le club comprend de nombreux membres. Il est plus intéressant de permettre au membre un accès direct à ses données pour qu’il puisse, au besoin, les modifier. Mais comment être sûr qu’il s’agit de la personne en question et non d’une autre ? La solution ici passe par l’authentification. Nous l’étudierons au chapitre 5. Il faut ajouter un nom d’usage et un mot de passe. Le nom d’usage apporte un anonymat et le mot de passe garantit l’identité de la personne. Créons maintenant ensemble la table dans la base de données. 4.3 Création d’une table Sachez qu’il est intéressant dans une table de créer une clé unique qui identifie chaque nouvelle ligne. MySQL propose une fonction Création d’une table Double Poche PHP & MySQL • 109 Please purchase PDF Split-Merge on www.verypdf.com to remove this watermark. AUTO_INCREMENT qui permet de créer automatiquement une clé qui s’incrémente de 1 à chaque nouvelle ligne. Chaque nom d’usage dans le club sera unique puisqu’il identifiera un membre, donc nom_usage peut servir de deuxième clé, de clé secondaire. Chaque clé auto-incrémentée est unique Chaque nouvelle ligne dispose d’une clé unique. Si vous effacez une ligne par la suite, la clé disparaîtra aussi. Par exemple, vous avez une ligne avec une clé 1 puis vous l’effacez. Vous n’avez donc plus aucune ligne dans votre table mais la prochaine ligne commencera néanmoins à 2. Ainsi, l’intégrité des données est garantie. Pour créer la table, nous devons définir le type de chaque donnée et sa longueur. Le nom d’usage est une chaîne de caractères dont nous pouvons limiter la longueur à 25 caractères. Le mot de passe et le prénom sont de même type, avec une longueur de 20 pour le mot de passe et de 25 pour le prénom. La longueur d’un champ MySQL C’est à vous de décider de la longueur du champ en question. Pour un nom d’usage, vous pouvez imaginer qu’ils ne dépasseront pas 25 caractères, ce qui est assez long. C’est vrai qu’il vaut mieux calculer plus large car si la donnée est trop longue, elle sera tronquée dans la table. D’autre part, les hébergeurs vous accordent beaucoup de place et il ne sert à rien d’économiser dans ce domaine, pour être obligé ensuite d’élargir et de reconstituer les données tronquées. Le code postal est constitué en France d’une série de cinq chiffres. Cette donnée peut donc être de type numérique. Il vaut mieux lui donner un type "chaîne de caractères" car des Québécois seront peut-être intéressés par votre club (leur code postal est composé de lettres et de chiffres). D’ailleurs, les neuf premiers départements français sont précédés d’un 0. En règle générale, les codes postaux, les numéros de téléphone… sont de type texte car ils ne sont pas des nombres mais des codes. Nous pourrions 4 MySQL en action 110 • Double Poche PHP & MySQL Please purchase PDF Split-Merge on www.verypdf.com to remove this watermark. [...]... fonctions du langage PHP pour MySQL Le langage PHP tire prot de la simplicitộ de son interface avec les bases de donnộes, en particulier MySQL Voici les fonctions que vous utiliserez le plus souvent Tab 4.4 : Les principales fonctions daccốs une base MySQL Fonction Description mysql_ connect() Ouvre une connexion mysql_ create_db() Crộe une base mysql_ query() Exộcute une requờte et retourne un identificateur... face=\"Arial, Helvetica, sans-serif\" size=\"2\">\n"; $message.=$contenu; $message.="\n"; $message.="\n"; $message.="\n"; Composons maintenant les en-tờtes du message : $entetes = "From: \"le club des Bon Vivants\" \n"; $entetes = "X-Sender: \n"; $entetes = "X-Mailer: PHP\n"; // mailer $entetes = "X-Priority: 1\n"; $entetes = "Return-Path:... PDF Split-Merge on www.verypdf.com to remove this watermark 4 MySQL en action Dans cette deuxiốme version, nous utilisons des commandes SQL pour rộcolter linformation Nous employons la fonction mysql_ query() qui prend comme paramốtres la commande SQL et lidentiant de connexion Son rộsultat est transformộ en tableau par la fonction mysql_ fetch_array() Une boucle while dộcline ensuite le tableau sous... $email)"; @mysql_ query($sql,$id_link); ?> Les variables dans la requờte SQL Dans lexemple ci-dessus, les variables sont encadrộes par des guillemets simples Nous avons vu prộcộdemment que des variables lintộrieur de guillemets simples nộtaient pas remplacộes par leur valeur et que PHP les prenait littộralement Ici ce nest pas le cas car les guillemets simples sont lintộrieur de guillemets doubles... de 0 plus 1 Cette clộ indexộe et unique permet une recherche rapide lintộrieur de la table Lattribut UNIQUE dộsigne des clộs secondaires Ainsi les champs nom_usage et mot_passe ne peuvent comporter de doublons Chaque membre possốde bien sỷr une identitộ unique Cependant, nous navons pas jugộ intộressant de les caractộriser ainsi dans la table MySQL Il vaut mieux continuer dans lartisanat et faire la... nom"; $resultat= @mysql_ query($sql,$id_link); echo ; echo ; ///////////////la premiốre ligne vide/// while ($rang =mysql_ fetch_array($resultat)){ // mysql_ fetch_array() crộe un tableau avec les lignes du rộsultat $code=$rang[code]; $nom=$rang[nom]; echo "$nom"; } echo ; ?> Double Poche PHP & MySQL 123 Please... PHP et le nom des tableaux est au pluriel, mờme si vous navez quun formulaire ou quun ộlộment de formulaire Un objet String dispose de la propriộtộ length que nous utiliserons pour vộrier que le champ a ộtộ rempli correctement Lobjet window contient la mộthode alert() qui permet dafficher une fenờtre davertissement avec un bouton OK ẫtudions plus prộcisộment maintenant les objets du formulaire et leurs... donnộes, il fallait un nom dutilisateur et un mot de passe Si vous avez besoin de cet accốs dans votre page, saisissez les lignes suivantes : . function fibonacci ($nombre){ if ($nombre<0){ return (0); } elseif($nombre<2){ return ($nombre); } return fibonacci($nombre-1)+fibonacci($nombre-2);. premiers tests avec if et elseif concernent les deux premiers nombres qu’il faut générer, puis la fonction s’appelle deux fois et retourne 3 Les clefs du