Accueil
Rechercher:
sur developpez.com sur les forums
Forums | Tutoriels | F.A.Q's | Participez | Hébergement | Contacts
Accueil Conception Java DotNET Visual Basic  C  C++ Delphi MS-Office SQL & SGBD Oracle  4D  Business Intelligence
Club Emploi Blogs   TV   Dév. Web PHP XML Python Autres 2D-3D-Jeux Sécurité Windows Linux PC Mac
FORUM PHP FAQ PHP COURS PHP SOURCES PHP LIVRES PHP SCRIPTS PHP OUTILS PHP COMPARATIFS PHP TV Zend Framework
 

Passage de paramètres à un script PHP via l'URL

Dernière mise à jour : 19 novembre 2002

Par Hugo ETIEVANT


Format d'une URL

Les URL (Uniform Ressource Location) sont les chemins des ressources sur internet. Ils sont uniques et permettent d'accéder à n'importe quel document.

Syntaxe générale

<schéma>://<utilisateur>:<mot de passe>@<machine>:<port>/<chemin>?<paramètres>#<fragment>

ChampDescription
schémaprotocole utilisé (http, ftp, ...)
machinenom de domaine ou adresse IP du serveur
utilisateurnom d'utilisateur pour certains protocoles nécessitant une identification (ftp, telnet, ...)
mot de passemot de passe pour l'authentification
portn° de port sur lequel se connecter, les protocoles ont un port par défaut (80 pour http)
cheminchemin complet de la ressource : succession des répertoires à parcourir pour l'atteindre plus son nom complet
paramètresliste des noms de paramètres et de leurs valeurs
fragmentidentifiant d'un lien interne à une page HTML (créé par <a name="">)

Syntaxe de la liste des paramètres

Le champs <paramètres> ci-haut peut être décomposé plus finement :

<couple (nom,valeur)>&<couple (nom,valeur)>&...

Syntaxe du couple (nom, valeur)

Le champs <couple (nom,valeur)> peut être décomposé encore plus finement :

nom=valeur

Résumé

Le caractère ? indique que la suite de l'URL sont des paramètres et ne font pas partie du nom de fichier. Le caractère = sépare un nom de paramètre et sa valeur transmise. Le caractère & sépare deux couples (nom, valeur).

Pour faire face au cas général d'un paramètre dont la valeur contient des caractères interdits, on utilisera les fonctions de codage.

Exemple concrêt

<a href="index.php?imprim=yes&user_id=75">Version imprimable</a>

Dans cet exemple on transmet deux variables au script index.php : $imprim de valeur "yes" et $user_id de valeur "75".

[ haut ]


Passage de paramètres

Passage d'une chaîne de caractères

Une URL étant d'abord une chaîne de caractère, la valeur reçue par le script sera de type chaîne de caractères.

Script de départ
<a href="page.php?str=bonjour">
Script d'arrivée
echo $str;
Affiche : bonjour

Passage d'un entier

Le cast implicite et le faible typage des variables en PHP, provoque une conversion directe de la chaîne "20" en l'entier 20 lors de son utilisation dans un calcul ou un test.

Script de départ
<a href="page.php?i=20">
Script d'arrivée
echo $i*5;
Affiche : 100

Passage d'un flottant

De la même manière que pour un entier, un flottant sera automatiquement traduit en flottant lors de son utilisation.

Script de départ
<a href="page.php?x=5.23">
Script d'arrivée
echo f($x);
Affiche : 89.24

Passage d'un tableau

Pour passer un tableau à un script, il faut passer chaque élément du tableau séparément. Le nom du paramètre sera le nom du tableau, suivi de crochets [].

Script de départ
$tab = array{ "Hugo", "ETIEVANT", 1980 };
<a href="page.php?tab[]=Hugo&tab[]=ETIEVANT&tab[]=1980">
Script d'arrivée
echo $tab[0], " ", $tab[1], " ", $tab[2];
Affiche : Hugo ETIEVANT 1980

Erreur à ne pas commettre : oublier les crochets. Car alors, on remplacera la valeur du premier élément par le deuxième, et par le troisième...

Mauvais exemple :
Script de départ
$tab = array{ "Hugo", "ETIEVANT", 1980 };
<a href="page.php?tab=Hugo&tab=ETIEVANT&tab=1980">
Script d'arrivée
echo $tab;
Affiche : 1980

Passage d'un tableau associatif

Un tableau associatif associe un élément à une clé. Pour le passer en paramètre, il faut ajouter entre les crochets le nom de la clé.

Script de départ
$tab = array{ "prenom" => "Hugo", "nom" => "ETIEVANT", "age" => 1980 };
<a href="page.php?tab[prenom]=Hugo&tab[nom]=ETIEVANT&tab[age]=1980">
Script d'arrivée
echo $tab["prenom"], " ", $tab["nom"], " ", $tab["age"];
Affiche : Hugo ETIEVANT 1980

Linéariser une variable

Il n'est pas du tout pratique de passer en paramètre un tableau avec 150 champs comme dans l'exemple précédent.

Heureusement, il existe un couple de fonctions serialise() et unserialise() qui permet traduire une variable en une chaîne de caractères que l'on peut passer facilement en paramètre sans perdre ni leur structure ni leur type.

Pour récupérer une variable linéarisée, et retrouver la valeur de la variable, on utilise unserialize().

Types linéarisables
entier
flottant
chaîne de caractères
tableau
tableau multidimensionel
tableau associatif
objet

Après avoir linéarisé notre variable, on doit coder cette chaîne avant de la passer en param et en protéger les slashs éventuels.

Script de départ
$tab = array{ "prenom" => "Hugo", "nom" => "ETIEVANT", "age" => 1980 };
<a href="test.php3?str=".addslashes(urlencode(serialize($tab)))."">
Script d'arrivée
$tab = unserialize(urldecode(stripslashes($str)));
echo $tab["prenom"], " ", $tab["nom"], " ", $tab["age"];
Affiche : Hugo ETIEVANT 1980

Attention à une erreur commune : bien respecter l'ordre des fonctions composées ! Dans le script de départ : linéariser, coder et protéger les slashs. Puis, dans le script d'arrivée, l'opération inverse : déprotéger les slashs, décoder, délinéariser.

Passage d'un objet

Tout comme pour le tableau, un objet n'étant pas un type de base (nombre, chaîne, booléen), il ne peut être passé directement en paramètre.

Travaillons sur l'objet moi instance de la classe Personne :

class Personne {
	var nom; 
	var prenom;
	var age;
	function Personne($n, $p, $a) {
		$this->nom = $n;
		$this->prenom = $p;
		$this->age = $a;
	}
	function afficher() {
		echo $this->prenom, " ", $this->nom, " ", $this->age;
	}
}
$moi = new Personne("Hugo", "ETIEVANT", 1980);

On pourait en passer chacun des attributs en paramètre séparement dans l'URL comme le montre l'exemple suivant :

Script de départ
<a href="page.php?n=".$moi->nom."&p=".$moi->prenom."&a=".$moi->age.">
Script d'arrivée
$moi = new Personne($n, $p, $a);
$moi->afficher();
Affiche : Hugo ETIEVANT 1980

Mais cette méthode est laborieuse, il est plus simple de ne passer qu'une seule valeur en paramètre. Or on sait que la linéarisation permet de "compresser" une variable - même complexe - dans une seule valeur de type chaîne de caractères. On va donc linéariser notre objet.

De plus, la linéarisation permet de conserver les connexions ouvertes vers les bases de données ! Par contre les méthodes ne sont pas conservées.

Script de départ
<a href="page.php?moi=".addslashes(urlencode(serialize($moi)))."">
Script d'arrivée
$moi = unserialize(urldecode(stripslashes($moi)));

[ haut ]


Codage

Une URL ne peut pas comporter n'importe quel caractère et certains d'entre eux ont une fonction bien précise. Il est alors important que la valeur d'un paramètre ne contienne pas de caractère qui puisse être mal interprété. On a donc besoin de coder les valeurs des paramètres pour s'assurer qu'ils vont bien arriver à destination tels que la source les a envoyé.

Ce codage peut être plus ou moins compliquer. Cela va du simple remplacement de quelques caractères spéciaux jusqu'au changement de base du codage des caractères (passage de 8 bits à 7 bits) afin de transformer des caractères binaires en simples lettres.

Codage de base

urlencode : Encode une chaîne en URL.
urldecode : Décode une chaîne encodée URL.

urlencode($str) : code la chaîne $str. Les espaces sont remplacés par des signes plus (+). Ce codage est celui qui est utilisé pour poster des informations dans les formulaires HTML. Le type MIME utilisé est application/x-www-form-urlencoded.

Exemple :
echo <a href=\"$PHP_SELF?foo=".urlencode($foo)."\">Foo</a>";

NB : Pour être accessible, la valeur du paramètre devra par la suite être décodée dans le script d'arrivé par la fonction réciproque adéquate.

Codage complet

rawurlencode : Encode une chaîne en URL, selon la RFC1738.
rawurldecode : Décode une chaîne URL, selon la RFC1738.

rawurlencode($str) : code la chaîne $str. Remplace tous les caractères interdits par leur codage équivalent hexadécimal.

Exemple :
echo <a href=\"$PHP_SELF?foo=".rawurlencode($foo)."\">Foo</a>";

Codage plus évolué

base64_encode : Encode une chaîne en MIME base64.
base64_decode : Décode une chaîne en MIME base64

base64_encode($str) : code la chaîne $str en base 64. Cet encodage permet à des informations binaires d'être manipulées par les systèmes qui ne gèrent pas correctement les codes 8 bits (code ASCII 7 bit étendu aux accents européens), comme par exemple, les corps de mail qui en général sont américains et ne gèrent que les 7 bits. Une chaîne encodée en base 64 a une taille d'environ 33% supérieure à celle des données initiales.

Exemple :
echo <a href=\"$PHP_SELF?foo=".base64_encode($foo)."\">Foo</a>";

Comparatif des trois codages
Sans codageRené & Cie : 30%-5*20
urlencodeRen%E9+%26+Cie+%3A+30%25-5%2A20
rawurlencodeRen%E9%20%26%20Cie%20%3A%2030%25-5%2A20
base64_encodeUmVu6SAmIENpZSA6IDMwJS01KjIw

[ haut ]


Parser une URL

Il peut être intéressant d'extraire d'une URL (ce peut être $PHP_SELF ou $HTTP_REFERER) certains éléments comme le protocol, le chemin...

parse_url($str) : retourne un tableau associatif contenant les différents éléments de l'URL passée en paramètre. Les champs sont les suivants : scheme (protocole), host (domaine), port (n° de port), user (nom d'utilisateur), pass (mot de passe), path (chemin de la ressource), query (paramètres et valeurs), et fragment.

Exemple :
$tab = parse_url("http://www.cia.gov:8080/search/form.php?var=val#toc3");
Cet exemple retourne le tableau suivant :
ChampsValeurDescription
schemehttpprotocol utilisé
queryvar=valquestion posée, c'est-à-dire la liste des paramètres et de leurs valeurs respectives
pathsearch/form.phpchemin et nom complet de la ressource demandée
port8080port utilisé sur le serveur
hostwww.cia.govnom de domaine du serveur
fragmenttoc3nom de fragment (lien interne à la page HTML)

[ haut ]


Interpréter les variables d'une URL

parse_str($str) : analyse la chaîne $str comme si c'était une URL et en extrait les variables et valeurs respectives qui seront alors connues dans la suite du script. Cette fonction évite d'avoir à créer ses propres fonctions d'analyse de champs de base de données où l'on aurait sauvegardé une url.

Exemple :
$str = "nom=jean+pierre&email[]=moi@ici.fr&email[]=moi@labas.com";
parse_str($str);
echo $nom, $email[0], $email[1];

[ haut ]


Portée des variables

Jusqu'à la version PHP 4.2.0, les paramètres passés dans l'URL étaient automatiquement connus sous forme de variables globales du script destinataire. Mais depuis la version 4.2.0, ce n'est plus le cas à cause du changement de la valeur par défaut du paramètre register_global du fichier de configuration php.ini du serveur. Ce paramètre était auparavent à On, il est désormais à Off. Ce changement impose de recourir désormais aux tableaux dit super globaux de PHP.

Exemple :
http://www.monsite.com/home.php?id=40&action=buy
Avant PHP 4.2.0, le script d'arrivée disposait automatiquement des variables globales $id et $action de valeurs respectives 40 et "buy" car le serveur était configuré à register_global=On.
A cette époque, on pouvait aussi procéder autrement à l'aide d'une méthode indirecte qui concistait à l'utilisation du tableau $HTTP_GET_VARS qui est un tableau associatif dont les clés sont les paramètres passés dans l'URL.

Script de départ
<a href="http://www.monsite.com/home.php?id=40&action=buy">
Script d'arrivée
echo $id, " ", $action;
Affiche : 40 buy
echo $HTTP_GET_VARS["id"], " ", $HTTP_GET_VARS["action"];
Affiche aussi : 40 buy

Maintenant, depuis PHP 4.2.0, le script ne connait plus de variables globales appelées $id et $action !
Pour récupérer ces paramètres, on va faire appel au tableau super global $_GET qui contient les mêmes informations que $HTTP_GET_VARS. La seule différence entre ces deux tableaux, c'est que $HTTP_GET_VARS est une variable globale alors que $_GET est une variable super globale. Cette différence réside dans la portée de ces variables. Une variable globale est connue dans le corps du script mais pas dans ses fonctions (sauf à les déclarer avec le mot clé global). Une variable super globale est automatiquement connue partout sans besoin de les déclarer dans les fonctions.

La nouvelle méthode de manipulation des paramètres passés en URL est la suivante :

Script de départ
<a href="http://www.monsite.com/home.php?id=40&action=buy">
Script d'arrivée
echo $_GET["id"], " ", $_GET["action"];
Affiche : 40 buy

Mais afin d'éviter de chambouler l'écriture de vos scripts, vous pouvez vous contenter de rajouter la déclararation suivante en début de script : $id = $_GET["id"] et $action = $_GET["action"].

Script de départ
<a href="http://www.monsite.com/home.php?id=40&action=buy">
Script d'arrivée
$id = $_GET["id"];
$action = $_GET["action"];
echo $id, " ", $action;
Affiche : 40 buy

[ haut ]


Codage hexadécimal des caractères spéciaux

On a vu dans Codage, que certains caractères avaient des propriétés spéciales qui en faisait de mauvais candidats pour un passage directe dans l'URL dans codage préalable.

Le tableau suivant montre la liste des caractères spéciaux avec leur code hexadécimal.

CaractèreCode hexadécimal
tabulation %09
espace %20
" %22
' %60
# %23
% %25
& %26
? %3F
@ %40
( %28
) %29
[ %5B
] %5D
{ %7B
} %7D
/ %2F
\ %5C
| %7C
< %3C
> %3E
= %3D
^ %5E
~ %7E
: %3A
; %3B
, %2C
. %2E

Exemple d'un fichier dont le nom sous Windows est "Planning de suivi (2003).xls" devient après codage des caractères spéciaux : "Planning%20de%20suivi%20%282003%28.xls".

Voici le tableau de correspondance du début de la table MIME de la police de cette page :

%1E  %1F   %20  !%21  "%22  #%23  $%24  %%25  &%26  '%27  
(%28  )%29  *%2A  +%2B  ,%2C  -%2D  .%2E  /%2F  0%30  1%31  
2%32  3%33  4%34  5%35  6%36  7%37  8%38  9%39  :%3A  ;%3B  
<%3C  =%3D  >%3E  ?%3F  @%40  A%41  B%42  C%43  D%44  E%45  
F%46  G%47  H%48  I%49  J%4A  K%4B  L%4C  M%4D  N%4E  O%4F  
P%50  Q%51  R%52  S%53  T%54  U%55  V%56  W%57  X%58  Y%59  
Z%5A  [%5B  \%5C  ]%5D  ^%5E  _%5F  `%60  a%61  b%62  c%63  
d%64  e%65  f%66  g%67  h%68  i%69  j%6A  k%6B  l%6C  m%6D  
n%6E  o%6F  p%70  q%71  r%72  s%73  t%74  u%75  v%76  w%77  
x%78  y%79  z%7A  {%7B  |%7C  }%7D  ~%7E  %7F  %80  %81  
%82  ƒ%83  %84  %85  %86  %87  ˆ%88  %89  Š%8A  %8B  
Œ%8C  %8D  Ž%8E  %8F  %90  %91  %92  %93  %94  %95  
%96  %97  ˜%98  %99  š%9A  %9B  œ%9C  %9D  ž%9E  Ÿ%9F  
 %A0  ¡%A1  ¢%A2  £%A3  ¤%A4  ¥%A5  ¦%A6  §%A7  ¨%A8  ©%A9  
ª%AA  «%AB  ¬%AC  ­%AD  ®%AE  ¯%AF  °%B0  ±%B1  ²%B2  ³%B3  
´%B4  µ%B5  %B6  ·%B7  ¸%B8  ¹%B9  º%BA  »%BB  ¼%BC  ½%BD  
¾%BE  ¿%BF  À%C0  Á%C1  Â%C2  Ã%C3  Ä%C4  Å%C5  Æ%C6  Ç%C7  
È%C8  É%C9  Ê%CA  Ë%CB  Ì%CC  Í%CD  Î%CE  Ï%CF  Ð%D0  Ñ%D1  
Ò%D2  Ó%D3  Ô%D4  Õ%D5  Ö%D6  ×%D7  Ø%D8  Ù%D9  Ú%DA  Û%DB  
Ü%DC  Ý%DD  Þ%DE  ß%DF  à%E0  á%E1  â%E2  ã%E3  ä%E4  å%E5  
æ%E6  ç%E7  è%E8  é%E9  ê%EA  ë%EB  ì%EC  í%ED  î%EE  ï%EF  
ð%F0  ñ%F1  ò%F2  ó%F3  ô%F4  õ%F5  ö%F6  ÷%F7  ø%F8  ù%F9  
ú%FA  û%FB  ü%FC  ý%FD  þ%FE  ÿ%FF  %100  %101  %102  %103  

En voici le code source PHP :

<table>
<?php
for($i=30;$i<260;$i+=10) {
    echo 
"<tr>";
    for(
$j=0;$j<10;$j++) {
        echo 
"<td>".chr($j+$i)."</td>
        <td style=\"color:blue;\">%"
.strtoupper(dechex($j+$i))."</td>
        <td>&nbsp;&nbsp;</td>"
;
    }
    echo 
"</tr>";
}
?>
</table>

[ haut ]


Ce document est issu de http://cyberzoide.developpez.com et reste la propriété exclusive de son auteur. La copie, modification et/ou distribution par quelque moyen que ce soit est soumise à l'obtention préalable de l'autorisation de l'auteur.
Responsable bénévole de la rubrique PHP : Guillaume Rossolini - Contacter par EMail :
Vos questions techniques : forum d'entraide PHP - Publiez vos articles, tutoriels et cours
et rejoignez-nous dans l'équipe de rédaction du club d'entraide des développeurs francophones
Nous contacter - Copyright © 2000-2008 www.developpez.com - Legal informations.