Upload
bing
View
26
Download
0
Embed Size (px)
DESCRIPTION
Cette présentation ainsi que les exemples de code sont disponibles à http://ecoles.in2p3.fr Il n’est pas conseillé de l’imprimer en raison des animations utilisant plusieurs couches d'objets. Construire des applications Web … …initiation à PHP, MySQL, [JavaScript]. Dan [email protected]. - PowerPoint PPT Presentation
Citation preview
Formation Webmasters- @dc 1
Cette présentation ainsi que les exemples de code sont disponibles à http://ecoles.in2p3.frIl n’est pas conseillé de l’imprimer en raison des animations utilisant plusieurs couches d'objets
Construire des applications Web …Construire des applications Web …
…initiation à PHP, MySQL, [JavaScript]…initiation à PHP, MySQL, [JavaScript]
HTML et HTML dynamique, rappels HTML et HTML dynamique, rappels
Formation Webmasters- @dc 4
Le modèle HTML statique
<html><body>Hello</body></html>
Fichier hello.htmlFichier hello.html
<html><body>Hello</body></html>
Hello
htdocs
Serveur WEB
Internet
Formation Webmasters- @dc 5
Le modèle HTML dynamique avec les CGI
<html><body>Hello</body></html>
Hello%a#|^%%§!$¤
hello.exehello.exe
Cgi-bin
Serveur WEB
executionexecution
printf("<html>");printf("<body>");printf("<Hello>");printf("</body>");printf("</html>");
compilationcompilation
hello.chello.c
Formation Webmasters- @dc 6
Le modèle HTML dynamique avec un interpréteur
<html><body>Hello</body></html>
Helloprintf("<html>");printf("<body>");printf("<Hello>");printf("</body>");printf("</html>");
hello.phphello.php
htdocs
Serveur WEB
Internet
InterprêteurInterprêteur
Présentation de l’application WebPrésentation de l’application Web
Formation Webmasters- @dc 8
Fonctionnellement une application Web c’est :
• Un formulaire inséré dans une page Web et permettant à un utilisateur de transmettre des données, de déposer une demande
• Un serveur traitant cette demande et envoyant une réponse, un accusé de réception
• Exemples Les réservations de la SNCF
La gestion de compte bancaire à la BNP
Le formulaire de déclaration d’impôts du Ministère des Finances
L’annuaire de l’IN2P3
Etc.
Formation Webmasters- @dc 9
Techniquement une application Web c’est :
• Une page Web contenant un formulaire HTML envoyé au client
• Du code « autonome » s’exécutant sur un serveur HTTP Le programme est auto suffisant, il calcule par exemple la racine carrée
d’un nombre
• Ou du code s’exécutant sur un serveur HTTP et accèdant à des services « non Web » Accès à des bases de données
Accès à des serveurs LDAP
• … Mais peut être aussi du code s’exécutant dans le navigateur Validation, vérification des saisies
Ergonomie du formulaire
Formation Webmasters- @dc 10
Une application Web nécessite donc
• Obligatoirement un serveur HTTP ! Apache, (éventuellement IIS)
• De quoi faire exécuter un programme sur le serveur On peut programmer en C, en Fortran ou en assembleur : ce sont des
CGI, ils ne sont pas indépendants de la plateforme d’exécution ! On préfèrera utiliser des interpréteurs : PHP, Java, Perl qui eux sont
indépendants de la plateforme d’exécution
• Souvent une base de données MySql, Postgres ou Oracle, etc.
• La possiblité de solliciter un interpréteur localisé sur le navigateur du client Nestcape, IE et leur interpréteur commun : JavaScript
Scripts clients et scripts serveursScripts clients et scripts serveurs
Formation Webmasters- @dc 12
Scripts et scripts : distinguons bien…
• Ce qui est exécuté sur le serveur : le script PHP Tout comme les ASP (Vbscript), les servlets (Java), les CGI (…)
• Et ce qui est exécuté sur le navigateur : le script JavaScript Tout comme les applets (Java), les ActivX, les plugins propriétaires
Ces scripts, PHP ou JS s’exécutent lorsque l’utilisateur agit sur un objet du formulaire : bouton, remplissage d’un champ, sélection dans une liste, …
Ces scripts, PHP ou JS s’exécutent lorsque l’utilisateur agit sur un objet du formulaire : bouton, remplissage d’un champ, sélection dans une liste, …
Formation Webmasters- @dc 13
Types de scripts
• La programmation en JavaScript est de type événementielle. On écrira essentiellement de courtes fonctions réalisant des tests ou manipulant l’interface Par exemple, on teste immédiatement, lors de la saisie du champ
« âge du candidat », que les caractères entrés sont bien des chiffres et que la valeur est cohérente
• La programmation en PHP est plutôt séquentielle Par exemple, on déroule les instructions permettant d’insérer dans la base
de données les valeurs transmises depuis le formulaire
Formation Webmasters- @dc 14
Choisissons …
• Ce qui va s’exécuter sur le navigateur …
• Et ce qui va s’exécuter sur le serveur
Ou sur les
deux ?
Ou sur les
deux ?
Formation Webmasters- @dc 15
Recommandations
• Si vous faites un contrôle de saisie Vous pouvez utiliser JavaScript sur le client
Avantage : rapidité, instantanéité, sanction immédiate, pas d’accès réseau
Inconvénient : si vous utilisez seulement un contrôle JS votre application doit s’assurer que JS n’est pas désactivé sur le navigateur
Vous pouvez utiliser PHP sur le serveur Avantage : impossible de court-circuiter le contrôle Inconvénient : accès serveur, pas de contrôle pas à pas possible,
sanction a posteriori
Vous pouvez utiliser les deux Avantage : rapidité et contrôle temps réel Inconvénient : double codage
Formation Webmasters- @dc 16
Exercice
• Une calculette € : Par qui allez-vous faire effectuer la conversion ? Par du code JavaScript sur le navigateur ?
Par du code PHP sur le serveur ?
• Et un script qui affiche l’heure ? Navigateur ou serveur ?
Quels langages ?Quels langages ?
Formation Webmasters- @dc 18
Combien de langages pour le programmeur 2, 3 ou 4 ?
• On considère qu’il connaît le HTML
• L’interpréteur PHP et le langage PHP !
• Si l’on veut accéder à une base de données, il faudra alors connaître un peu de SQL
• Et si on veut exécuter du code « côté client », on devra connaître le JavaScript
Formation Webmasters- @dc 19
Les langages
• 2 langages de programmation : PHP et JavaScript Syntaxe proche du C, de Java, de Perl
Les codes sont insérés dans la page HTML Le code PHP est interprété sur le serveur avant l’envoi de la page
– Le code PHP n’est donc pas visible Le code JS est interprété par le navigateur, soit à réception, soit sur un
événement – Le code JS peut être visualisé comme le code HTML
Pas de réels outils de debug
• 1 langage de composition de page Web : HTML
• 1 langage d’interrogation de la base de données : SQL
Initiation à PHPInitiation à PHP
PHP : Personnal Home Page ?PHP : Personnal Home Page ?
PHP : Hypertext PreProcessor ?PHP : Hypertext PreProcessor ?
Créé par Rasmus Ledorf en 1994Créé par Rasmus Ledorf en 1994
Formation Webmasters- @dc 21
Caractéristiques du langage
• Le langage de scripting du Web : un standard de fait !
• Facile à apprendre et à utiliser
• Excellent support des SGBD (Oracle, MS, MySql, DB2…)
• Interface pour tous les protocoles : FTP, SMTP, LDAP, SNMP..
• Interface avec les couches systèmes : sockets, file system…
• Accès aux images et aux formats d’affichage : gif, PDF
• Connexions sécurisées (SSL)
• Utilisation en mode conventionnel ou objet
Interpréteur disponible sur toutes les plateformes : Linux, Windows, MacOs
Formation Webmasters- @dc 22
Insérer du code PHP
• Directement dans le code HTML
• En remplaçant l’extension .html du fichier par l’extension .php
<? … ?>
<?php …?>
<script language="php">…
</script>
<html><head>...</head><body>...
<?echo "Hello le monde !";
?>...
Fichier test.php sur le serveurFichier test.php sur le serveur
<html><head>...</head><body>...Hello le monde !...
Le code PHP est interprêté sur leserveur avant d’être envoyé au client
Code envoyé au clientCode envoyé au client
Formation Webmasters- @dc 23
Premier programme
• Editer ce programme
• Copier le à la racine du serveur (htdocs)
• Appeler l'url http://localhost/info.php
• Vous recevrez une page contenant toutes les caractéristiques et options de votre interpréteur PHP
<?phpphpinfo();?>
<?phpphpinfo();?>
info.phpinfo.php
L'installation de PHP sur le serveur et de
sa configuration (php.ini) sera vue
demain …
L'installation de PHP sur le serveur et de
sa configuration (php.ini) sera vue
demain …
Formation Webmasters- @dc 24
Le langage
• Syntaxe héritée du C :
Méme séparateur pour les instructions : le ; Méme types de commentaires
/* commentaires sur plusieurs lignes ......Fin des commentaires */// une seule ligne de commentaires
Tous les types de données : entiers, nombres à virgule flottante, chaînes de caractères, tableaux, objets…
Des entiers : 123, -24, 0677 (octal), 0x456 (hexa) Des flottants : 12.34, 1.2e3 Un booléen : true ou false Une chaîne de caractères ’hello le monde’ ...
Formation Webmasters- @dc 25
Les variables
• Une variable en PHP commence par le caractère $ $_nom, $index, $k2, $annee_de_naissance
• Les variables sont sensibles à la casse
• Les variables n’ont pas à être déclarées
• Les variables ne sont pas typées, c’est le contexte qui décide$var = 24; // $var représente un entier...
$var = ’mardi’; // ...puis une chaîne de caractères
• On peut faire des variables dynamiques (variable de variable)$var = ’jour ’;
$$var = ’mardi’
echo $jour; // imprimera mardi
Formation Webmasters- @dc 26
Transtypage ou casting
• (int), (integer) - type entier
• (bool), (boolean) - booléen
• (real), (double), (float) - type double
• (string) - type chaîne
• (array) - type tableau
• (object) - type objet
<?php $test = "1945"; echo gettype($test); $test = (bool) $test; echo gettype($test); echo ($test);?>
<?php $test = "1945"; echo gettype($test); $test = (bool) $test; echo gettype($test); echo ($test);?>
casting.phpcasting.php
Ça imprime quoi ?
Ça imprime quoi ?
Formation Webmasters- @dc 27
Interprétation
• Une chaîne de caractères est définie entre simple quote 'ou entre double quote " Si on utilise la double quote, les variables inclues sont interprétées Si on utilise la simple quote, les variables inclues sont prises comme tel
$nom = "Vargas";
//
$politesse = "Bonjour Mme $nom <br>";
echo $politesse;
Imprime : Bonjour Mme Vargas
$politesse = 'Bonjour Mme $nom <br>';
echo $politesse;
Imprime : Bonjour Mme $nom
Bonjour Mme VargasBonjour Mme Vargas
affiche
Bonjour Mme $nomBonjour Mme $nom
affiche
Formation Webmasters- @dc 28
• Comme en C, la variable ne perd pas sa valeur à chaque appel du bloc
• Utilisé dans un contexte récursif
function compte(){
static $compteur = 0;
$compteur++;
while ($compteur <10){echo $compteur; compte();}
}
compte(); affiche : 123456789
Variable static
123456789123456789
affiche
Mais, dans une seule exécution du programme !
Mais, dans une seule exécution du programme !
Formation Webmasters- @dc 29
Définition de constantes
• L'habitude est d'écrire les constantes en majuscules
• Lorsque l'on utilise une constante, on ne met pas de $ devant son nom
define ("IN2P3","http://www.in2p3.fr");
print ("<a href=".IN2P3.">web in2p3</a>");
define ("IN2P3","http://www.in2p3.fr");
print ("<a href=".IN2P3.">web in2p3</a>");
Formation Webmasters- @dc 30
Inclusion de fichiers : request et include
• Les fichiers importés étant supposés de l’HTML, ils devront comporter des balises PHP
require ("nom_du_fichier"); remplace l’instruction par le contenu du fichier
include ("nom_du_fichier"); évalue le code contenu dans le fichier
<?phpinclude ('database.php');$cxDB=mysql_connect(HOST,USER,PWD);if (!$cxDB){?>
<?phpinclude ('database.php');$cxDB=mysql_connect(HOST,USER,PWD);if (!$cxDB){?>
<?phpdefine ("HOST","ccmysql.in2p3.fr");define ("USER","leUser");define ("PWD","leMotDePasse");define ("BD", "resa");?>
<?phpdefine ("HOST","ccmysql.in2p3.fr");define ("USER","leUser");define ("PWD","leMotDePasse");define ("BD", "resa");?>
database.phpdatabase.php
Formation Webmasters- @dc 31
Variables HTTP
• On accède grâce au tableau associatif $_SERVER aux variables accessibles depuis les CGI
<?if ($_SERVER["REQUEST_METHOD"]=="GET") print ($_SERVER["QUERY_STRING"]."<br>");print ($_SERVER["HTTP_USER_AGENT"]."<br>");print ($_SERVER["HTTP_REFERER"]."<br>");?>
<?if ($_SERVER["REQUEST_METHOD"]=="GET") print ($_SERVER["QUERY_STRING"]."<br>");print ($_SERVER["HTTP_USER_AGENT"]."<br>");print ($_SERVER["HTTP_REFERER"]."<br>");?>
Formation Webmasters- @dc 32
• Tableau nominatif
$labo = array('ccin2p3',‘Lyon','51');
print ($labo[0]);
• Tableau associatif
$labo = array(nom=>'ccin2p3',ville=>'Lyon',agents=>'51');
print ($labo['ville']);
• Les fonctions sizeof() et count() retournent la dimension du tableau
• On a ce qu'il faut pour gérer un pointeur permettant de naviguer dans le tableau ( next(), prev(), reset()… ) et ce qu'il faut pour trier le tableau (sort()..)
imprime : Lyon
Tableaux
LyonLyon affiche
ccin2p3ccin2p3 affiche
Formation Webmasters- @dc 33
• On n’en parle pas, c’est comme le C … Méme structure de contrôle
for, if then else, do, while, switch, foreach, break, continue, … Mémes opérateurs mathématiques
+ - / * % += ++ -- Mêmes opérateurs logiques
&& | | ! Mêmes opérateurs de comparaison
== != > < <= >=
• …sauf pour la concaténation où on utilise le point .
$nom = "Adamberg";
$salutation = "Bonjour Monsieur ".$nom;
echo $salutation;
affiche : Bonjour Monsieur Adamberg
Syntaxe du langage Tout le monde
connaît ?Tout le monde
connaît ?
Bonjour Monsieur AdambergBonjour Monsieur Adambergaffiche
Formation Webmasters- @dc 34
Fonction utilisateur
• Il est possible d'avoir des paramètres optionnels (comme en c++)
function identite($sexe="masculin",$langue="francais")
...
function ttc($montantHT){ $taux = 1.186; return $montantHT * $taux;}…$montantTTC = ttc($somme);
function ttc($montantHT){ $taux = 1.186; return $montantHT * $taux;}…$montantTTC = ttc($somme);
Formation Webmasters- @dc 35
Bibliothèques de fonctions
• La distribution PHP intègre des centaines de fonctions pour tout faire ! On n'a pas parlé du traitement des chaînes de caractères : il y a toutes
celles du C (strxxx) plus des tas d'autres !
Evidement toutes les fonctions mathématiques
Il y a tout pour gérer des dates (c'est très très facile …)
Tout pour gérer, les protocoles, les systèmes de fichiers, les SGBD …
… et tout pour faire du XML, XSL …des web-services
Voir la doc en ligne
http://dev.nexen.net/docs/php/annotee/indexes.functions.php
Formation Webmasters- @dc 36
Portée des variables
• La portée d’une variable dépend du contexte dans lequel elle est définie Hors d’une fonction, elle est globale, mais doit être déclarée comme telle
dans la fonction, sous peine de redéfinition Dans une fonction elle est locale, sauf définition comme global
$nom = "Vargas";function jamaisTest(){
global $nom;global $prenom;$prenom = "Fred";$titre = "écrivain";
}jamaisTest();echo "$prenom $nom $titre"; imprime : Fred Vargas
Fred VargasFred Vargasaffiche
Tiens ! pourquoi ça imprime pas "Fred Vargas écrivain" ?
Tiens ! pourquoi ça imprime pas "Fred Vargas écrivain" ?
Construire une applicationConstruire une application
Formation Webmasters- @dc 38
Un formulaire …
<input name=email><input name=email>
<input name=commentaire><input name=commentaire>
<input type=submit><input type=submit>
<select name=objet><select name=objet>
<a href=# onClick=document.forms[0].date.value=28>28</a> <input type=hidden name=date><input type=hidden name=date>
<select name=annee<select name=annee
<input name=titre><input name=titre>
<form name=resa action=resa.php…<form name=resa action=resa.php…
</form>
Formation Webmasters- @dc 39
Traitement du formulaire
• Le formulaire est décrit dans une page HTML qui peut être statique ou dynamique…
• Le programme PHP décrit par le paramètre « action » de la balise « form », est invoqué lors du clic sur le bouton « submit »
• Le programme PHP doit récupérer les valeurs saisies dans les différents champs du formulaire pour les traiter
• C’est le nom, au sens HTML, défini par le paramètre « name », qui va être utilisé pour créer la variable PHP
Formation Webmasters- @dc 40
Récupération de la valeur des champs -1
<html><form name=xyz action=test.php>Prénom :<input name=prenom></form></html>
<html><form name=xyz action=test.php>Prénom :<input name=prenom></form></html>
<?echo "Bonjour".$prenom; ?>
test.htmltest.html test.phptest.php
Cette méthode n’est possible que siregister_globals = ondans le fichier de configuration de l’interpréteur PHP (php.ini)
Formation Webmasters- @dc 41
Récupération de la valeur des champs -2
• Pour des raisons de sécurité, la méthode précédente n’est pas conseillée…
• On utilisera le tableau associatif $_REQUEST dont les clés sont les noms des éléments HTML
Clé Valeur
nom Adamsberg
prenom Jean-Baptiste
email [email protected]
$_REQUEST$_REQUEST
$_REQUEST["prenom"] = Jean-Baptiste
Formation Webmasters- @dc 42
Récupération de la valeur des champs -3
<html><form name=xyz action=test.php>Prénom :<input name=prenom></form></html>
<html><form name=xyz action=test.php>Prénom :<input name=prenom></form></html>
<?$prenom = $_REQUEST["prenom"];echo "Bonjour".$prenom; ?>
test.htmltest.html test.phptest.php
Cette méthode fonctionne quelque soit la méthode (GET ou POST) choisiepour la transmission du formulaire.
Formation Webmasters- @dc 43
N’oubliez pas !
• L’exécution du programme PHP sur le serveur … Effectue un certain nombre d’actions…
Vérification des données reçues, insertion d’enregistrements dans une base de données, récupération de fichiers, etc.
Mais en final génère toujours de l’HTML à destination du client Message de confirmation, d’erreurs, résultats divers, etc. Si on ne génère pas de code HTML le résultat retourné est … une
page vide !
Formation Webmasters- @dc 44
Avant de faire des exercices …
Interpréteur PHP
Serveur WEB (Apache)
HTDOCS
.php.html
SGBD MySQLSGBD MySQL
Réseau
xxx.in2p3.fr
yyy.in2p3.fr
Formation Webmasters- @dc 45
Exercice
• Tester « request.html » et « request.php » Vérifier la bonne exécution en POST et en GET (remarquer l’URL)
Comprendre la fonction « isset » qui teste si une variable a été définie En appelant directement le PHP En passant par le formulaire HTML
Faites la différence entre une variable non définie et une variable vide
<html><form name=xyz action=request.php method=post>Mail :<input name=mail></form></html>
<html><form name=xyz action=request.php method=post>Mail :<input name=mail></form></html>
<?if (isset($_REQUEST["mail"])){ $mail = $_REQUEST["mail"]; print ("<br>Adresse mail : $mail");}else{ print ("<p>mail non défini !");}?>
<?if (isset($_REQUEST["mail"])){ $mail = $_REQUEST["mail"]; print ("<br>Adresse mail : $mail");}else{ print ("<p>mail non défini !");}?>
request.htmlrequest.html request.phprequest.php
Formation Webmasters- @dc 46
A propos de cet exercice
• Imaginons que le champ « mail » soit obligatoire
• Qui devra s’assurer qu’il a bien été rempli ? Le poste client avec du JavaScript ?
Et si JS n’est pas activé ? Doit-on interdire l’accès au formulaire ?
Le serveur devra aussi effectuer des vérifications, dans le cas où l’on admet que JS soit désactivé.
Formation Webmasters- @dc 47
La page HTML avec un script « client »
<html><head><script> //javaScriptfunction verifMail(){ if (document.forms[0].mail.value.length < 6 || document.forms[0].mail.value.indexOf("@") < 0 || document.forms[0].mail.value.indexOf(".") < 0) { alert ("mail incorrect"); return false; }}</script></head><body><form name="xyz" action= "recevoirMail.php" method="post" onSubmit="return verifMail();" >Mail :<input name="mail"></form></body></html>
<html><head><script> //javaScriptfunction verifMail(){ if (document.forms[0].mail.value.length < 6 || document.forms[0].mail.value.indexOf("@") < 0 || document.forms[0].mail.value.indexOf(".") < 0) { alert ("mail incorrect"); return false; }}</script></head><body><form name="xyz" action= "recevoirMail.php" method="post" onSubmit="return verifMail();" >Mail :<input name="mail"></form></body></html>
lireMail.htmllireMail.html
Bloque l’appel au programme PHP en cas d’erreur
Formation Webmasters- @dc 48
Le script serveur PHP
<?if (isset($_REQUEST["mail"])){
$mail = $_REQUEST["mail"];if (strlen($mail) < 6 || ! strpos($mail,'@') || ! strpos($mail,'.') ){ print ("<font color=red><b>Mail incorrect !</b></font> "); print ("<a href=lireMail.html>recommencez</a>"); } else { print ("Adresse mail : $mail"); }
}else{print ("<h1>INTERDIT !");
}?>
<?if (isset($_REQUEST["mail"])){
$mail = $_REQUEST["mail"];if (strlen($mail) < 6 || ! strpos($mail,'@') || ! strpos($mail,'.') ){ print ("<font color=red><b>Mail incorrect !</b></font> "); print ("<a href=lireMail.html>recommencez</a>"); } else { print ("Adresse mail : $mail"); }
}else{print ("<h1>INTERDIT !");
}?>
recevoirMail.phprecevoirMail.php
Au fait ! Dans quel cas passe-t-on dans
cette branche ?
Au fait ! Dans quel cas passe-t-on dans
cette branche ?
Formation Webmasters- @dc 49
Conclusion
• Tester côté client est plus ergonomique Sanction immédiate, pas de nécessité de regénérer le formulaire, on peut
tester chaque saisie en temps réel (onBlur, onFocus)… mais impose que le client autorise JS
• Tester côté serveur marche à tous les coups Mais ne tester que côté serveur, oblige à régénérer le formulaire, à
conserver le contenu des champs qui étaient déjà remplis correctement…
• Tester des 2 côtés c’est parfait, mais c’est plus de travail !
Formation Webmasters- @dc 50
Le formulaire est-il toujours issu d’une page HTML statique ?
Non ! le formulaire est ici généré en PHP, les optionsde ce « select » sont issues d’une requête à unebase de données
Formation Webmasters- @dc 51
Un seul fichier !<HTML><HEAD><TITLE> tout en un </TITLE><script langage=javascript> mail = /^[a-zA-Z0-9]+[a-zA-Z0-9\.-_]+@(([a-zA-Z0-9\-])+\.)+([a-zA-Z0-9])+$/; function sMail(){ ok=mail.test(document.forms[0].elements[1].value) if (!ok){ alert ("adresse mail invalide !"); return false; } }</script></HEAD><BODY BGCOLOR="#e3e3e3"><?PHPif ( !isset($_REQUEST["mail"])){?> <form name=remarque action=remarque.php method=post onSubmit="return sMail();"> Votre commentaire :<br> <textarea name=texte></textarea><br> Votre e-mail ?<br> <input name=mail><input type=submit value="envoyer"> </form><?} else { print ("Merci de votre commentaire<br> "); print ("Nous vous répondrons à ".$_REQUEST["mail"]);}?></BODY></HTML>
<HTML><HEAD><TITLE> tout en un </TITLE><script langage=javascript> mail = /^[a-zA-Z0-9]+[a-zA-Z0-9\.-_]+@(([a-zA-Z0-9\-])+\.)+([a-zA-Z0-9])+$/; function sMail(){ ok=mail.test(document.forms[0].elements[1].value) if (!ok){ alert ("adresse mail invalide !"); return false; } }</script></HEAD><BODY BGCOLOR="#e3e3e3"><?PHPif ( !isset($_REQUEST["mail"])){?> <form name=remarque action=remarque.php method=post onSubmit="return sMail();"> Votre commentaire :<br> <textarea name=texte></textarea><br> Votre e-mail ?<br> <input name=mail><input type=submit value="envoyer"> </form><?} else { print ("Merci de votre commentaire<br> "); print ("Nous vous répondrons à ".$_REQUEST["mail"]);}?></BODY></HTML>
remarque.phpremarque.php
Remarquez l'allée venue entre le code PHP et HTML et le
conditionnement de ce dernierpar le if(…
Formation Webmasters- @dc 52
Code dans code
• Bien sûr, comme PHP génère du HTML, il peut aussi générer du JavaScript !
<?php... $erreur = fopen (... echo "<script language='JavaScript'>"; echo "alert($erreur)"; echo "</script>";...?>
<?php... $erreur = fopen (... echo "<script language='JavaScript'>"; echo "alert($erreur)"; echo "</script>";...?>
erreurJS.phperreurJS.php
Formation Webmasters- @dc 53
Pour apprendre PHP, programmons…
• L’envoi d’un mail
• L’accès à un serveur LDAP
• Ecrire et lire des fichiers sur le serveur
• Un transfert de fichiers entre le client et le serveur
Envoyer un mail depuisEnvoyer un mail depuisun programme PHPun programme PHP
Formation Webmasters- @dc 55
Générer un mail
<?$pour = "Daniel CHARNAY <[email protected]>";$sujet = "Ecole Web-Services";$enTete = "From : Bill Gates <[email protected]>\n";$enTete = $enTete."CC : [email protected]\n";$contenu = "Bonjour,\nJe voudrais suivre cette formation SVP\n "; $contenu = $contenu. "Cordialement,\nBill";mail($pour,$sujet,$contenu,$enTete);echo "Mail envoyé à $pour";?>
<?$pour = "Daniel CHARNAY <[email protected]>";$sujet = "Ecole Web-Services";$enTete = "From : Bill Gates <[email protected]>\n";$enTete = $enTete."CC : [email protected]\n";$contenu = "Bonjour,\nJe voudrais suivre cette formation SVP\n "; $contenu = $contenu. "Cordialement,\nBill";mail($pour,$sujet,$contenu,$enTete);echo "Mail envoyé à $pour";?>
http://webtest.in2p3.fr/mail.phphttp://webtest.in2p3.fr/mail.php
Utiliser les services LDAPUtiliser les services LDAP
Formation Webmasters- @dc 57
Se connecter à un serveur LDAP -1
<HTML><HEAD><TITLE> recherche Ldap (formulaire) </TITLE></HEAD><BODY BGCOLOR="#e3e3e3" onLoad="document.recherche_ldap.onCherche.focus();"><form name="recherche_ldap" action="ldap.php"> Entrer les premiers caractères du nom : <input name="onCherche" onBlur="if(this.value.length==0)alert('ca va etre long !')"> <input type="submit" value="chercher"></form></BODY></HTML>
<HTML><HEAD><TITLE> recherche Ldap (formulaire) </TITLE></HEAD><BODY BGCOLOR="#e3e3e3" onLoad="document.recherche_ldap.onCherche.focus();"><form name="recherche_ldap" action="ldap.php"> Entrer les premiers caractères du nom : <input name="onCherche" onBlur="if(this.value.length==0)alert('ca va etre long !')"> <input type="submit" value="chercher"></form></BODY></HTML>
chldap.htmlchldap.html
Pourquoi Pourquoi
Formation Webmasters- @dc 58
Se connecter à un serveur LDAP -2
<?define ("SERVEUR_LDAP","ldap.in2p3.fr");define ("SCHEMA_LDAP","o=in2p3, c=fr");$onCherche = $onCherche."*";$connexion = ldap_connect(SERVEUR_LDAP);if ($connexion){ $reponse=ldap_bind($connexion); if ($reponse){ $chercher=ldap_search($connexion,SCHEMA_LDAP,"sn=$onCherche"); $resultat=ldap_get_entries($connexion,$chercher); print($resultat["count"]." réponses<p>"); for ($i=0; $i<$resultat["count"]; $i++){ print($resultat[$i]["cn"][0]." - <i>".$resultat[$i]["mail"][0]."</i><br>"); } }} else exit ("Connexion impossible à ".SERVEUR_LDAP);?>
<?define ("SERVEUR_LDAP","ldap.in2p3.fr");define ("SCHEMA_LDAP","o=in2p3, c=fr");$onCherche = $onCherche."*";$connexion = ldap_connect(SERVEUR_LDAP);if ($connexion){ $reponse=ldap_bind($connexion); if ($reponse){ $chercher=ldap_search($connexion,SCHEMA_LDAP,"sn=$onCherche"); $resultat=ldap_get_entries($connexion,$chercher); print($resultat["count"]." réponses<p>"); for ($i=0; $i<$resultat["count"]; $i++){ print($resultat[$i]["cn"][0]." - <i>".$resultat[$i]["mail"][0]."</i><br>"); } }} else exit ("Connexion impossible à ".SERVEUR_LDAP);?>
Etablie la connexion
Identification (anonyme)
recherche
Pointeur sur les résultats
sn : surname$resultat [indice] [clé] [valeur n]sn : surname$resultat [indice] [clé] [valeur n]
Il existe une cinquantaine de fonctions permettant de travailler avec une base LDAP !
Il existe une cinquantaine de fonctions permettant de travailler avec une base LDAP !
ldap.phpldap.php
Et si on avait voulu sortir par ordre alphabétique ?
Et si on avait voulu sortir par ordre alphabétique ?
Envoyer des fichiers vers un serveurEnvoyer des fichiers vers un serveur
Formation Webmasters- @dc 60
« upload » d’un fichier
• On se propose de transférer un fichier situé sur le poste du client vers le serveur
• C’est exactement, appliqué au protocole HTTP, un document attaché à un mail (protocole SMTP)
• Exemples Transférer des photos numériques vers un centre de tirage
Transférer un article vers un site de conférences
Etc.
Formation Webmasters- @dc 61
La balise HTML <input type="file">
• Permet de « browser » le disque local pour sélectionner un fichier
• Permet « d’attacher » ce fichier à la suite des variables d’un formulaire, sous forme d’un message « multipart »
<HTML><HEAD><TITLE> transferer </TITLE></HEAD><BODY BGCOLOR="#e3e3e3"><form name="transferer" ENCTYPE="multipart/form-data" action="stocke.php" method="post"> <input name="monFichier" type="file"> <input type="submit" value="envoyer"></form></BODY></HTML>
<HTML><HEAD><TITLE> transferer </TITLE></HEAD><BODY BGCOLOR="#e3e3e3"><form name="transferer" ENCTYPE="multipart/form-data" action="stocke.php" method="post"> <input name="monFichier" type="file"> <input type="submit" value="envoyer"></form></BODY></HTML>
Le serveur doit récupérer le fichier à l’aide de ce programme
transférer.htmltransférer.html
Formation Webmasters- @dc 62
Sur le serveur…
• De même que l’on a utilisé $_REQUEST pour les données du formulaire …
• On va utiliser $_FILES pour récupérer dans ce tableau associatif Le nom original du fichier (nom sur le poste client)
Le nom temporaire (nom du fichier stocké dans un répertoire temporaire défini dans le php.ini)
La taille du fichier transféré
<?phpdefine ("WEB","http://localhost/CoursDebPHP/monDossier/");define ("HTDOCS","C:\\Program Files\\Apache Group\\Apache\\htdocs\\");//$dossier = HTDOCS."CoursDebPHP\\monDossier\\";//echo "Fichier original : ".$_FILES["monFichier"]["name"]."<br>";echo "Fichier temporaire : ".$_FILES["monFichier"]["tmp_name"]."<br>";echo "Taille du fichier : ".$_FILES["monFichier"]["size"]."octets";//copy ($_FILES["monFichier"]["tmp_name"],$dossier.$_FILES["monFichier"]["name"]);//echo "<p><a href=".WEB.$_FILES["monFichier"]["name"].">";echo "Voir le fichier transféré</a>";?>
<?phpdefine ("WEB","http://localhost/CoursDebPHP/monDossier/");define ("HTDOCS","C:\\Program Files\\Apache Group\\Apache\\htdocs\\");//$dossier = HTDOCS."CoursDebPHP\\monDossier\\";//echo "Fichier original : ".$_FILES["monFichier"]["name"]."<br>";echo "Fichier temporaire : ".$_FILES["monFichier"]["tmp_name"]."<br>";echo "Taille du fichier : ".$_FILES["monFichier"]["size"]."octets";//copy ($_FILES["monFichier"]["tmp_name"],$dossier.$_FILES["monFichier"]["name"]);//echo "<p><a href=".WEB.$_FILES["monFichier"]["name"].">";echo "Voir le fichier transféré</a>";?>
stocke.phpstocke.php
il n’y a ~ rien à faire !
Formation Webmasters- @dc 63
Exercice
• Télécharger un texte et stocker le serveur
• Proposer l’affichage de ce texte dans une page HTML en faisant surbriller toutes les zones de texte correspondant à un motif choisi par l’utilisateur
• Cet exercice permettra de manipuler des fonctions manipulant des fichiers
• Cet exercice permettra de poser le problème des sessions
Formation Webmasters- @dc 64
Correction -1
<html><head><style type="text/css">.sur {background-color : Yellow}</style></head><body bgcolor=#e3e3e3><form name=chMotif action=surbrille.php>motif à rechercher : <input name="motif"><input type="submit" value="chercher"><input type="hidden" name="leFichier"></form><hr><?phpdefine ("WEB","http://localhost/CoursDebPHP/monDossier/");define ("HTDOCS","C:\\Program Files\\Apache Group\\Apache\\htdocs\\");$dossier = HTDOCS."CoursDebPHP\\monDossier\\";
<html><head><style type="text/css">.sur {background-color : Yellow}</style></head><body bgcolor=#e3e3e3><form name=chMotif action=surbrille.php>motif à rechercher : <input name="motif"><input type="submit" value="chercher"><input type="hidden" name="leFichier"></form><hr><?phpdefine ("WEB","http://localhost/CoursDebPHP/monDossier/");define ("HTDOCS","C:\\Program Files\\Apache Group\\Apache\\htdocs\\");$dossier = HTDOCS."CoursDebPHP\\monDossier\\";
surbrille.php surbrille.php
Formation Webmasters- @dc 65
Correction -2
//Premier passage on vient du formulaire d’upload//if (isset($_FILES["monFichier"]["tmp_name"])){ $fichier = $dossier.$_FILES["monFichier"]["name"]; copy ($_FILES["monFichier"]["tmp_name"],$fichier); $fichier_2 = ereg_replace("\\\\","\\\\",$fichier); print("<script>document.chMotif.leFichier.value='$fichier_2';</script>"); $fd = fopen ($fichier,"r"); while (!feof ($fd)) { $ligne = fgets($fd, 256); echo $ligne."<br>"; } fclose ($fd);} else {
//Premier passage on vient du formulaire d’upload//if (isset($_FILES["monFichier"]["tmp_name"])){ $fichier = $dossier.$_FILES["monFichier"]["name"]; copy ($_FILES["monFichier"]["tmp_name"],$fichier); $fichier_2 = ereg_replace("\\\\","\\\\",$fichier); print("<script>document.chMotif.leFichier.value='$fichier_2';</script>"); $fd = fopen ($fichier,"r"); while (!feof ($fd)) { $ligne = fgets($fd, 256); echo $ligne."<br>"; } fclose ($fd);} else {
surbrille.php (suite) surbrille.php (suite)
Formation Webmasters- @dc 66
Correction -3
// Passage suivant on vient du formulair de saisie du motif//$fichier = $_REQUEST["leFichier"]; $fichier = ereg_replace("\\\\\\\\","\\",$fichier); $fd = fopen ($fichier,"r"); while (!feof ($fd)) { $ligne = fgets($fd, 256); $motif = $_REQUEST["motif"]; $ligne = ereg_replace($motif,"<span class='sur'>$motif</span>",$ligne); echo $ligne."<br>"; } fclose ($fd); $fichier_2 = ereg_replace("\\\\","\\\\",$fichier); print("<script>document.chMotif.leFichier.value='$fichier_2';</script>");
}?><hr><body></html>
// Passage suivant on vient du formulair de saisie du motif//$fichier = $_REQUEST["leFichier"]; $fichier = ereg_replace("\\\\\\\\","\\",$fichier); $fd = fopen ($fichier,"r"); while (!feof ($fd)) { $ligne = fgets($fd, 256); $motif = $_REQUEST["motif"]; $ligne = ereg_replace($motif,"<span class='sur'>$motif</span>",$ligne); echo $ligne."<br>"; } fclose ($fd); $fichier_2 = ereg_replace("\\\\","\\\\",$fichier); print("<script>document.chMotif.leFichier.value='$fichier_2';</script>");
}?><hr><body></html>
surbrille.php (suite et fin) surbrille.php (suite et fin)
Sessions et transactionsSessions et transactions
Formation Webmasters- @dc 68
Les transactions sur le Web
• Le problème Vous vous connectez sur le serveur de votre banque avec nom et mot de
passe
Vous circulez dans plusieurs pages (relevé de compte, virement, etc.)
Entre chaque page vous êtes deconnecté : c'est la nature du Web !
Or, vous ne redonnez pas votre nom et mot de passe à chaque page …
… comment ça marche ?
Formation Webmasters- @dc 69
Le mécanisme de sessions
• Le mode « déconnecté » du Web impose, si on veut implémenter la persistance d'informations entre les différentes pages, d'utiliser des mécanismes particuliers Retransmettre les données nécessaires, de formulaire en formulaire,
grâce à des champs cachés (<input type=hidden …)
Utiliser un mécanisme de session, autorisant de stocker sur le serveur des données temporaires
Dans ce cas, de page en page, on ne transmet qu'un identifiant, celui-ci étant géré automatiquement par le système
On peut aussi éventuellement utiliser un cookie pour s'identifier
Formation Webmasters- @dc 70
Construire une session
• On appelle la fonction session_start()
• On demande la conservation de variables au travers d’un tableau
associatif http_session_vars["ma_variable"]
• C'est tout ! (ou presque…)
<?phpsession_start();//verification dans la base //login et pwd sont valides...$HTTP_SESSION_VARS["utilisateur"]=$_REQUEST["login"];$HTTP_SESSION_VARS["pass_phrase"]=$_REQUEST["pwd"];....<form ... action="deux.php" ...
<?phpsession_start();//verification dans la base //login et pwd sont valides...$HTTP_SESSION_VARS["utilisateur"]=$_REQUEST["login"];$HTTP_SESSION_VARS["pass_phrase"]=$_REQUEST["pwd"];....<form ... action="deux.php" ...
un.php un.php <html>...<form ... action="un.php">Votre nom :<input name="login">Votre mot de passe : <input type=password name="pwd">...
<html>...<form ... action="un.php">Votre nom :<input name="login">Votre mot de passe : <input type=password name="pwd">...
test.htmltest.html
deux.php deux.php
Formation Webmasters- @dc 71
Détaillons …
<html><body bgcolor="#e3e3e3"><form name="tst" action="un.php" method="post">Votre code : <input name="login">Votre mot de passe : <input type="password" name="pwd"><input type="submit" value="me connecter"></form></body></html>
<html><body bgcolor="#e3e3e3"><form name="tst" action="un.php" method="post">Votre code : <input name="login">Votre mot de passe : <input type="password" name="pwd"><input type="submit" value="me connecter"></form></body></html>
<?session_start();$HTTP_SESSION_VARS["utilisateur"]=$_REQUEST["login"];$HTTP_SESSION_VARS["pass_phrase"]=$_REQUEST["pwd"];?><body bgcolor="#e3e3e3"><form name="tst2" action="deux.php" method="get"> entrer votre texte :<br> <textarea name="remarque"></textarea> <input type="submit" value="entrer"> </form></body></html>
<?session_start();$HTTP_SESSION_VARS["utilisateur"]=$_REQUEST["login"];$HTTP_SESSION_VARS["pass_phrase"]=$_REQUEST["pwd"];?><body bgcolor="#e3e3e3"><form name="tst2" action="deux.php" method="get"> entrer votre texte :<br> <textarea name="remarque"></textarea> <input type="submit" value="entrer"> </form></body></html>
un.php un.php
session.htmlsession.htmlutilisateur|s:4:"Emile";pass_phrase|s:6:"tagada";utilisateur|s:4:"Emile";pass_phrase|s:6:"tagada";
C:\temp\sess_ebd66a6730f0c63670f686a1fc69f1c1C:\temp\sess_ebd66a6730f0c63670f686a1fc69f1c1
écritureécriture
<INPUT TYPE="HIDDEN" NAME=PHPSESSID VALUE=ebd66… Introduit automatiquementIntroduit automatiquement
<?session_start();print ("Bonjour ".$HTTP_SESSION_VARS["utilisateur"]);print (" Votre mot de passe est : ".$HTTP_SESSION_VARS["pass_phrase"]);print (" merci pour votre remarque : ".$_REQUEST["remarque"]);session_destroy();?>
<?session_start();print ("Bonjour ".$HTTP_SESSION_VARS["utilisateur"]);print (" Votre mot de passe est : ".$HTTP_SESSION_VARS["pass_phrase"]);print (" merci pour votre remarque : ".$_REQUEST["remarque"]);session_destroy();?>
deux.php deux.php
Lecture :on utilise le PHPSESSID pour ouvrir le bon fichier
Formation Webmasters- @dc 72
Attention !
• A ne jamais mettre quelque chose avant l'instruction session_start ! Parce que php écrit un header http pour glisser, entre-autre, sa variable
cachée
• La sanction serait un warning, éventuellement un fonctionnement anormal du code
Formation Webmasters- @dc 73
Exercices
1. Faire un système qui compte combien de fois VOUS accédez à une page et non combien de fois cette page est accédée !
2. Imaginer le compteur classique qui compte le nombre d'accès à une page
3. Imaginez comment limiter le temps de stationnement sur une page
Formation Webmasters- @dc 74
Correction : compter les accés
<?phpsession_start();if (!isset($HTTP_SESSION_VARS['compteur'])) $HTTP_SESSION_VARS['compteur']=1;else $HTTP_SESSION_VARS['compteur']++;?>Vous êtes venu <font size="6" color ="red"><? echo $HTTP_SESSION_VARS['compteur'] ?></font> fois<form action=comptons.php><input type=submit value="continuer"></form>
<?phpsession_start();if (!isset($HTTP_SESSION_VARS['compteur'])) $HTTP_SESSION_VARS['compteur']=1;else $HTTP_SESSION_VARS['compteur']++;?>Vous êtes venu <font size="6" color ="red"><? echo $HTTP_SESSION_VARS['compteur'] ?></font> fois<form action=comptons.php><input type=submit value="continuer"></form>
comptons.php comptons.php
Formation Webmasters- @dc 75
Le stationnement limité ou la déconnexion automatique d'une application
• Définir une constante de temps maximum : MAXI_INACTIF
• Ouvrir la session, prendre le temps d'arrivée : time()et le stocker en variable de session : $HTTP_SESSION_VARS['temps']
• Lorsque l'on change de page dans l'application, la nouvelle page effectue :
if (time()- $HTTP_SESSION_VARS['temps']> MAXI_INACTIF
on sort en temps dépassé
Else
on stocke le nouveau temps et on continue
Formation Webmasters- @dc 76
Correction :
<?phpdefine ("MAX_INACTIF",10);session_start();if (!isset($HTTP_SESSION_VARS['compteur'])){ $HTTP_SESSION_VARS['compteur']=1; $HTTP_SESSION_VARS['temps']=time();}else{ if ((time()-$HTTP_SESSION_VARS['temps'])>MAX_INACTIF){ session_destroy(); die("Temps dépassé !"); } $HTTP_SESSION_VARS['compteur']++; $HTTP_SESSION_VARS['temps']=time();}?>Vous êtes venu <font size="6" color ="red"><? echo $HTTP_SESSION_VARS['compteur'] ?></font> fois<form action=limite.php><input type=submit value="continuer"> avant 10 secondes</form>
<?phpdefine ("MAX_INACTIF",10);session_start();if (!isset($HTTP_SESSION_VARS['compteur'])){ $HTTP_SESSION_VARS['compteur']=1; $HTTP_SESSION_VARS['temps']=time();}else{ if ((time()-$HTTP_SESSION_VARS['temps'])>MAX_INACTIF){ session_destroy(); die("Temps dépassé !"); } $HTTP_SESSION_VARS['compteur']++; $HTTP_SESSION_VARS['temps']=time();}?>Vous êtes venu <font size="6" color ="red"><? echo $HTTP_SESSION_VARS['compteur'] ?></font> fois<form action=limite.php><input type=submit value="continuer"> avant 10 secondes</form>
limite.php limite.php
Formation Webmasters- @dc 77
Pour les ouvrages allez chez www.amazone.fr , tapez PHP ou JavaScript ou HTML ou MySQL comme mot clé,listez les résultats par meilleures ventes : choisissez !
URL's et ouvrages www.php.net (en) dev.nexen.net (en) www.zend.net (en) www.phpfrance.com (fr) www.ilovephp.com (fr)
ou chez Eyrolles ..
.
ou chez Eyrolles ..
.