PHP côté serveur

Licence Informatique, semestre 6

Jean-Marc LecarpentierPascal Vanier

Enseignement des technologies du Web

 

PHP côté serveur

Notes de cours

Travail personnel

Objectifs

Pratiquer l'utilisation de PHP côté serveur.

Exercice 1 — Manipulation de fichiers, inclusion et redirection #

Téléchargez l'archive de l'exercice, qui contient un fragment de HTML et un fragment de PHP, ainsi qu'un script inclusion.php qui utilise ces fragments.

Inclusion avec include/require

  1. Placez le contenu de l'archive sur votre serveur, regardez bien le contenu des scripts, observez le résultat. Assurez-vous de bien comprendre ce qui se passe.
  2. Remplacez les trois include par des require, et regardez à nouveau le résultat. Quelle est la différence ?
  3. Enlevez l'inclusion du fragment inexistant et vérifiez que cette fois la conclusion s'affiche bien.
  4. Dupliquez le contenu du body (copiez le contenu, du début jusqu'à la conclusion, et collez-le après la conclusion). Chaque inclusion aura donc lieu deux fois. Que se passe-t-il, et pourquoi ?
  5. Remplacez les quatre require par des require_once, et expliquez le résultat.

Il existe aussi include_once, mais il est moins utile. À moins d'avoir une bonne raison, il vous est recommandé d'utiliser include pour inclure un fragment de contenu (HTML ou PHP), et require_once pour inclure un fichier PHP contenant des déclarations (constantes, fonctions, classes…).

Récupération du contenu d'un fichier dans une variable

Les instructions include et require exécutent immédiatement le code : elles sont en quelque sorte remplacées par le résultat de l'exécution. Il est souvent utile de récupérer ce résultat avant affichage, pour le modifier ou pour le passer à une fonction.

  1. Dans un script PHP, récupérez avec la fonction file_get_contents le contenu du fragment HTML dans une variable $frg et l'afficher.
  2. Faites de même avec le fragment PHP. Que se passe-t-il, et pourquoi ?
  3. Pour récupérer le résultat de l'exécution du fragment PHP, il faut utiliser un include en activant l'output buffering. Faites-le.

Redirection et header

La fonction PHP header permet de manipuler les en-têtes HTTP de la réponse envoyée par le serveur.

  1. Dans une nouvelle page PHP, mettez le contenu suivant :
    <?php
    header('X-Mon-Entete-Perso: lorem ipsum dolor sit amet');
    ?>
    
    Ouvrez l'onglet « Réseau » des outils développeur de Firefox (raccourci : control-shift-E), accédez à la page, et vérifiez que l'en-tête custom a bien été transmis.
  2. Mettez un peu de HTML après l'appel à header, et vérifiez qu'il est bien interprété par le navigateur.
  3. Modifiez l'appel à header pour transmettre l'en-tête Content-Type : faites en sorte que le contenu soit transmis comme du texte simple. Vérifiez que le HTML n'est plus interprété par le navigateur.
  4. Que se passe-t-il si vous mettez le HTML avant l'appel à header ? Expliquez ce qui se passe.
  5. Utilisez l'en-tête Location pour que toute personne visitant la page soit redirigée vers une autre page sur le web (par exemple https://fr.wikipedia.org/wiki/Chien). Observez ce qui se passe avec l'outil « Réseau » de Firefox.

Exercice 2 — Table de multiplication #

Construction de la table

  1. Écrire une page multiplication.php qui affiche une table de multiplication comme sur la figure suivante. Le rendu de la figure est obtenu avec un tableau HTML (élément table), mais il n'est pas spécialement pertinent de construire un tableau PHP (array) pour le faire !

    Les couleurs sont facultatives, sauf pour les plus à l'aise, qui s'efforceront d'obtenir ce rendu en pur CSS, sans utiliser les attributs class, id ou style.

    La table de multiplication de 1 à 15
  2. Modifier le code pour que l'affichage de la table soit géré par une fonction, qui prend en argument la borne supérieure de la table (15 dans le modèle) ; par exemple, si on lui passe 20, elle affiche la table de 1 à 20.
  3. Modifier à nouveau le code, pour que la borne supérieure de la table soit contrôlée par un paramètre borne dans l'URL : ainsi, la page multiplication.php?borne=20 affichera la table de 1 à 20.
  4. On va mettre en place une vérification de l'entrée. NB: les éléments des tableaux $_GET et $_POST sont toujours des chaînes de caractères.
    1. Faire en sorte que la page choisisse une borne par défaut si l'URL ne comporte pas de paramètre borne.
    2. Faire en sorte que la page affiche « Erreur : borne nulle » s'il reçoit 0 comme paramètre borne. Cela doit marcher également pour 00 ou 0.0.
    3. Faire en sorte que la page affiche « Erreur : borne vide » si le paramètre reçu est vide (multiplication.php?borne=). Attention, la comparaison faible peut vous jouer des tours…
    4. Si la borne est trop grande, le script met trop longtemps à générer la page, et le serveur le tue avant qu'il ait terminé. Vérifier que la borne fournie dans l'URL est entre 1 et 100 ; si elle n'y est pas, afficher un message d'erreur, ou choisir une borne par défaut.
    Après avoir fini ces quatre points, et avant de passer à la question suivante, testez à nouveau que les quatre vérifications sont fonctionnelles !
  5. Ajouter sur la page un lien vers la « page » affichant la plus petite table et un autre vers la « page » affichant la plus grande table.

Exercice 3 (optionnel) — Le retour de la vengeance de l’automate cellulaire élémentaire #

Êtes-vous sûr·e d'avoir vraiment fait toutes les parties facultatives des différents exercices sur l'automate cellulaire (TP 3, 4 et 5) ? Par exemple, est-il possible d'afficher l'évolution du monde dans le navigateur avec la règle 42 (ou autre entier arbitraire) ?

Si oui, et si vous en voulez encore plus, alors voilà un complément. C'est moins guidé, je vous laisse vous débrouiller ; efforcez-vous de faire des choix de conception appropriés !

Créez un simulateur différent, qui pour un monde initial donné, retient tous les états du monde rencontrés, et s'arrête quand il a détecté un cycle (un état du monde déjà vu) en renvoyant true. Si aucun cycle n'est détecté après un seuil fixé (paramétrable), renvoyer false.

Créez un « méta-simulateur », qui lance le simulateur 100 fois pour chaque règle, avec à chaque fois un monde de taille 100 et un ratio de 0.5, et un seuil raisonnable pour que les calculs ne soient pas trop longs (10000 ? 100000 ?). Afficher un tableau avec le nombre de cycles trouvés pour chaque règle (nombre qu'on peut lire comme une probabilité de tomber sur un cycle « rapidement »). Y a-t-il des différences entre les règles ? Y en a-t-il qui sortent du lot ?