Articles

Le mois de la fonction PHP : construire une chaîne d'URL

  • Ecrit par Damien Seguy
  • vendredi 27 avril 2007
Image pour le titre du contenu

This document is also available in English en 


Construire une URL est une opération simple : il suffit de prendre le nom des variables, et leur valeur et de les relier avec un signe égal, puis relier toutes les variables avec le signe &. Evidemment, sans oublier d'utiliser urlencode() pour protéger les valeurs. Et penser à gérer les tableaux. Et gérer la récursion des tableaux. Et les caractères exotiques.

Finalement, c'est compliqué quand on ne connaît pas http_build_query().

http_build_query() reconstitue la chaîne de requête d'une URL. La chaîne de requête est la partie qui suit le point d'interrogation dans une URL de type GET :

http://www.nexen.net/index.php?x=2 
 

http_build_query() prend un tableau en entrée, avec le nom des variables en index et la valeur associée en valeur associée. Il va alors construire la chaîne en appliquant les protections nécessaires. Voici un exemple complet :

<?php
 
 
$vars = array('variable' => 'valeur',
              'cha&icirc;ne' => '&agrave; prot&eacute;ger',
              'tableau[]' => '0',
              'tableau[]' => 2,
              'autretableau' => array('a','b','c'),
              'tableaurecursif' => array('a'=> array('b')),
              'et chinois' => '&#25105;&#29233;&#20320;');
              
print http_buil_query($vars);
 
 
?>

Le résultat est :

variable=valeur&amp;cha%C3%AEne=%C3%A0+prot%C3%A9ger&amp;tableau%5B%5D=2&amp;
autretableau%5B0%5D=a&amp;autretableau%5B1%5D=b&amp;autretableau%5B2%5D=c
&amp;tableaurecursif%5Ba%5D%5B0%5D=b&amp;et+chinois=%E6%88%91%E7%88%B1%E4%BD%A0

Il suffit alors d'ajouter cette fonction à une URL ou de l'utiliser dans une requête de type POST pour pouvoir l'envoyer à un site web distant. Par exemple, si vous voulez mettre en place un proxy facilement, vous pouvez faire ceci :

<?php
header("Location: /nouvellepage.php?".http_build_query($_GET));
?>

Vous pouvez aussi réaliser facilement un convertisseur de POST en GET :


<?php
print file_get_contents("http://www.votresite.com/index.php?".http_build_query($_POST));
?>

A la réception, PHP va décoder tout cela, et le donner au programmeur dans le tableau $_GET. Si vous devez décoder cette chaîne de caractère directement dans un script PHP, vous pouvez utiliser la fonction parse_str().

<?php
parse_str('variable=valeur&amp;cha%C3%AEne=%C3%A0+prot%C3%A9ger&amp;tableau%5B%5D=2&amp;autretableau%5B0%5D=a&amp;autretableau%5B1%5D=b&amp;autretableau%5B2%5D=c&amp;tableaurecursif%5Ba%5D%5B0%5D=b&amp;et+chinois=%E6%88%91%E7%88%B1%E4%BD%A0', $r);
print_r($r);
?>

Array
(
    [variable] => valeur
    [cha&icirc;ne] => &agrave; prot&eacute;ger
    [tableau] => Array
        (
            [0] => 2
        )
 
 
    [autretableau] => Array
        (
            [0] => a
            [1] => b
            [2] => c
        )
 
 
    [tableaurecursif] => Array
        (
            [a] => Array
                (
                    [0] => b
                )
 
 
        )
 
 
    [et_chinois] => &#25105;&#29233;&#20320;
)

A mémoriser
  • parse_str() prend un tableau en second paramètre, pour accueillir les valeurs décodées. Sinon, les valeurs seront décodées directement dans le script. 
  • parse_str() n'est pas protégé contre les chaînes de requête qui produise des tableaux immenses.
  • Une URL de type GET est limité à quelques kilo octets. Ne dépassez pas cette limite, ou bien le navigateur va couper la chaîne.
  •  http_build_query() comme parse_str() sont les mêmes fonctions que celle que PHP utilise en interne.
< Précédent   Suivant >

Commentaires

Vous pouvez ajouter votre commentaire!


Vous devez vous connecter pour commenter