begin process at 2010 03 18 20:31:24
  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 :5 539

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 une capture PAGINATION EN PHP par Orangina
Source avec Zip POO - DEBUGGER par DiGhan
Source avec Zip CRAWLER DE SITE EN PHP par Mcjo
DÉCOUPAGE D'UN TEXTE EN FONCTION DES SAUTS DE LIGNES par biloubil
RÉCUPÉRER LE CHEMIN RELATIF D'UN OBJET PAR RAPPORT À LA RACI... par FredPsy

 Sources en rapport avec celle ci

Source avec Zip Source avec une capture RACCOURCISSEUR D'URL par hairai
Source avec Zip GESTION D'ESPACE MEMBRES par jmpicot
Source avec Zip EXÉCUTER DES REQUETE STYLE SQL SUR UN ARRAY par prince418
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

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

FreeTelecom et MySql [ par bigfootspi ] je n'y comprends rien !!! ca me depasse !!!j'ai fais un livre d'or qui marche tres bien (en local) mais le probleme, c'est que des qu'il est hebergé s URGENT une demande pour s'associer a mon projet [ par creagraphe ] creagraphe bonjour je vous demande de venir consulter mon tchatt pour savoir si la conception de mon tchatt pourrai vous inter demande pour se joindre a mon projet d'un tchatt en php [ par creagraphe ] creagraphe bonjour je vous demande de venir consulter mon tchatt pour savoir si la conception de mon tchatt pourrai vous inter Petit sondage [ par 0zeo ] Bonjour,Je realise en ce moment une étude de marché en vue de la creation d'un site communautaire d'aide sur le theme de l'hebergement. Si vous pouvie une superbe idée mais voila chez pas comment faire [ par creagraphe ] creagraphe ben voila j'ai bien eu une idée quelque notion mais bon si quelqun avai l'art et la manierer de pouvoir faire ce truc l rechercher dans une chaine urgent pour m'aider ,???? [ par creagraphe ] creagraphe http://creagraphe.fr.fm<a href="http://tchattez.fr.fm" ta Rezise, mais ou est la couleur ? [ par psycarik ] Salut,J'ai utilisé ce script pour redimmensionné mes images. http://www.phpcs.com/article.aspx?ID=558Je l'es légèrement modifié pour créer les aper Passage d'url trop long [ par matmax ] J ai un problème lorsque je veux passer un objet d'une page à une autre ou rappeller ma page avec un traitement different.J ai linéarisé mon objet mai hébergeur pas cher [ par eax ] salut!je viens de trouver un hébergeur pas trop cher, et j'aimerais savoir si qqun connait et a du bien ou du mal à me dire dessusil s'agit de adbd.or Problème de cookie ! [ par webdeb ] Désolé pour le 3e message mais les 2 autres ont des problèmes :Pour voir mon post, veuillez vous rendre iciMerci ! @ bientôt et bon


Nos sponsors


Sondage...

CalendriCode

Mars 2010
LMMJVSD
1234567
891011121314
15161718192021
22232425262728
293031    

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 : 0,952 sec (4)

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