6.5
En-têtes HTTP et variables globales
Elles comprennent les requêtes HTTP, les variables fournies par le serveur
et nourries automatiquement par le navigateur de l’internaute et les
tableaux créés par le moteur PHP pour conserver les requêtes CGI pour les
formulaires (POST, GET…). Il est indispensable de les connaître car elles
participent constamment à l’interactivité de vos programmes.
En-têtes HTTP
Voici les fonctions qui vous permettent d’interagir avec les en-têtes
HTTP, en y lisant, en y écrivant des valeurs ou en les effaçant.
Tab. 6.1 : Les fonctions pour les en-têtes HTTP
Fonction Description
int setcookie ( string nom [,
string valeur [, int expire [,
string chemin [, string domaine
[, int secure]]]]])
Envoie un cookie sur la machine client.
bool session_destroy ( void) Efface les données enregistrées dans la
session.
string session_id ( [string id]) Retourne le nom (id) de la session
courante et, si un id est ajouté en
paramètre, change l’id courant par celui-
ci.
bool session_is_registered (
string nom)
Vrai si une variable est enregistrée dans
une session
string session_name ( [string
nom])
Retourne ou change le nom de la session
courante.
location qui est un équivalent de la balise HTML refresh :
header("Location: />URL absolue
L’URL de redirection doit être absolue. Si votre URL est un
chemin relatif, la redirection n’aura pas lieu.
Plusieurs noms de domaine sur le même site
Certains hébergeurs vous permettent gratuitement de pointer
plusieurs noms de domaine sur le même site. Il vous suffit alors
de mettre quelques lignes sur votre page d’accueil pour rediriger le
visiteur sur la page choisie selon l’URL demandée, cela d’une manière
transparente.
if (eregi($_SERVER["HTTP_HOST"],"votreautresite.com")){
echo ’<meta http-equiv="refresh"
content="0;URL= />exit;
}
6
L’internaute est d’abord une personne
202 • Double Poche PHP & MySQL
Please purchase PDF Split-Merge on www.verypdf.com to remove this watermark.
Il est conseillé de mettre le deuxième site, si c’est un site
différent, dans un répertoire qui lui est propre, et de créer des
fichiers de redirection dans le répertoire principal pour toutes les
pages du deuxième site afin d’éviter de taper à chaque fois le nom du
répertoire. N’oubliez pas la fonction exit, sinon vous afficherez les deux
pages. Vous ne pouvez ici utiliser la fonction header() car aucune ligne
ne doit la précéder.
Les fournisseurs d’accès utilisent les proxys. Ces machines stockent les
pages les plus fréquemment vues par leurs internautes. Ce procédé évite
de payer de la bande passante mais se révèle gênant pour le webmestre
d’un site, car la page sera mise à jour seulement de temps en temps.
D’autre part, le navigateur, si certaines options sont laissées par défaut,
Tab. 6.2 : Les variables PHP
Variable Description
$PHP_SELF Équivalent à SCRIPT_NAME
$HTTP_COOKIE_VARS Tableau des variables reçues d’un cookie
$HTTP_GET_VARS Tableau des variables reçues d’un formulaire par la
méthode GET
$HTTP_POST_VARS Tableau des variables reçues d’un formulaire par la
méthode POST
$HTTP_POST_FILES Tableau des variables reçues d’un formulaire de
téléchargement de fichiers
$HTTP_ENV_VARS Tableau des variables d’environnement
$HTTP_SERVER_VARS Tableau des variables reçues d’un cookie
$HTTP_SESSION_VARS Tableau des variables reçues d’une session
Voici les nouvelles variables fournies avec la version 4 de PHP :
Tab. 6.3 : Les variables PHP (PHP4)
Variable Description
$_COOKIE Tableau des variables globales reçues d’un cookie
$_GET Tableau des variables globales reçues d’un formulaire par
la méthode get
$_POST Tableau des variables globales reçues d’un formulaire par
la méthode post
6
L’internaute est d’abord une personne
204 • Double Poche PHP & MySQL
Please purchase PDF Split-Merge on www.verypdf.com to remove this watermark.
Tab. 6.3 : Les variables PHP (PHP4)
Variable Description
$_FILES Tableau des variables globales reçues d’un formulaire de
téléchargement de fichiers
$_ENV Tableau des variables globales d’environnement
Tab. 6.4 : Les variables d’environnement
Variable Description
$HTTP_ACCEPT Liste des formats acceptés par le navigateur web
$HTTP_ACCEPT_LANGUAGE Langage accepté par le navigateur
$HTTP_CONNECTION Numéro d’IP et numéro de port éventuel
$HTTP_HOST Numéro d’IP et numéro de port éventuel
$HTTP__REFERER Page d’origine de la requête
$HTTP_USER_AGENT Version du navigateur
$REMOTE_ADDR Adresse IP de l’internaute
$REMOTE_PORT Port client
$REQUEST_METHOD Méthode GET ou POST
$SERVER_PROTOCOL Nom du protocole utilisé par le serveur (HTTP/1.0)
$SERVER_SOFTWARE Nom du serveur HTTP (Apache/1.3.20 (Win32)
PHP/4.0.6 )
b
Figure 6.8 :
Les variables
d’environnement
6
L’internaute est d’abord une personne
206 • Double Poche PHP & MySQL
Please purchase PDF Split-Merge on www.verypdf.com to remove this watermark.
6.6
Récapitulation
Créons un fichier variables.inc.php dans lequel nous stockons les cons-
tantes et les variables prédéfinies comme celles concernant le jour
courant… Au début de vos fichiers, vous obtiendrez une liste de
commande include que vous modulerez avec les deux barres obliques
caractérisant les commentaires. Ainsi vous neutraliserez la ligne concer-
nant l’authentification pour les fichiers hors du club. Dans votre répertoire
personnes ont déjà résolu votre problème, totalement ou partiellement,
proposez-leur des améliorations. Si le programme n’existe pas mais qu’il
vous dépasse par son ampleur, élaborez-le en partie. Puis rédigez une
documentation en détaillant vos objectifs et les étapes à venir. Une fois le
programme finalisé, proposez-le sur votre site personnel ou sur un site
touchant la communauté du Libre.
Dans le chapitre Mettre de l’ordre, nous vous donnons des
clés pour simplifier votre application et créer un fichier de
configuration qui regroupe toutes les variantes de l’application.
Nous vous proposerons quelques outils pour ajouter à votre site. Mais,
avant cela, nous nous pencherons sur les tableaux car la plupart des
applications les utilisent, y compris dans leurs fonctions de tri.
7.1
Tableaux
Quand vous avez plusieurs résultats de SQL et avez besoin de les
ordonner, les tableaux deviennent indispensables.
Tab. 7.1 : Les fonctions de manipulation d’éléments de tableau
Fonction Description
array array(…) Crée un tableau à partir d’une liste de valeurs.
array array_keys(array
tableau1)
Crée un tableau avec les clés de l’autre tableau.
array array_merge (array
tableau1, tableau2…)
Fusionne deux tableaux ou plus. Pour deux clés
identiques, il gardera seulement la dernière
valeur.
7
Des algorithmes, des outils et des fonctions
210 • Double Poche PHP & MySQL
array array_unshift (array
tableau1, mixed var,…)
Ajoute un ou plusieurs éléments au début du
tableau.
array array_diff ( array
tableau1, array tableau2 [,
array ...])
Crée un tableau avec les éléments du tableau1
qui ne sont pas dans le tableau2, etc.
array array_intersect (
array tableau1, array
tableau2 [, array ...])
Crée un tableau avec les éléments communs de
tous les tableaux.
array array_values(array
tableau1)
Crée un tableau avec les clés de l’autre tableau.
int array_walk ( array
tableau1, string fonct [,
mixed parametre])
Applique à chaque élément du tableau une
fonction pour laquelle il est possible d’envoyer
un troisième paramètre.
array range (int bas, int
haut)
Crée un tableau formé d’un intervalle de valeurs.
array compact(string var [,
array, tableau…])
Crée un tableau associatif formé des noms et
valeurs de variables (éventuellement contenues
Tab. 7.2 : Les options d’extraction d’éléments de tableau
Type Effet
EXTR_OVERWRITE Par défaut. En cas de collision, écrase la variable
précédente.
EXTR_SKIP En cas de collision, épargne la variable précédente.
EXTR_PREFIX_SAME En cas de collision, préfixe le nom de la variable avec le
troisième paramètre, conservant ainsi l’ancienne variable.
EXTR_PREFIX_ALL Préfixe toutes les variables. Depuis PHP 4.0.5, cela inclut
les noms numériques de variables, qui autrement seraient
invalides.
EXTR_PREFIX_INVALID Seuls les noms invalides ou numériques de variables sont
préfixés. Ce drapeau a été ajouté à la version 4.0.5.
7
Des algorithmes, des outils et des fonctions
212 • Double Poche PHP & MySQL
Please purchase PDF Split-Merge on www.verypdf.com to remove this watermark.
Tab. 7.2 : Les options d’extraction d’éléments de tableau
Type Effet
EXTR_IF_EXISTS En cas de collision, écrase seulement la variable
précédente, sinon ne fait rien. Ce drapeau a été ajouté à la
version 4.2.0.
EXTR_PREFIX_IF_EXISTS En cas de collision, ajoute un préfixe seulement si la
variable non préfixée existe. Ce drapeau a été ajouté à la
version 4.2.0.
Imaginez que vous parcouriez les pages d’un livre avec le doigt, ce doigt
serait le pointeur. PHP se sert d’un pointeur pour parcourir un tableau. Au
moment où un élément de tableau s’affiche, le pointeur le désigne.
Les fonctions suivantes manient le pointeur dans un tableau.
Le pointeur
Tab. 7.3 : Les fonctions de localisation du pointeur
inversé.
Void arsort (array tableau) Trie les éléments dans l’ordre alphabétique.
Void ksort (array tableau) Trie le tableau dans l’ordre de ses clés.
Void krsort (array tableau) Trie le tableau dans l’ordre inverse de ses clés.
Void uasort (array tableau,
function fonction)
Trie le tableau en utilisant une fonction.
Void sort (array tableau) Trie le tableau dans l’ordre de ses valeurs.
Les tableaux servent à classer des données et à les manipuler. Vous pouvez
le trier ou le modifier en enlevant, en ajoutant ou en intervertissant des
valeurs, fusionner plusieurs tableaux et en décliner chaque valeur dans
une boucle foreach. Le tableau est l’outil favori de “l’analyste-jongleur”
de données.
Déclinons un exemple de tri simple puis le même, de type associatif :
7
Des algorithmes, des outils et des fonctions
214 • Double Poche PHP & MySQL
Please purchase PDF Split-Merge on www.verypdf.com to remove this watermark.
Listing 7.1 : Tri simple par ordre alphabétique, tri associatif par clef :
vins.php
$vins = array ("Bourgogne", "Beaujolais", "Bordeaux",
"Côtes-du-Rhône", "Alsace", "Anjou");
sort ($vins);
foreach($vins as $clef=>$valeur){
echo "$clef = $valeur <BR>\n";
}
echo "<P>";
$vins = array ("d"=>"Bourgogne", "a"=>"Beaujolais", "b"=>"Bordeaux",
"c"=>"Côtes-du-Rhône", "f"=> "Alsace", "e"=>"Anjou");
ksort ($vins);
lettre accentuée est placée après sa lettre générique et avant la lettre
suivante en insérant un chiffre :
Listing 7.2 : Tri avec les lettres accentuées : tri_franc.php
$un_tableau=array(’é’,’è’,’ê’,’ë’);
$lalettre=’f’;
$i=0;
foreach($un_tableau as $valeur){
$a=str_replace($valeur,$lalettre.$i,$a);
$b=str_replace($valeur,$lalettre.$i,$b);
$i++;
}
$un_tableau==array(’ô’,’ö’);
$lalettre=’p’;
$i=0;
foreach($un_tableau as $valeur){
$a=str_replace($valeur,$lalettre.$i,$a);
$b=str_replace($valeur,$lalettre.$i,$b);
$i++;
}
$un_tableau=array(’î’,’ï’);
$i=0;
$lalettre=’j’;
foreach($un_tableau as $valeur){
$a=str_replace($valeur,$lalettre.$i,$a);
$b=str_replace($valeur,$lalettre.$i,$b);
$i++;
}
$un_tableau=array(’ç’);
$i=0;
$lalettre=’d’;
Please purchase PDF Split-Merge on www.verypdf.com to remove this watermark.
7.2
Calendriers, dates et autres agendas
Les fonctions de date sont des outils pour nettoyer la base, trier des
données, connaître l’actualité d’une donnée et aménager des délais avant
une action… Leurs fonctionnalités sont innombrables.
Durée après une date ou avant une date
Nous avons déjà vu comment afficher une date. Vous pouvez avoir envie
de faire un concours ou un sondage avec un lot à gagner, fourni par un
sponsor en échange de publicité, comme nous le verrons plus loin. Pour
inciter les visiteurs à y participer, vous afficherez une date limite.
Pour une date dans le passé ou le futur, vous pouvez utiliser la fonction
date(). Celle-ci prend deux arguments. Le premier est le format et le
second, optionnel, est le timestamp d’Unix (nombre de secondes depuis
le 1
er
janvier 1970). Si ce second argument n’est pas fourni, la fonction
utilise par défaut le timestamp du moment où la fonction est appelée.
Date("n") vous donne le mois courant sans adjonction de 0 et
date("Ymd") vous retourne une date dans le format aaaammjj.
La fonction mktime() crée un timestamp à partir des arguments
respectifs : heure, minute, seconde, mois, jour, année. Cette fonction est
intéressante dans la mesure où elle rectifie les approximations de date ;
ainsi, alors que le mois de février comprend 28 jours en 2003,
mktime(0,0,0,30,2,2003) donnera le timestamp du 2 mars 2003.
Pour afficher une date quinze jours auparavant, écrivez votre fonction
comme suit :
echo date("j/n/Y", mktime(0,0,0,date("n"), date("j")-15, date("Y")));
Pour faire le décompte avec une date dans le futur, comme la date limite
pour gagner un concours :
dimanche, qui est le jour 0.
Commençons notre programme par le formulaire d’affichage. Il est
composé d’un menu déroulant qui donne le choix sur six mois dans le
passé et douze dans le futur. C’est une boucle.
Listing 7.3 : Agenda sous forme de calendrier : agenda.php
echo "<form action=\"$_SERVER[’PHP_SELF’]\" method=\"post\">";
echo ’<select name="instant" size="1">’;
$date_inf= mktime(0,0,0,date("n")-6, date("j"), date("Y"));
$date_sup= mktime(0,0,0,date("n")+12, date("j"), date("Y"));
Calendriers, dates et autres agendas
Double Poche PHP & MySQL • 219
Please purchase PDF Split-Merge on www.verypdf.com to remove this watermark.
$mois_franc=array(’’, ’janvier’, ’février’, ’mars’, ’avril’, ’mai’,
’juin’, ’juillet’, ’août’, ’septembre’, ’octobre’, ’novembre’,
’décembre’);
for ($variable_mois=-6,$variable_tableau=date("n",$date_inf);
$variable_mois<=12;
$variable_mois++,$variable_tableau++){
if ($variable_tableau==13){
$variable_tableau=1;
}
$chronos=mktime(0,0,0,date("n")+$variable_mois, date("j"), date("Y"));
echo "<option value=\"$chronos\"";
if (!$variable_mois){
echo ’ SELECTED’;
}
$mois_courant=$mois_franc["$variable_tableau"];
$an_courant=date("Y", $chronos);
echo ">$mois_courant ${an_courant}</option>";
}