Cours 9 : conserver des informations

Le problème

On veut pouvoir conserver des informations d’une page sur l’autre, comme l’identifiant de l’utilisateur connecté (pour ne pas avoir à se reconnecter à chaque page), tout en empêchant autant que possible l’usurpation d’identité.

Dans les exemples présentés ici, on se limitera à transmettre le contenu d’une variable, nommée $test, d’une exécution à l’autre d’un même script, en précisant quand et comment un utilisateur a la possibilité de modifier cette valeur.

Continuer la lecture

Publié dans Cours | Marqué avec , , , , | Laisser un commentaire

Le partiel (2013)

Vendredi 1er mars.
2 sessions de 20 min chacune, convocation selon la première lettre du nom de famille :

- de A à J : 10h30
- de K à Z : 11h15

Seuls documents autorisés : une feuille A4 recto-verso, contenu libre.
Ni téléphone, ni ordinateur.

Note finale de l’UE = max de

  • examen final
  • 10% partiel + 40% projet + 50% examen final
Publié dans Organisation | Marqué avec , | Laisser un commentaire

Cours 3 : un peu de reverse engineering, et du php (2013)

Le partiel

Partiel le 1er mars, dans l’amphi du cours, en sessions de 20 minutes (qcm + une ou deux questions rapides d’écriture de code), détails à venir.

Promenade au jardin zen css

Les exemples du CSS zen garden ne sont pas toujours des modèles à suivre (le site date de l’époque où il était encore utile de démontrer l’intérêt du css), mais c’est un très bon cas d’école pour comprendre les principes de base.

La forme change, pas le fond

Continuer la lecture

Publié dans Cours | Marqué avec , , , , , | Un commentaire

Cours 2 : html (2013)

La référence : le W3C

Aux normes, la chaleur d'un serviceLe WWW Consortium (W3C) est l’organisme de normalisation du web. Regroupant les grands acteurs du web (concepteurs des principaux navigateurs, principaux sites web, etc.), il définit la manière d’utiliser et interpréter les langages html, css et javascript.

Il est important de savoir lire ses recommandations, même si elles sont parfois arides. C’est la référence officielle.

Les documentations principales dont vous aurez à vous servir :

Les balises, avec ou sans contenu

Continuer la lecture

Publié dans Non classé | Marqué avec , , , , , , | Laisser un commentaire

Touch-typing : Exercez-vous au clavier

machine à écrire casséeQuelques applications web ludiques pour apprendre ou s’exercer à taper avec ses dix doigts sans regarder le clavier (touch-typing en anglais).

Apprentissage lettre à lettre

  • sense-lang, leçons progressives, lettre à lettre, quelques langues autres que le français, et deux ou trois petits jeux. Un peu vieillot question design web, mais efficace. Si vous trouvez plus récent, je suis preneur ! (update 18 mars : j’ai mis le lien direct sur le tutorial)

Perfectionnement mot à mot

  • 10 fast fingers, sessions d’une minute, prend en charge de nombreuses langues, y compris de droite à gauche (arabe, hébreu, persan).
  • typing maniac, aussi en version application facebook et en trois langues (anglais, espagnol, italien).
    Très Addictif, surtout si vous avez des amis qui tapent un peu plus vite que vous :)

Phrases

  • typeracer, existe aussi en application facebook, seulement en anglais. Courses sur une phrase avec d’autres utilisateurs connectés simultanément sur le site.
  • keybr, application en flash. L’approche est originale.
    Elle génère des suites de caractères qui semblent prendre en compte les fréquences. Mais taper des phrases qui n’ont aucun sens devient vite lassant.

A vous de jouer !

Vous préférez lequel ? Vous en connaissez d’autres ?
Le concours est lancé : envoyez vos scores, il y aura trois catégories :
- les meilleurs scores bruts
- les meilleures progressions
- les hacks qui permettent de tricher au score ;)
Je me défends pas mal au typing maniac, amis-Facebook, à vos claviers ;)

Publié dans Liens | Marqué avec , | 14 commentaires

Cours 5 : Révisions php + un aperçu de php / mysql

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).

Publié dans Cours | Marqué avec , , , | Laisser un commentaire

Le partiel

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]

Publié dans Organisation | 3 commentaires

Mauvaise Saint Valentin pour Christine Boutin

parodie martine n'a pas de culotte

une des merveilles du défunt "Martine cover generator"

Cas d’école : un exemple d’injection de code css par transmission de formulaire. Continuer la lecture

Publié dans Cours | Marqué avec , , , , , , , , | 3 commentaires

Cours 4 : php, le langage

La doc officielle

cartoon php6

php6, par exinside php

Les types

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).

Exemple avec le type booleen (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

Rappel sur le fonctionnement de php

php ne connaît pas le langage html

  • Il ne fait que reproduire des chaînes de caractères
  • Il n’interprète que ce qui est signalé par des balises php
  • Ce qui est à l’intérieur de balises php doit être du php
  • Ce qui est en dehors de balises php sera recopié tel quel
  • À l’intérieur des balises, pour écrire quelque chose, il faut le dire (avec echo)

Exemple :

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 :

  • Les balises <p> sont recopiées telles quelles
  • Le 2+3 n’est pas interprété, ni les guillemets, en dehors des balises
  • Les sauts de ligne dans le code php, dans les balises php, ne sont
    pas pris en compte
  • Une commande echo ne produit pas de saut de ligne par défaut
  • Pour aller à la ligne, on utilise le caractère spécial \n(regardez bien à quels moments le texte va à la ligne)

Mais alors pourquoi utilise-t-on php avec html ?

Le processus est le suivant :

  1. Le navigateur du client demande au serveur un fichier qui a l’extension
    .php
  2. Le serveur transmet ce fichier à l’interpréteur php qui se trouve
    chez lui (chez le serveur)
  3. Une fois interprété, ce fichier produit du code html (à condition que le
    développeur lui ait fait produire du html)
  4. Le serveur envoie ce code html au navigateur du client
  5. Le navigateur affiche ce code html comme s’il avait demandé au
    serveur un fichier html

Ceci permet de générer du code html qui change en fonction des
paramètres choisis par l’utilisateur.

include

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 :

  • Ce qui est en dehors de balises php sera recopié tel quel
  • Ce qui est à l’intérieur de balises php doit être du php
  • etc.

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 :

capture d'écran

test-html.html dans le navigateur

Comment procéder

  1. Avant tout, écrire le html que vous voulez afficher à la fin
  2. Ensuite, découper ce html pour attribuer chaque morceau à une
    partie de code php
  3. Gardez bien en tête l’ordre dans lequel doivent apparaître les
    différents morceaux dans le code html final
  4. En cas de doute, utilisez l’interpréteur du terminal pour vérifier le
    code html produit

Les tableaux

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 :

  • il n’y a pas de valeur associée à la clef 1, donc la boucle s’est
    arrêtée après 0 et n’est pas allé jusqu’à 2
  • la clef 'test' n’est pas un entier mais elle définit une valeur du
    tableau, comme 0 et 2 (mais pas 1).

Récapitulatif (et plus encore)

En particulier :

Mais aussi :

  • Les structures de contrôle
  • Les opérateurs de comparaison,
    qui sont encore l’occasion de voir (comme pour les booléens au début
    de ce cours) que les types sont beaucoup plus « souples » qu’en java.

    Bien noter la distinction == vs. ===
    (et donc != vs. !==), et les tableaux
    récapitulatifs de
    comparaison entre types
    et bon courage pour les migraines :P

    Retenir surtout qu’il faut toujours faire plein de tests quand
    vous manipulez ensemble des expressions qui n’ont pas le même type.

  • Les chaînes de caractères,
    avec la distinction entre guillemets ‘simples’ et "doubles"
    (l’interpréteur évaluera les expressions qu’il trouve à l’intérieur
    des guillemets doubles, par les guillemets simples. Voir les
    guillemets utilisés dans tous les exemples ci-dessus).

Sécurisation des formulaires : éviter les injections

Voir l’exemple du piratage du site de Christine Boutin à l’annonce du retrait
de sa candidature, traité dans un autre billet.

Publié dans Cours | Marqué avec , , , , , | 2 commentaires

Cours 3 : traiter les formulaires en php

formulaire

Retour sur les formulaires

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>

Le résultat ici.

capture d'écran formulaire maison

le formulaire

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
permet de désigner un élément (par exemple les input,
désignés par les label)
for
attache un label à un élément de saisie désigné
par son id. Ainsi, quand on clique sur le label, l’élément est
activé.
name
nom du paramètre qui sera envoyé par le
formulaire au moyen de l’élément correspondant (voir
ci-dessous)
value
valeur renvoyée pour le paramètre
correspondant. Pour les input type="radio", il faut la
spécifier. Pour les input type="text", cet attribut permet de
fixer une valeur par défaut (qui sera affichée dans le champ de saisie).

Ce 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

Traitement en php

Pour le tester en local sur son ordinateur, il faut installer un
serveur web avec interpréteur php.

  • Xampp, avec une
    version pour les trois grands systèmes (linux, windows, mac).
    Un tutorial, écrit par un collègue de l’École Polytechnique.
  • Wamp, sous
    Windows, easyphp est très
    utilisé.
  • Mamp (pour Mac)

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…

Exemple de traitement

<!-- 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).

Séparation du code html et 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

Vérification des paramètres transmis (1ère partie)

    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é.

À retenir

  • les balises <?php ?> signalent du code php, le reste est renvoyé
    tel quel
  • commande echo pour envoyer du code html
  • function pour définir une fonction, par exemple dans le head
  • tableau $_REQUEST pour récupérer les valeurs des paramètres transmis
  • isSet() pour tester si un paramètre a été fourni

Un mot sur l’autocomplétion dans les formulaires

Les suggestions qui sont parfois apportées quand on remplit un champ
dans un formulaire, peuvent être fournies par des moyens différents :

  • le plus souvent, c’est le navigateur, qui a mémorisé les réponses
    qu’on a fournies sur d’autres pages d’autres sites, dans
    des input ayant le même identifiant que celui sur lequel
    on se trouve.
  • cela peut être programmé en javascript par le site sur lequel on se
    trouve, et en interaction avec le serveur, pour proposer
    les réponses les plus courantes (comme une recherche
    Google)
  • cela peut être aussi fourni par le formulaire lui-même, au moyen de
    l’utilisation d’un élément datalist associé à l’élément
    input (exemple sur w3schools)
Publié dans Cours | Marqué avec , , , | 10 commentaires