Post on 04-Apr-2015
Formulaires, CGI et PHP
David Gross-Amblard(CNAM-Vertigo/Cédric)dgram@cnam.fr
Transparents originaux : Philippe Rigaux
Projet 3I 31.10.2001
Plan
Le langage PHP principe syntaxe
Applications de PHP formulaires HTML, interaction avec Php Production automatique de documents
HTML (Gestion de sessions : les cookies en Php)
Informations
www.php.net : la référencewww.easyphp.org : un paquetage
complet sous windowsDe très nombreux scripts sur le
web : forums, agenda, jeux, … prêt-à-servir.
Le langage PHP
PHP, qu'est-ce que c'est ?
Un langage pour la programmation du serveur
Permet d'inclure des parties programmées dans du HTML
Très proche du langage CTrès riche en fonctions, notamment
pour l'accès aux bases de données
Petit exemple PHP : toto.php
<HTML><HEAD><TITLE>Bonjour</TITLE></HEAD><BODY>
<H1>Quelle heure est-il ?</H1>
<P>Il est exactement <?php echo date(“h:i:s”); ?></P>
</BODY></HTML>
Comment ça marche
NavigateurProgramme serveur
InterprêteurPHP
Exécution des instructionsPHP
machine serveur
Requête HTTP : toto.php
DocumentHTML Fichier
toto.phpHTML/PHP
Ce que renvoit le serveur
<HTML>
<HEAD><TITLE>Bonjour</TITLE></HEAD>
<BODY>
<H1>Quelle heure est-il ?</H1>
<P>Il est exactement 19:38:5
</P>
</BODY>
</HTML>
Le navigateur ne voit que du HTML !
Syntaxe de PHP
Commentaires /* ... */ ou //... ou # ...
Variables Un '$', puis (au moins) une lettre, puis tout
ce qu'on veut. Attention : distinction
minuscules/majusculesConstantes
define (PI, 3.14116)
Déclaration de variables, types
Pas de déclaration de variable en PHP ! L'apparition d'un nouveau symbole préfixé
par '$' entraîne la création d'une variableEx : $maVariable = 1;
La valeur initiale est '''' ou 0 selon le contexteLe typage est dynamique
Une même variable peut être utilisée pour stocker plusieurs types de données
Des conversions sont appliquées quand c'est nécessaire.
Types scalaires
Les entiers$i = 1;
Les flottants$i = 1.12;
Les chaînes de caractère$i = "Je suis une chaîne";
Booléen$i = true;
NB: 0 <=> false, tout le reste vaut true.
A propos des chaînes de caractères
Apostrophes simples : mise en page quelconque.
$c = 'Je suis une chaînede caractères';
Apostrophes doubles : possibilité d'inclure des variables
$nom = "Phileas Fogg";$c = "Je m'appelle $nom";
Production de HTML
On écrit avec echo ou printfDes chaînes et/ou des variablesEn utilisant la concaténation, '.'$nom = "Fogg";$nb = 3;echo "Je m'appelle $nom" . "et je prends le métro " . $nb . " fois par jour";
Tableaux
Tableaux indicés : liste de valeurs indicées par 0, 1, 2, ...
$tab[0] = 1; $tab[1] = "une chaîne";
Tableaux associatifs : liste de valeurs référencées par des clés$MES["Vertigo"]="Hitchcock";$MES ["Gladiator"]="Scott";
Initialisation d'un tableau
Avec array : Indicé:
$tab = array("e1","el2",120); Associatif:
$mes=array("Vertigo"=>"Hitchcock", "Gladiator" => "Scott");
Implicitement (utile pour les formulaires) $tab[] = "el1"; $tab[] = "el2"; $tab[] = 120;
Parcours d'un tableau
Tableau indicé : en incrémentant l'indice for ($i=0; $i < count($tab); $i++)
echo "Element $i =" . $tab[$i];
Tableau associatif : avec des fonctions Un curseur sur le tableau est déplacé avec next
ou prev Les fonctions key et current renvoient les
données du curseur. do{ echo "Clé : “.key($mes).” élément :”.current($mes); } while (next($mes));
Expressions
Expression = tout ce qui a une valeur. En PHP, comme en C, presques toutes les
instructions ont une valeur.10;$i = 10;$i;
L'affectation a elle-même une valeur, donc on peut écrire$j = $i = 10;
Opérateurs
Opérateurs arithmétiques: +, -, *, / $i = 20; $i = ($i + 2) * 34;
Comparaisons : ==, <, >, <=, >= $i == 20; $j == $j - 1;
Opérateurs logiques: && (and) || (or) ! (not) ($i == 20 && $j = j-1)
Concaténation de chaînes $c1 = "Phileas"; $c2 = "Fogg"; $nom = $c1 . " " . $c2;
Facilités syntaxiques
Expressions équivalentes : $i = $i + 20; $i += $20; Valable pour tous les opérateurs $nom = "Phileas "; $nom .= "Fogg";
Incrémentations Au lieu de $i=$i+1, on écrit $i++ ou ++$i; Valeur de l'expression ?
Structures de contrôle : tests
if (expression){ // bloc si expression != 0}else{
// bloc si expression = 0}
Rappel: expression = tout ce qui produit une valeur !
Les if-then-else peuvent s'imbriquer.
Structures de contrôle : switch switch (expression){ case val1: // bloc si expression==val1 break; case val2: // bloc si expression==val1 break; ... default: // tout a échoué break; }
Boucles : do et while
while (expression){ // bloc tant que expression!=0}
A un moment donné, expression doit devenir 0 !
do{ // bloc tant que expression!=0} while (expression)
NB : le bloc s'exécute au moins une fois
Boucles : for
$i = 0;while ($i < 5){ // bloc $i++;}
Peut être remplacé par :for ($i=0; $i<5; $i++) {bloc};NB : on peut faire des choses très
compliquées.
Instructions break et continue
L'instruction break permet de sortir du corps d'une boucle.
L'instruction continue force le passage à l'itération suivante.
$i = 0;while (1){ if (++$i == 5) break; if ($i == 3) continue; // instructions}
Fonctions: passage des arguments
function Addition ($i, $j){ // NB :$i et $j sont des variables locales $somme = $i + $j; $i = 2; $j = 3; return $somme;} $i = 1; $j = 1; // Appel de la fonction, passage par valeur $k = Addition ($i, $j); // $i et $j valent toujours 1 !
Fonctions: passage par adresse
$i = 1; $j = 1;
// Appel de la fonction, passage par valeur $k = Addition (&$i, &$j);
// $i et $j valent 2 et 3 !
En préfixant par '&', on passe une variable par adresse.
Introduit un effet de bord si la fonction modifie ses arguments : très mauvais
Passage par adresse avec déclaration
function Addition ($i, $j, &$somme){ $somme = $i + $j; $i = 2; $j = 3;} $i = 1; $j = 1;
// Appel de la fonction, passage par adresse de $k Addition ($i, $j, $k);// $i et $j valent toujours 1, $k vaut 2
Valeurs par défaut
Il est possible de donner une valeur par défaut aux arguments: très pratique function Connexion ($nom=”gross", $passe="mdp", $serveur="cortes"){ // instructions }...
// Connexion à cortes Connexion ();
// Connexion de Amman à cortes Connexion ("amann","mdp2");
// Connexion à cartierConnexion ("gross","mdp","cartier")
Fonctions et variables : conseil du jour
Bon principe : une fonction n'accède pas aux variables du programme appelant, et réciproquement Variables automatiques : apparaissent et
disparaissent avec la fonction => très bon Variables statiques : locales à la fonction,
mais persistantes entre deux appels => bon Variables globales : visibles partout =>
TRES MAUVAIS.=> Se limiter aux variables
automatiques
Application : formulaires HTML
Formulaires HTML: <FORM>
Un conteneur pour les champs de saisie: ACTION est l'URL du script ou du
programme à déclencher (en principae, sur le serveur)
METHOD est GET ou POST (meilleur)
Exemple : un formulaire HTML (démo)
<FORM ACTION='http://cortes.cnam.fr:8080/action.php' METHOD=GET>
Paramètres pour la recherche de films :<P>
Titre : <INPUT TYPE=TEXT SIZE=20 NAME = 'titre'> <P>
Année début : <INPUT TYPE=TEXT SIZE=4 NAME='anMin' VALUE=1900>
Année fin : <INPUT TYPE=TEXT SIZE=4 NAME='anMax' VALUE=2100> <P>
<INPUT TYPE=SUBMIT VALUE='Rechercher'>
</FORM></BODY></HTML>
Transmission
Chaque champ a un nomGET : les données sont transmises
dans l ’URLhttp://cortes.cnam.fr:8080/
action.php?titre=alien&
anMin=1950&anMax=2001
POST : transmission dans le protocole HTTP (invisible sur l ’URL)
Champs de formulaire : <INPUT>
Très général: saisie de texte, ou choix dans des listes. L'attribut TYPE vaut: TEXT pour les chaînes de caractères HIDDEN pour les champs cachés CHECKBOX pour un choix multiple RADIOBOX pour un choix exclusif SUBMIT pour déclencher l'action FILE pour transmettre un fichier
Champs <SELECT>
Permet de choisir une ou plusieurs valeurs dans une liste
<SELECT NAME='realisateur' SIZE=3> <OPTION VALUE=1>Alfred Hitchcock <OPTION VALUE=2 SELECTED>Maurice Pialat <OPTION VALUE=3>Quentin Tarantino</SELECT>
L'option MULTIPLE permet de sélectionner plusieurs valeurs
Champ <TEXTAREA>
Pour entrer du texte libre: <TEXTAREA NAME='resume' COLS=30 ROWS=3> Résumé du film </TEXTAREA>
L'attribut MAXLENGTH indique la longueur maximale du text.
Un formulaire complet (démo)
<FORM ACTION="http://cortes.cnam.fr:8080/ExPHP1.php" METHOD=POST >
<INPUT TYPE="HIDDEN" NAME="monNom" VALUE="ExFormFilm">
Titre : <INPUT TYPE=TEXT SIZE=20 NAME="titre">Année : <INPUT TYPE=TEXT SIZE=4 MAXLENGTH=4 NAME="annee"><P> Comédie : <INPUT TYPE=CHECKBOX NAME='genre' VALUE='C'>Drame : <INPUT TYPE=CHECKBOX NAME='genre' VALUE='D'>Histoire : <INPUT TYPE=CHECKBOX NAME='genre' VALUE='H'>Suspense : <INPUT TYPE=CHECKBOX NAME='genre' VALUE='S'><P>France : <INPUT TYPE=RADIO NAME='pays' VALUE='FR' CHECKED>Etats-Unis : <INPUT TYPE=RADIO NAME='pays' VALUE='US'>Allemagne : <INPUT TYPE=RADIO NAME='pays' VALUE='DE'>Japon : <INPUT TYPE=RADIO NAME='pays' VALUE='JP'><P>Affiche du film : <INPUT TYPE=FILE SIZE=20 NAME='affiche'>
Un formulaire complet (suite)
Metteur-en-scène : <SELECT NAME='realisateur' SIZE=3> <OPTION VALUE=1>Alfred Hitchcock <OPTION VALUE=2>Maurice Pialat <OPTION VALUE=3 SELECTED>Quentin Tarantino <OPTION VALUE=4>Akira Kurosawa <OPTION VALUE=5>John Woo <OPTION VALUE=6>Tim Burton </SELECT><P>Résumé:<TEXTAREA NAME='resume' COLS=30 ROWS=3>Résumé </TEXTAREA>
<H1>Votre choix</H1><INPUT TYPE=SUBMIT VALUE='Valider'><INPUT TYPE=RESET VALUE='Annuler'></FORM>
Traitement des données en PHP
On récupère, sous forme de variable PHP, les champs d'un formulaire Pour les valeurs scalaires -> un variable Pour les fichiers -> un nom de fichier
temporaire
Que se passe-t-il quand on valide ?
Le programme client transmet au programme serveur les infos sous la forme:titre=t&annee=a...
Pour le script PHP, cela donne: $titre = t;$annee=a;
Et on peut maintenant utiliser ces données pour fabriquer une page HTML<?php if ($année<1920) echo “Desole, on a pas.”; ?>
Passage de valeurs multiples (démo)
<FORM ACTION="http://cartier/ITCE/EXEMPLES/ExPHP2.php" METHOD=POST">Titre : <INPUT TYPE=TEXT SIZE=20 NAME="titre"> <TABLE><TR><TH>Prénom</TH><TH>Nom</TH></TR> <TR><TD><INPUT TYPE=TEXT SIZE=30 NAME="prenom[]"> <TD><INPUT TYPE=TEXT SIZE=30 NAME="nom[]">
<TR><TD><INPUT TYPE=TEXT SIZE=30 NAME="prenom[]"> <TD><INPUT TYPE=TEXT SIZE=30 NAME="nom[]">
<TR><TD><INPUT TYPE=TEXT SIZE=30 NAME="prenom[]"> <TD><INPUT TYPE=TEXT SIZE=30 NAME="nom[]"> </TABLE>
<H1>Votre choix</H1> <INPUT TYPE=SUBMIT VALUE='Valider'> <INPUT TYPE=RESET VALUE='Annuler'></FORM>
Que se passe-t-il quand on valide ?
Le programme client transmet au programme serveur les infos sous la forme:titre=t&prenom[]=p1&nom[]=n1&prenom[]=p2&nom[]=n2&...
Pour le script PHP, cela donne: $titre = t;$prenom[] = p1,$nom[] = n1;$prenom[] = p2,$nom[] = n2;...
=> on crée deux tableaux PHP !
Ce que fait le script
<?php echo "Pour le film $titre j'ai re₤u les acteurs suivants :<P>\n"; $nbActeurs = count($prenom); for ($i=0; $i < $nbActeurs; $i++) echo "<B> $prenom[$i] $nom[$i]<B><BR>\n";?>
� Une boucle sur les tableaux permet de récupérer les valeurs.
� -> A utiliser aussi pour les champs SELECT multiples.
Transmission de fichiers
<FORM ACTION="http://cartier/ITCE/EXEMPLES/ExPHP3.php" METHOD=POST" ENCTYPE= "multipart/form-data">
<INPUT TYPE="hidden" name="MAX_FILE_SIZE" value="100000">Titre : <INPUT TYPE=TEXT SIZE=20 NAME="titre">
<P> Affiche : <INPUT TYPE=FILE SIZE=20 NAME='affiche'> <H1>Votre choix</H1> <INPUT TYPE=SUBMIT VALUE='Valider'> <INPUT TYPE=RESET VALUE='Annuler'>
</FORM>
Transmission de fichiers
Le fichier est transmis sur le serveur avec quelques variables qui le décrivent:
<?php echo "Pour le film $titre j'ai recu le fichier suivant :<P>\n"; echo "<B>Nom du fichier client :<B>$affiche_name<BR>\n"; echo "<B>Nom du fichier sur le serveur :<B>$affiche<BR>\n"; echo "<B>Taille du fichier :<B>$affiche_size<BR>\n"; echo "<B>Type du fichier :<B>$affiche_type<BR>\n";
// Copie du fichier temporaire copy($affiche, "./MonAffiche"); ?>
Autres variables utiles
Infos. sur le client : $REMOTE_HOST : nom de la machine client $REMOTE_ADDR : adresse IP de la machine
client $REMOTE_USER : nom du client après
identification $HTTP_ACCEPT : liste des types MIME
acceptés par le client $HTTP_USER_AGENT : nom du navigateur
Application : production de code HTML
Intégration avec HTML
Question : vaut-il mieux mettre du PHP dans du HTML ou l'inverse ? Pour HTML : on génère le site avec un
bon éditeur, et on met un peu de PHP dedansMais ... le code est ILLISIBLE
Pour PHP : on programme des utilitaires pour produire du HTMLLe code est lisible ... pour les informaticiens.
Fonctions produisant du code
// Fonctions produisant des conteneurs HTML function Ancre ($url, $libelle, $classe="") { return "<A HREF='$url' CLASS='$classe'>$libelle</A>\n"; }
function Image ($fichier, $largeur=-1, $hauteur=-1, $bordure=0) { if ($largeur != -1) $attrLargeur = " WIDTH = '$largeur %' "; if ($hauteur != -1) $attrHauteur = " HEIGHT = '$hauteur %' ";
return "<IMG SRC='$fichier'" . $attrLargeur . $attrHauteur . " BORDER='$bordure'>\n"; }
Exemple
Faire un lien sur une image :<?php
echo Ancre(‘http://www.truc.org/maison.html’, Image(‘ maison.gif ’));
?>
Produit :<A HREF=’http://www.truc.org/maison.html’ CLASS=‘’>
<IMG SRC=‘ maison.gif ’ BORDER=0>
</A>
Création de module
Un module = un ensemble de fonctions prenant en charge une partie de l'application
Exemple: module de production de tableaux: TblDebut -> produit la balise <TABLE> TblFin -> produit la balise </TABLE> TblLigne, TblCellule -> pour écrire la table
Module Table : fonction TblDebut
function TblDebut ($pBordure = '1', // La bordure $pLargeur = '', $pEspCell = '2', // CELLSPACING $pRemplCell = '4', // CELLPADDING $classe = "") { echo "<TABLE BORDER='$pBordure' " . "CELLSPACING='$pEspCell' " . "CELLPADDING='$pRemplCell' WIDTH='$pLargeur' " . "CLASS ='$classe'>\n"; } // Fin de la fonction
Lignes et cellules
function TblDebutLigne ($classe="") { echo "<TR CLASS='$classe'>\n"; }
function TblCellule ($contenu, $nbLig=1, $nbCol=1, $classe="") { echo "<TD ROWSPAN='$nbLig' " . "COLSPAN='$nbCol' CLASS='$classe'>" . "$contenu</TD>\n"; }
Fonction affichant un en-tête : module Design.php
require ("Table.php"); require ("HTML.php"); function Entete ($titre, $texte, $menu, $style) { echo "<HTML><HEAD><TITLE>$titre</TITLE>\n"; echo "<LINK REL=\"stylesheet\" HREF=\"$style\" TYPE=\"text/css\">\n"; echo "</HEAD><BODY>\n";
TblDebut (0, 100); TblDebutLigne (); TblCellule (Image ('/icons/cnam60.gif')); TblCellule ("<CENTER><FONT>$texte</FONT></CENTER>", 1, 1, "TITRE"); TblFinLigne(); TblFin ();
TblDebut (0, 100); TblDebutLigne (); while ( list ($libelle, $ancre) = each ($menu)) TblCellule (Ancre ($ancre, $libelle, "MENU")); TblFin(); TblFin(); }
Au début de chaque page ...
<?php require("Design.php"); $titre = "Commerce Electronique"; $menu = array ("Accueil" => "index.php", "Documentation" => "Documentation.php", "Cours" => "Cours.php", "Travaux dirigés" => "TD.php", "Forum" => "Forum.php", "Liens" => "Liens.php"); $style = "/CSS/uv.css";
Entete ($titre, "Commerce électronique", $menu, $style);?>Bienvenue sur le site de l'U.V. "Commerce électronique" !
Et la programmation objet ? Notion de classes en Php Rassembler en un objet “formulaire”
toutes les informations necessairesDe nombreux exemples sur le site
http://cartier.cnam.fr:8080
Les cookies
Le serveur demande au navigateur de stocker une variable ayant un nom et une valeur, pour une durée déterminée. MonServeur dit à MonNavi : « stocke la
variable 'MaVariable' avec la valeur '100' pendant 2 jours »
Le navigateur transmet ensuite systématiquement la variable au serveur qui l'a créée MonNavi transmet à MonServeur la
variable sous la forme MaVariable=100
Cookies et sessions web
Les cookies sont essentiels pour établir une continuité dans le dialogue client/serveur Quand un client se connecte la première fois: le
serveur lui associe un identifiant de session Le serveur transmet cet identifiant au client
sous la forme d'un cookie On conserve un historique des actions du client,
associé à l'identifiant de session Quand le client se connecte à nouveau: on sait
l'identifier grace au cookie.
Gestion de session avec cookie
Client
Serveur
Premièreconnexion
Création d'une session
Infos.session
id=100Création du cookie
Envoi du cookie
id=100
On sait dequi il s'agit
Envoi du cookie
Client
Client
Validité
Fonctions Php pour sessions
session_start() : identifie ou crée la session si existe déjà, recrée toutes les variables
Php associées doit être appelé au début du script Php
session_destroy() détruit les information associée à la
session
Fonctions Php pour sessions
session_id() renvoie l ’identifiant de la session
session_register(nomVar) associe une variable Php à la session -> cette variable sera retrouvée à
chaque session
Fonctions Php pour sessions
session_unregister(nomVar) : supprime une variable de la session
session_is_registered(nomVar) test l ’existence d ’une variable
Exemple (1/2) : doc.php
<?phpSession_start();
$derniereVisite=date(‘h:i:s’);
session_register(toto);
?>
Une visite de cette page ->mémorisation de $toto dans le navigateur
Exemple (2/2) : truc.php
<?php
session_start();
if (session_is_registered(toto))
echo ‘ ha ha ! Vous avez visite la page doc.php le $toto ’;
else
echo ‘ premiere visite ’;
?>
Conclusion
PHP : langage puissant, très bien intégré à HTML de très nombreuses fonctions gratuit
Permet : la gestion des formulaires la gestion des utilisateurs du site (session) et prochainement…bases de données !