Fonction PHP pour créer une chaîne de requête à partir d'un tableau

165

Je recherche le nom de la fonction PHP pour créer une chaîne de requête à partir d'un tableau de paires clé / valeur. Veuillez noter que je recherche la fonction PHP intégrée pour ce faire, pas une fonction homebrew (c'est tout ce qu'une recherche Google semble retourner). Il y en a un, je ne me souviens pas de son nom ou je ne le trouve pas sur php.net. IIRC son nom n'est pas si intuitif.

Robin Barnes
la source

Réponses:

312

Vous cherchez http_build_query().

TJ L
la source
Il s'agit d'une toute nouvelle fonction, disponible à partir de PHP 5.
Calmarius
15
Soyez prudent avec cette fonction! Il omettra toute paire clé-valeur dont la valeur est NULL. echo http_build_query(array("foo"=>"bar","bar"=>null))produira uniquementfoo=bar
cb0
@ cb0 cela fonctionne de la même manière que les formulaires soumis dans un navigateur, un champ de saisie vide ne sera pas inclus dans la requête soumise.
TJ L
1
@ceejayoz Eh bien, vous le savez depuis longtemps maintenant ... Votre souhait est devenu réalité?
Andrew
21

Voici une implémentation simple et conviviale pour php4:

/**
* Builds an http query string.
* @param array $query  // of key value pairs to be used in the query
* @return string       // http query string.
**/
function build_http_query( $query ){

    $query_array = array();

    foreach( $query as $key => $key_value ){

        $query_array[] = urlencode( $key ) . '=' . urlencode( $key_value );

    }

    return implode( '&', $query_array );

}
0x6A75616E
la source
30
ceci est une version php4.
0x6A75616E
1
Lors de son décodage, PHP semble également décoder en pourcentage la clé. Cela vaut peut-être la peine de le faire ici?
cloudfeet
@cloudfeet semble raisonnable de le faire. Merci de l'avoir signalé.
0x6A75616E
2

Juste comme complément de @thatjuanla réponse.
Version PHP4 plus compatible de ceci:

if (!function_exists('http_build_query')) {
    if (!defined('PHP_QUERY_RFC1738')) {
        define('PHP_QUERY_RFC1738', 1);
    }
    if (!defined('PHP_QUERY_RFC3986')) {
        define('PHP_QUERY_RFC3986', 2);
    }
    function http_build_query($query_data, $numeric_prefix = '', $arg_separator = '&', $enc_type = PHP_QUERY_RFC1738)
    {
        $data = array();
        foreach ($query_data as $key => $value) {
            if (is_numeric($key)) {
                $key = $numeric_prefix . $key;
            }
            if (is_scalar($value)) {
                $k = $enc_type == PHP_QUERY_RFC3986 ? urlencode($key) : rawurlencode($key);
                $v = $enc_type == PHP_QUERY_RFC3986 ? urlencode($value) : rawurlencode($value);
                $data[] = "$k=$v";
            } else {
                foreach ($value as $sub_k => $val) {
                    $k = "$key[$sub_k]";
                    $k = $enc_type == PHP_QUERY_RFC3986 ? urlencode($k) : rawurlencode($k);
                    $v = $enc_type == PHP_QUERY_RFC3986 ? urlencode($val) : rawurlencode($val);
                    $data[] = "$k=$v";
                }
            }
        }
        return implode($arg_separator, $data);
    }
}
vp_arth
la source
-2

Comme cette question est assez ancienne et pour PHP, voici un moyen de le faire dans le framework PHP Laravel (actuellement) très populaire.

Pour encoder la chaîne de requête pour un chemin dans votre application, donnez les noms de vos routes , puis utilisez la route()fonction d'assistance comme ceci:

route('documents.list.', ['foo' => 'bar']);

Le résultat ressemblera à quelque chose comme:

http://localhost/documents/list?foo=bar

Sachez également que si votre route a des paramètres de segment de chemin /documents/{id}, par exemple , assurez-vous de passer également un idargument aux route()paramètres, sinon il utilisera par défaut la valeur du premier paramètre.

alexkb
la source
-3

Implode combinera un tableau en une chaîne pour vous, mais pour créer une requête SQL sur une paire kay / valeur, vous devrez écrire votre propre fonction.

Cliquez sur Upvote
la source
J'ai essayé mais cela ne fonctionnera pas. J'essaie de créer une chaîne de requête http qui nécessite à la fois les clés et les valeurs du tableau, imploser ne peut pas faire cela.
Robin Barnes
2
Je vois, je ne savais pas si vous vouliez dire une chaîne de requête SQL ou une chaîne de requête http.
Cliquez sur Upvote