begin process at 2012 02 09 12:31:29
  Trouver un code source :
 
dans
 
Accueil > 

Code

 > 

Astuces

 > HTTP_BUILD_QUERY() POUR PHP 4

HTTP_BUILD_QUERY() POUR PHP 4


 Information sur la source

Note :
8,75 / 10 - par 4 personnes
8,75 / 10

  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

  • 10
Catégorie :Astuces Classé sous :http, query, url, tableau, objet Niveau :Débutant Date de création :09/05/2007 Date de mise à jour :10/05/2007 14:58:47 Vu :6 917

Auteur : kankrelune

Ecrire un message privé
Ce membre participe au partage de revenus publicitaires
Commentaire sur cette source (14)
Ajouter un commentaire et/ou une note


 Description

Version PHP 4 de la fonction http_build_query() disponible sous PHP 5 et ma foi bien pratique... .. .



Source

  • <?php
  • // on vérifie quand même que la fonction n'existe pas
  • if(!function_exists('http_build_query'))
  • {
  • function http_build_query( $formdata, $numeric_prefix = '', $arg_separator = null)
  • {
  • //on vérifie les données
  • if(!is_array($formdata) && !is_object($formdata))
  • return false;
  • elseif(empty($formdata))
  • return '';
  • // si le séparateur n'est pas soumis on prend celui de la config serveur
  • if(is_null($arg_separator))
  • {
  • $arg_separator = @ini_get('arg_separator.output');
  • if(!$arg_separator)
  • $arg_separator = '&';
  • }
  • // création du builder interne qui servira à parcourir récursivement les tableaux et objets
  • $builderCore = '$ret = \'\';
  • foreach ($array as $k => $v)
  • {
  • if (is_scalar($v))
  • $ret .= $name.urlencode(\'[\'.$k.\']\').\'=\'.urlencode($v).$sep;
  • else
  • {
  • $builder = create_function(\' $name, $array, $sep, $builderCore\', $builderCore);
  • $ret .= $builder( $name.urlencode(\'[\'.$k.\']\'), $v, $sep, $builderCore).$sep;
  • }
  • }
  • return substr( $ret, 0, -strlen($sep));';
  • $builder = create_function(' $name, $array, $sep, $builderCore', $builderCore);
  • // on parcours nos données
  • $ret = '';
  • foreach($formdata as $k => $v)
  • {
  • if (is_integer($k))
  • $k = $numeric_prefix.$k;
  • if(is_scalar($v))
  • {
  • $ret .= urlencode($k).'='.urlencode($v).$arg_separator;
  • continue;
  • }
  • $ret .= $builder( urlencode($k), $v, $arg_separator, $builderCore).$arg_separator;
  • }
  • // on renvois après avoir enlevé le dernier séparateur
  • return substr( $ret, 0, -strlen($arg_separator));
  • }
  • }
  • /*** Exemple d'utilisation ***/
  • $datas = array(
  • 'baz' => 'boom',
  • 'cow' => 'milk',
  • 'php' => 'hypertext processor',
  • 'foo' => array(
  • 'bar',
  • 'foo'
  • ),
  • 'pwet',
  • 'plop'
  • );
  • $query1 = http_build_query($datas);
  • $query2 = http_build_query($datas, '', '&');
  • $query3 = http_build_query($datas, 'myVar_');
  • echo '<fieldset style="width:95%;margin:auto;margin-bottom:15px;">
  • <legend>http_build_query($data)</legend>
  • http_build_query($datas) :
  • <a href="?'.$query1.'">'.htmlentities($query1).'</a>
  • <br />
  • http_build_query($datas, \'\', \'&amp;\') : <a href="?'.$query2.'">'.htmlentities($query2).'</a>
  • <br />
  • http_build_query($datas, \'myVar_\') : <a href="?'.$query3.'">'.htmlentities($query3).'</a>
  • <br />
  • </fieldset>
  • <fieldset style="width:95%;margin:auto;margin-bottom:15px;">
  • <legend>$datas</legend>
  • <pre>
  • '.print_r($datas,true).'
  • </pre>
  • </fieldset>';
  • if(!empty($_GET))
  • echo '<fieldset style="width:95%;margin:auto;margin-bottom:15px;">
  • <legend>$_GET</legend>
  • <pre>
  • '.print_r($_GET,true).'
  • </pre>
  • </fieldset>';
  • ?>
<?php

// on vérifie quand même que la fonction n'existe pas
if(!function_exists('http_build_query'))
{
    function http_build_query( $formdata, $numeric_prefix = '', $arg_separator = null)
    {
        //on vérifie les données
        if(!is_array($formdata) && !is_object($formdata))
            return false;
                elseif(empty($formdata))
                    return '';
        
        // si le séparateur n'est pas soumis on prend celui de la config serveur 
        if(is_null($arg_separator))
        {
            $arg_separator = @ini_get('arg_separator.output');
            
            if(!$arg_separator) 
                $arg_separator = '&';
        }
        
        // création du builder interne qui servira à parcourir récursivement les tableaux et objets
        $builderCore = '$ret = \'\';
        
        foreach ($array as $k => $v) 
        {
            if (is_scalar($v))
                $ret .= $name.urlencode(\'[\'.$k.\']\').\'=\'.urlencode($v).$sep;
            else
            {
                $builder = create_function(\' $name, $array, $sep, $builderCore\', $builderCore);
                $ret .= $builder( $name.urlencode(\'[\'.$k.\']\'), $v, $sep, $builderCore).$sep;
            }
        }
        return substr( $ret, 0, -strlen($sep));';
        
        $builder = create_function(' $name, $array, $sep, $builderCore', $builderCore);
        
        // on parcours nos données
        $ret = '';
        
        foreach($formdata as $k => $v)
        {
            if (is_integer($k))
                $k = $numeric_prefix.$k;
            
            if(is_scalar($v))
            {
                $ret .= urlencode($k).'='.urlencode($v).$arg_separator;
                continue;
            }
            
            $ret .= $builder( urlencode($k), $v, $arg_separator, $builderCore).$arg_separator;
        }
        
        // on renvois après avoir enlevé le dernier séparateur
        return substr( $ret, 0, -strlen($arg_separator));
    }
}



/*** Exemple d'utilisation ***/

$datas = array(
                'baz' => 'boom',
                'cow' => 'milk',
                'php' => 'hypertext processor',
                'foo' => array(
                                'bar',
                                'foo'
                        ),
                'pwet',
                'plop'
    );

$query1 = http_build_query($datas);
$query2 = http_build_query($datas, '', '&');
$query3 = http_build_query($datas, 'myVar_');

echo '<fieldset style="width:95%;margin:auto;margin-bottom:15px;">
	<legend>http_build_query($data)</legend>
		http_build_query($datas) :            
		     <a href="?'.$query1.'">'.htmlentities($query1).'</a>
			<br />
		http_build_query($datas, \'\', \'&amp;\') : <a href="?'.$query2.'">'.htmlentities($query2).'</a>
			<br />
		http_build_query($datas, \'myVar_\') :   <a href="?'.$query3.'">'.htmlentities($query3).'</a>
    <br />
</fieldset>
<fieldset style="width:95%;margin:auto;margin-bottom:15px;">
	<legend>$datas</legend>
	<pre>
		'.print_r($datas,true).'
	</pre>
</fieldset>';

if(!empty($_GET))
    echo '<fieldset style="width:95%;margin:auto;margin-bottom:15px;">
	<legend>$_GET</legend>
	<pre>
		'.print_r($_GET,true).'
	</pre>
</fieldset>';


?>

 Conclusion

Je ne met pas de fichier d'exemple le bout de code ci dessus étant amplement suffisant... .. .

@ tchaOo°


 Historique

09 mai 2007 15:47:33 :
Ajout de commentaires et de l'exemple... .. .
09 mai 2007 15:49:51 :
Une petite faute de frappe... .. .
09 mai 2007 16:10:39 :
Correction du nom... je l'avais appelée http_build_query2() pour mes tests... lol... .. . ;o)
10 mai 2007 14:58:47 :
J'ai mis l'exemple d'utilisation dans le champs code pour que l'on profite de l'indentation et de la coloration... .. . ;o)

 Sources du même auteur

Source avec Zip Source avec une capture CAPTCHA VISUELLE
Source avec Zip CAPTCHA NON VISUELLE
FONCTION DE SÉCURITÉ CONTRE LA POLLUTION DES VARIABLES ET LE...

 Sources de la même categorie

Source avec Zip Source avec une capture GENERATEUR D'ONGLET DE NAVIGATION PHP par pos123
FORMATER UN LIEN YOUTUBE, DAILYMOTION OU VIMEO POUR L'UTILIS... par kgb93
Source avec Zip Source avec une capture PAGINATION + FICHIER CSS par profdi
Source avec Zip Source avec une capture SYSTEME D'AUTHENTIFICATION PHP AVEC PROTÉCTION KEYLOGGER par mtrix000
Source avec Zip Source avec une capture GENERATEUR DE BOUTONS DE PARTAGES POUR RESEAUX SOCIAUX par cod57

 Sources en rapport avec celle ci

Source avec Zip Source avec une capture PAGINATION JAVASCRIPT PHP MYSQL par cod57
Source avec Zip CRYPTAGE REVERSIBLE par Mokost
FONCTION GET EN PHP : RECUPERER UNE PAGE SUR UN SITE DISTANT par nax333
Source avec Zip TRANSFORMER UN TABLEAU D'OBJETS EN TABLEAU UNIDIMENSIONNEL par raoulman
FONCTION TRANSFORMER UN TABLEAU EN OBJET par drnight

Commentaires et avis

Commentaire de kankrelune le 09/05/2007 16:14:46

Je suis bien entendu ouvert à toute suggestion... .. .

@ tchaOo°

Commentaire de amezghal le 09/05/2007 23:57:28

-le script du phpcs n'a pas bien mis en forme votre script($builderCore):
-la fonction a mon avis rarement utilisable(la preuve c'est qu'elle n'apprait qu'avec la version 5 du php :D ).
-par contre j'aime bien ta façon de coder xd je note 8

Commentaire de kankrelune le 10/05/2007 15:03:17

Salut amezghal... pour répondre à ton commentaire... .. .

- oui la coloration de phpcs ne supporte pas les chaines de caractères sur plusieurs lignes... :oS

- détrompe toi cette fonction peut être très utile et le fait qu'elle n'apparaisse qu'a partir de php5 ne veut rien dire quand à son utilité... str(r)ipos() et str_ireplace() par exemple sont très utile et n'apparaisse qu'avec PHP5... de même pour le model objet (digne de ce nom) de PHP... .. .

- kek elle a ma façon de coder... .. . ;o)

Merci pour ton commentaire et pour la note... .. .

@ tchaOo°

Commentaire de cedriclomb le 14/05/2007 11:40:58

Bonjour,
Et la version PHP.net
<?php
if(!function_exists('http_build_query')) {
    function http_build_query($data,$prefix=null,$sep='',$key='') {
        $ret    = array();
            foreach((array)$data as $k => $v) {
                $k    = urlencode($k);
                if(is_int($k) && $prefix != null) {
                    $k    = $prefix.$k;
                };
                if(!empty($key)) {
                    $k    = $key."[".$k."]";
                };

                if(is_array($v) || is_object($v)) {
                    array_push($ret,http_build_query($v,"",$sep,$k));
                }
                else {
                    array_push($ret,$k."=".urlencode($v));
                };
            };

        if(empty($sep)) {
            $sep = ini_get("arg_separator.output");
        };

        return    implode($sep, $ret);
    };
};
?>

Commentaire de cedriclomb le 14/05/2007 11:47:41

Bonjour,
Et la version PHP.net
<?php
if(!function_exists('http_build_query')) {
    function http_build_query($data,$prefix=null,$sep='',$key='') {
        $ret    = array();
            foreach((array)$data as $k => $v) {
                $k    = urlencode($k);
                if(is_int($k) && $prefix != null) {
                    $k    = $prefix.$k;
                };
                if(!empty($key)) {
                    $k    = $key."[".$k."]";
                };

                if(is_array($v) || is_object($v)) {
                    array_push($ret,http_build_query($v,"",$sep,$k));
                }
                else {
                    array_push($ret,$k."=".urlencode($v));
                };
            };

        if(empty($sep)) {
            $sep = ini_get("arg_separator.output");
        };

        return    implode($sep, $ret);
    };
};
?>

Commentaire de kankrelune le 14/05/2007 12:24:07

Oui je connais cette version, qui n'est d'ailleur pas celle de php.net mais d'un posteur tout comme moi ici... seulement je ne l'aime pas pour plusieurs raisons... tout d'abord si le séparateur n'est pas fournis tu remarquera que ce dernier est instancié à la fin de la fonction ce qui ne sert à rien du tout donc la chaine est faussée... je voulais une fonction similaire à l'originale d'une part au niveau de la déclaration donc pas de récursivité possible (nombre d'arguments) et je ne voulais pas passer par un builder externe comme dans celle de PEAR (package PHP_Compat) d'autre part celle ci dessus ne formate pas la chaine exactement comme l'originale encore que cela est facilement modifiable... .. .

après j'aurais pu passer par un tableau plutôt qu'une chaine mais c'est un choix les deux solutions se valent en terme de démarche et de performances... le plus chiant c'est le builder en interne en fait... je trouve pas ça des plus propre mais je vois pas d'autre solution si on exclu un builder externe ou la récursion... j'y réfléchirais quand j'aurais le temps... .. .

Voili voilou... .. .

@ tchaOo°

Commentaire de masternico le 16/05/2007 23:44:14

Propre net et préci, comme dab...
j'adhère

Commentaire de Knolan le 26/05/2007 02:27:10

Je n'avais pas connaissance de cette fonction dans PHP5, en plus de m'avoir appris que je n'etais pas fou d'avoir écris une fonction qui faisait ca (il y a longtemps) j'ai appris l'existence de cette fonction native dans php5 !

Merci, 10 :)

Commentaire de LPUnderground le 12/04/2009 10:05:02 8/10

Merci pour cette fonction très pratique.

Je devais recréer la fonction pour un site que je développais en PHP 5 mais l'hébergeur tournait en PHP 4 et comme j'avais la flem de réécrire cette fonction, bref thx.

8 / 10 (car tu n'espaces pas ton codes : ) )

Commentaire de kankrelune le 12/04/2009 18:41:41

je n'espace pas mon code... qu'entend tu par là... .. ?

@ tchaOo°

Commentaire de LPUnderground le 14/04/2009 09:25:48

Exemple (au début de ton code) :

if(!is_array($formdata) && !is_object($formdata))
return false;
elseif(empty($formdata))
return '';

J'aurais écrit cela :

if ( ! is_array ( $formdata ) && ! is_object ( $formdata ) )
{
   return FALSE;
}
else if ( empty ( $formdata ) )
{
   return '';
}

Bon bien sur, je peux pas te reprocher ça, étant donné que cela dépend de la manière de coder des gens  ; )

Commentaire de kankrelune le 14/04/2009 11:31:21

Je vois toujours pas pourquoi tu dis ça... hormis les accolades il n'y a pas de différence entre ton code et mon code et je ne vois pas l'interêt de faire un bloc de condition pour une seule instruction... .. .

Qui plus est je ne vois pas le rapport avec les espaces... si tu parle de l'indentation de mon code c'est surement parce que tu as utilisé firefox lorsque tu as récupéré le code... fais un copié collé à partir d'IE et tu retrouvera l'indentation comme sur la présentation du code... .. . ;o)

@ tchaOo°

Commentaire de LPUnderground le 17/04/2009 11:01:28

Comme je l'ai dit ça dépend que de nous, de la façon dont on code.

Personnellement pour de longs codes (pour des scripts, sites, etc), je préfère faire des blocs de condition même s'il y a qu'une seule exéctuin.

Les espaces, c'est ma façon à moi d'écrire du code, après certes tu fais comme tu veux.
Il y a une différence entre "mon" code et le tien, moi j'aime bien espacer  : )

Je te remercie encore pour ton code.

Commentaire de kankrelune le 17/04/2009 12:17:21

les espaces en trop ne servent qu'a rajouter des octets inutile dans le code...

if(isset($pwet))

est aussi lisible que...

if( isset ($pwet) )

Ca n'a rien à voir avec l'indentation du code... après à chacun sa façon de coder mais dans ce cas je ne vois pas l'intérêt d'enlever des points à une note parce qu'il manque des espaces à TON gout... c'est comme enlever des points parce que j'aurais préféré que la variable $pwet s'appelle $plop... bref... discussion inutile et sans intérêt à mon sens... merci pour ton com, bonne continuation... .. . :o)

@ tchaOo°

ps: au boulot je bosse actuellement sur une source d'à peu près 45000 lignes et personnellement je trouve tout aussi clair et même plus clair un bloc de condition simple sans accolade... mais comme tu l'as dis c'est une question d'habitude... les gouts et les couleurs... .. . ;o)

 Ajouter un commentaire


Discussions en rapport avec ce code source dans le forum

formulaire qui rempli un tableau [ par simspid ] bonjour voila je vais essayer d'expliquer mon problème le mieux possible mon père est président d'un association de tarot pour plus de commodité je l Problème requête HTTPS [ par newsdas ] Bonjour à tous les pro. Je travaille depuis peu sur une application web où j'effectue des Requêtes HTTP pour communiquer avec un serveur distant. Je r Rewrite URL [ par vishwas ] Bonjour à tous; J'essaye depuis une dizaine d'heures de changer l'url qui apparaît dans la barre de navigation par un fichier htaccess, par exemple; interrogation bd [ par joujma5 ] Bonsoir, je travaille sur un projet pour une école, je dois afficher pour chaque enseignant uniquement les classes qui sont sous sa responsabilité mai URL rewritting [ par tex73 ] salut à tous! j'ai un site dont les urls sont de la forme: http://www.mondomaine.com/index.php?page=mapage&var1=A&var2=B&var3=C... et je souhaiterai o [BAR]Musique html [ par Pammachio ] Bonjour, je suis à la recherche d&#8217;un script pour insérer un lecteur de pistes audio sur une page web écrite en html. Parmi les fonctions qui me [BAR]Question sur facebook [ par Pammachio ] Salut à tous. Un ami m&#8217;a demandé de lui créer plusieurs comptes facebook car il n&#8217;y arrive pas (ce n&#8217;est pas une bête en informatiqu liens images xml rss [ par wallysub ] Bonjour, j'essaye de trouver une solution au probleme d'affichage des images sur le lecteur magpierss. sur certains flux rss (xml) les liens des image Extraire une donnée d'un objet stocké dans un tableau : comment faire ? [ par slhuilli ] Bonjour à tous, Je fais du dev depuis 10 en procedural et là je suis en train d'appréhender l'objet avec bcp de mal. Voici ce que j'ai fait et qui fo


Nos sponsors


Sondage...

Comparez les prix

CalendriCode

Février 2012
LMMJVSD
  12345
6789101112
13141516171819
20212223242526
272829    

Consulter la suite du CalendriCode

Photothèque

 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 3,588 sec (3)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales