Voir un ancien billet sur le sujet, présentant un site jouet utilisant une base de données mysql simple.
Le billet a été mis à jour pour refléter les modifications apportées pendant le cours sur la page d’accueil (découpage en fonctions).
Voir un ancien billet sur le sujet, présentant un site jouet utilisant une base de données mysql simple.
Le billet a été mis à jour pour refléter les modifications apportées pendant le cours sur la page d’accueil (découpage en fonctions).
Vendredi 9 mars 2012
Amphi 2A (Attention : ce n’est pas l’amphi habituel du cours)
2 sessions de 20 min chacune, convocation selon la première lettre du nom de famille :
- de A à I : 14h30
- de J à Z : 15h
Seuls documents autorisés : une feuille A4 recto-verso, contenu libre.
Ni téléphone, ni ordinateur.
[Mise à jour du 8 mars : changement d'amphi]
Cas d’école : un exemple d’injection de code css par transmission de formulaire. Continuer la lecture
Voir la section correspondante
dans le manuel.
Les expressions ont un type, les variables pas toujours (« Le type d’une variable n’est pas toujours défini par le programmeur ; il peut être défini par PHP au moment de l’exécution, suivant le contexte dans lequel la variable est utilisée », nous dit le manuel).
Nombreuses conversions implicites (c’est à dire qu’on n’a pas toujours conscience que l’interpréteur change le type des expressions quand on les manipule).
True
, False
)<?php
function test_bool($b)
{
echo "$b -> ";
if($b)
echo 'vrai';
else
echo 'faux';
echo "\n";
}
test_bool(True);
test_bool(False);
test_bool(0);
test_bool(00);
test_bool(1);
test_bool('');
test_bool('0');
test_bool('00');
test_bool('1');
test_bool('toto');
test_bool('True');
test_bool('False');
?>
Voici le résultat de l’exécution de ce script depuis une fenêtre de terminal :
[4-php] php types.php
1 -> vrai
-> faux
0 -> faux
0 -> faux
1 -> vrai
-> faux
0 -> faux
00 -> vrai
1 -> vrai
toto -> vrai
True -> vrai
False -> vrai
echo
)Bonjour, ceci est un fichier php, qui s'appelle "texte.php".
<?php
function affiche($i)
{
echo "On m'a dit d'afficher ";
echo "$i\n";
}
echo "<p>ceci est du html</p>\n";
affiche(3);
affiche('truc');
$bob = 4+6;
affiche($bob);
?>
Maintenant je vais calculer 2+3
<?php
affiche(2+3);
echo "Encore une pour la route : ";
echo 2+3;
echo "\n";
?>
On exécute ce script php
NB : sur les machines des salles de TP, si la commande php
n’existe pas, il
faut peut-être essayer php-cli
. Je vais me renseigner.
[4-php] php texte.php
Bonjour, ceci est un fichier php, qui s'appelle "texte.php".
<p>ceci est du html</p>
On m'a dit d'afficher 3
On m'a dit d'afficher truc
On m'a dit d'afficher 10
Maintenant je vais calculer 2+3
On m'a dit d'afficher 5
Encore une pour la route : 5
[4-php]
Remarquez bien :
p>
sont recopiées telles quellesecho
ne produit pas de saut de ligne par défaut\n
(regardez bien à quels moments le texte va à la ligne)Le processus est le suivant :
.php
Ceci permet de générer du code html qui change en fonction des
paramètres choisis par l’utilisateur.
Ce qui est inclus avec include
sera traité comme le fichier php
principal, et donc selon les mêmes règles que décrit plus haut :
Ayez toujours en tête la structure du fichier html qui devra être
produit à la fin.
Exemple : Le fichier test-html.php
ci-dessous.
<!DOCTYPE html>
<html>
<?php
include('head.php');
include('body.php');
?>
</html>
Le fichier head.php
:
<head>
<meta charset="utf8" />
<title>Test</title>
</head>
Le fichier body.php
:
<body>
<h1>Voilà</h1>
<p>Ca marche</p>
<p>
<?php
echo 5*8;
?>
</p>
</body>
Le résultat sur le terminal :
[4-php] php test-html.php
<!DOCTYPE html>
<html>
<head>
<meta charset="utf8" />
<title>Test</title>
</head>
<body>
<h1>Voilà</h1>
<p>Ca marche</p>
<p>
40 </p>
</body>
</html>
Je mets le résultat dans un fichier :
[4-php] php test-html.php > test-html.html
Je charge ce fichier dans mon navigateur :
Voir la section correspondante
dans le manuel.
Contrairement à java, les tableaux en php sont des dictionnaires (ou
tableaux associatifs, ou maps en anglais), c’est à dire des listes
de couples
[ clef => valeur ]
La clef est soit une chaîne de caractère, soit un entier.
Vous avez déjà pu voir ça avec le tableau $_GET
ou le tableau
$_REQUEST
pour le traitement des formulaires (voir cours précédent).
Les tableaux se parcourent fréquemment au moyen de la boucle foreach :
foreach($tab as $val) echo "valeur suivante : $val"; foreach($tab as $key => $val) echo "à la clef $key est associée la valeur $val";
Exemple :
<?php
function affiche_tab($tab)
{
foreach($tab as $param => $valeur)
echo "$param donne $valeur.\n";
echo "\n";
}
function affiche_valeurs($tab)
{
echo "Les valeurs de mon tableau :\n";
foreach($tab as $valeur)
echo "$valeur.\n";
echo "\n";
}
$cp = array(
'nom' => 'Prieur',
'prénom' => 'Christophe',
'email' => 'prieur@liafa.fr');
echo "\n";
affiche_tab($cp);
affiche_valeurs($cp);
?>
Résultat :
[4-php] php array.php
nom donne Prieur.
prénom donne Christophe.
email donne prieur@liafa.fr.
Les valeurs de mon tableau :
Prieur.
Christophe.
prieur@liafa.fr.
On peut aussi ajouter des valeurs à un tableau sans en spécifier la
clef :
$tab[] = 'toto';
Dans ce cas, la clef est fixée automatiquement à un entier, qui est le
plus petit entier qui n’a pas déjà été attribué comme clef (et 0 si
aucune valeur n’a été attribuée précédemment).
Exemple :
<?php
$tab['test'] = 6;
$tab[] = 42;
$tab[2] = 56;
echo "\n";
affiche_valeurs($tab);
for($i=0; isSet($tab[$i]); $i++)
echo "$i donne " . $tab[$i] . "\n";
echo "\n";
?>
Résultat :
Les valeurs de mon tableau :
6.
42.
56.
0 => 42
Remarquez bien :
'test'
n’est pas un entier mais elle définit une valeur duEn particulier :
Mais aussi :
Bien noter la distinction == vs. ===
(et donc != vs. !==), et les tableaux
récapitulatifs de
comparaison entre types
et bon courage pour les migraines
Retenir surtout qu’il faut toujours faire plein de tests quand
vous manipulez ensemble des expressions qui n’ont pas le même type.
Voir l’exemple du piratage du site de Christine Boutin à l’annonce du retrait
de sa candidature, traité dans un autre billet.
un exemple
<form action="traite.php" method="get">
<p>
Surnom : <input type="text" /><br/>
<label for="prenom">Prénom : </label>
<input type="text" id="prenom" name="prenom"/><br/>
<label for="nom">Nom : </label>
<input type="text" id="nom" name="nom"/><br/>
<label for="email">email : </label>
<input type="email" id="email" name="email"/><br/>
<input type="radio" name="sexe" id="hom" value="homme" />
<label for="hom">Homme</label><br/>
<input type="radio" name="sexe" id="femme" value="femme" />
<label for="femme">Femme</label><br/>
<input type="submit" value="Envoyer le formulaire" />
<input type="reset" />
</p>
</form>
Remarque
Navigation et saisie possibles intégralement au clavier dans le formulaire (touches Tab, Shift-Tab, flèches pour les boutons radio, espace pour les checkbox, les listes et les boutons, Entrée pour envoyer le formulaire).
Rôles des différents attributs :
id
input
,label
)for
label
à un élément de saisie désignéid
. Ainsi, quand on clique sur le label, l’élément estname
value
input type="radio"
, il faut lainput type="text"
, cet attribut permet deCe qui s’affiche dans la barre d’adresse (ici on a découpé l’url pour la rendre plus lisible) :
http://localhost:8888/HOME/IO2/traite.php?
surnom=chris&
prenom=Christophe&
nom=Prieur&
email=prieur%40liafa.fr&
sexe=homme
Pour le tester en local sur son ordinateur, il faut installer un
serveur web avec interpréteur php.
Le manuel de référence du langage et sa
traduction en français, qui a parfois
tendance à basculer en anglais, mais ça ne vous fera pas de mal…
<!-- début d'un document html normal, mais dans un fichier
-- portant l'extension .php, en l'occurrence traite.php
-- puisque c'est ce que j'ai indiqué dans l'attribut action
-- de mon formulaire
-->
<table border="1">
<?php
affiche_parametre("nom");
affiche_parametre("prenom");
affiche_parametre("surnom");
affiche_parametre("sexe");
?>
</table>
où la fonction affiche_parametre
est définie plus tôt dans le
fichier :
<?php
function affiche_parametre($nom_param)
{
echo '<tr>';
echo '<td>' . $nom_param . '</td>';
echo '<td>' . $_REQUEST[$nom_param] . '</td>';
echo '</tr>';
}
?>;
En cas d’erreur, utiliser la commande shell php
dans un terminal
peut simplifier le debugage (ici, php traite.php
).
Toujours bien séparer les parties « surtout php » et les parties « surtout html ».
Par exemple, définir des fonctions
à l’intérieur du head
(de même qu’on y met des
directives de style), et dans le body
, insérer seulement des
appels de fonctions
if(isSet($_REQUEST["nom"]) && $_REQUEST["nom"] != "")
{
$nom = $_REQUEST["nom"];
echo "<p>Vous vous appelez $nom.</p>";
}
else
{
echo "<p>Votre nom s'il vous plait ?</p>";
affiche_formulaire();
}
Dans cet exemple, le même fichier php sera utilisé pour afficher le
formulaire et pour le traiter. Il suffira alors, dans les attribut du
formulaire, d’indiquer action=""
, ce qui signifie « le fichier courant ».
La vérification des paramètres sera traitée plus en détail la
prochaine fois, pour les questions de sécurité.
<?php ?>
signalent du code php, le reste est renvoyéecho
pour envoyer du code htmlfunction
pour définir une fonction, par exemple dans le head
$_REQUEST
pour récupérer les valeurs des paramètres transmisisSet()
pour tester si un paramètre a été fourniLes suggestions qui sont parfois apportées quand on remplit un champ
dans un formulaire, peuvent être fournies par des moyens différents :
datalist
associé à l’élémentinput
(exemple sur w3schools)D’abord, partiel le 9 mars (voir détails)
Pas de balise fermante
meta
link
img
br
(voir ci-dessous)input
(voir plus bas, sur les formulaires)hr
(horizontal rule, ne pas utiliser, le css est fait pour ça)Attention à br
: dans la grande majorité des cas, on peut faire sans
et c’est mieux. Là encore, c’est le travail de css. Exemple typique :
au lieu de mettre un br
pour aller à la ligne et changer de paragraphe, mettre la suite dans un
nouveau paragraphe (balise p
).
Exemple de cas où on peut utiliser br
:
<h1>Adresse</h1>
<p>
Jean Bon<br/>
3, rue du Cochon qui rit<br/>
61400 Mortagne au Perche
</p>
Deux éléments « neutres » (aucun comportement par défaut) :
- div (bloc)
- span (en ligne)
Leur rôle est de délimiter des zones pour leur attribuer un style particulier.
Dans la cascade de div, noter que le div le plus bas (de classe « TickerFeedMessage ») est lui-même contenu dans un span.
Note : la largeur « disponible » pour un bloc c’est la largeur
intérieure de l’élément qui le contient.
Balises table
, th
, tr
et td
.
À utiliser seulement quand c’est vraiment un tableau qu’on veut
afficher (impossible ou très difficile de changer la disposition des
cases entre elles avec css)
Depuis html5, <table border="1">
est recommandé pour un tableau qui
affiche des données. Ce n’est plus un attribut de style (la bordure
pourra ne pas être affichée si on le spécifie autrement dans une
feuille de style), mais un
attribut sémantique.
php : le serveur reçoit des infos, les traite et renvoie du html comme résultat.
Comment lui transmettre des infos ?
Tous les éléments de saisie (input, textarea, etc.) doivent être mis dans un élément form, définissant un formulaire, dont on envoie les valeurs avec un input type= »submit ».
form
Attention, form
n’est pas un élément de type bloc, par conséquent
les éléments de saisie qu’il contient (input
etc.), qui sont de
type en-ligne, doivent être placés dans un bloc (contenu dans ou
contenant form
).
Le 9 mars dans l’amphi du cours, 3 sessions de 20 min, sur feuille.
Seul document autorisé : une feuille A4 recto-verso préparée par vous.
Sujet distribué peu après le partiel
En préambule au deuxième semestre, je vous recommande vivement de parcourir cet article, écrit par un sociologue qui a suivi quatre étudiants des « cités » pendant leur première année à l’université… et leur échec prévisible.
Il n’est pas facile à lire, mais les personnages vous seront peut-être vaguement familiers, vous pouvez survoler le texte et piocher ici et là quelques unes de leurs péripéties, et les réflexions qu’elles suggèrent au chercheur. En particulier sur ce qui leur a manqué dans leur manière d’organiser leur travail et leur temps.
Stéphane Beaud, 2007,
Un temps élastique : étudiants des « cités » et examens universitaires
<!DOCTYPE html> <html dir="ltr" xml:lang="fr-FR" lang="fr-FR"> <head> <meta charset="utf8" /> <title>IO2</title> <meta name="author" content="Christophe Prieur" /> </head> <body> <p>Hello, world!</p> </body> </html>
<!doctype html> :
avant, ici on indiquait la version. Maintenant, version courante html5, mais on ne l’indique plus (ce qui suffit à dire html5, du coup)
html5 pas encore finalisé en tant que format (défini par le W3C, consortium qui se charge des formats web) mais déjà partiellement pris en compte par les navigateurs (à des degrés variables).
différence entre norme et standard
Affichage du document html ci-dessus dans un navigateur puis analyse du source (dans Chrome : Afficher > Options pour les développeurs > Outils de développements. Pour Firefox, peut-être un menu similaire pour les dernières versions, sinon utiliser l’extension firebug).
html : contient head + body
body contient « hello world »
seul le contenu du body est affiché
HTML : HyperText Markup Language
Vient de SGML, qui a donné aussi XML
markup : « balises »
balise ouvrante / fermante, comme des parenthèses
Deux balises ouvrante / fermante et leur contenu définissent un « élément »
structure hiérarchique
Ca, c’est de la syntaxe (la grammaire du langage).
Les noms des balises, c’est du vocabulaire.
Un exemple un peu plus riche : deuxieme.html
<!DOCTYPE html> <html dir="ltr" xml:lang="fr-FR" lang="fr-FR"> <head> <meta charset="utf8" /> <title>IO2</title> <meta name="author" content="Christophe Prieur" /> </head> <body> <header> <h1>Bienvenue !!</h1> <p>Ceci est la <em>première page</em> du cours d'<abbr title="Internet & Outils">IO2</abbr> !!</p> </header> <section> <header> <h1>D'abord, il faut dire bonjour</h1> </header> <p>Hello, world!</p> </section> </body> </html>
Attention : ne pas confondre head, header et h1, h2 etc.
header est un ajout de html5, on y reviendra (un autre jour).
Pour le vocabulaire du langage (les balises existantes), se reporter à un dictionnaire.
Analyse rendu / source dans Chrome
La plupart du temps, le html est généré par des logiciels.
Exemple sur didel : édition d’un texte avec interface wysiwyg
(wysiwyg : what you see is what you get)
affichage du html produit
Affichage du résultat sur didel, intégré dans une page, analyse du code avec Chrome.
On retrouve le html qu’on a vu, inséré dans un élément div encastré dans le reste de la page.
D’où l’intérêt de l’organisation hiérarchique du document.
Parenthèse : pourquoi apprendre le html ? Pas seulement savoir l’écrire, mais savoir le générer, savoir le parser (décomposer ses éléments à l’aide d’un programme)
-> savoir écrire des programmes qui le manipulent.
Comparaison du résultat sur didel et en local sur un fichier vierge.
Sur didel, puces carrées, couleur de fond, police sans serif.
Affichage du style de l’élément ul dans Chrome -> square
Séparation fond (html) / forme (css)
Travail du rédacteur / du graphiste
Exemple sur Facebook
La page, c’est du html.
Les couleurs, les polices
mais aussi le positionnement des éléments dans la page.
Exemple de l’affichage avec une mauvaise connexion (genre smartphone), où la page s’affiche sans que le css ait été chargé (le fichier html est chargé, il indique le nom d’un fichier css, qui ne peut pas être chargé à cause de la mauvaise connexion).
On survole le nom d’un utilisateur, une boîte s’affiche avec des infos sur lui : javascript, exécuté par mon navigateur, a demandé des infos à Facebook, et une fois qu’il les a reçues, insère un élément dans le document html, dont le css indique qu’il doit être par-dessus le reste.
Quand je clique sur une photo, l’url change.
www.facebook.com/photo.php
-> le navigateur a demandé à Facebook d’exécuter le programme photo.php, avec les paramètres indiqués dans la suite de l’url.
Le résultat est un document html, que mon navigateur affiche.
Entre-temps, le php, chez FB, a interrogé la base de données.
L’interrogation de la base se fait au moyen d’un autre langage encore.
Sur des sites courant (pas de la taille de FB), on utilise la plupart du temps un langage de la famille SQL, MySQL par exemple.