formulaires, cgi et php david gross-amblard (cnam-vertigo/cédric) dgram@cnam.fr transparents...

Post on 04-Apr-2015

103 Views

Category:

Documents

0 Downloads

Preview:

Click to see full reader

TRANSCRIPT

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 !

top related