query http_build_query example codificar array php urlencode

php - example - http_build_query() sin codificación url



query string php (10)

¿Hay alguna manera de usar http_build_query() sin tener que codificar según algún estándar de RFC?

Por qué no quiero que la URL codifique todo: estoy consultando la API de Ebay. Honestamente insisten en que los nombres de los parámetros no estén codificados en la URL, en lo que respecta a las comas entre paréntesis. Eg DomainName (0) es un parámetro y la consulta falla si esos pares están codificados.


Es posible que desee probar su API JSON en su lugar. Traté de obtener una muestra de trabajo, pero no tengo un nombre de aplicación, así que no puedo verificar el resultado. Aquí está el código:

<?php $appName = "Your App Name Here"; $post_data = array( ''jsonns.xsi'' => ''http://www.w3.org/2001/XMLSchema-instance'', ''jsonns.xs'' => ''http://www.w3.org/2001/XMLSchema'', ''jsonns.tns'' => ''http://www.ebay.com/marketplace/search/v1/services'', ''tns.findItemsByKeywordsRequest'' => array( ''keywords'' => ''harry potter pheonix'' ) ); $headers = array( "X-EBAY-SOA-REQUEST-DATA-FORMAT: JSON", "X-EBAY-SOA-RESPONSE-DATA-FORMAT: JSON", "X-EBAY-SOA-OPERATION-NAME: findItemsByKeywords", "X-EBAY-SOA-SECURITY-APPNAME: $appName" ); $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, ''http://svcs.ebay.com/services/search/FindingService/v1''); curl_setopt($ch, CURLOPT_HTTPHEADER, $headers); curl_setopt($ch, CURLOPT_POST, 1); curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($post_data)); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); $result = curl_exec($ch); if($result) { $response = json_decode($result); } curl_close($ch); ?>

Tendrá que completar $appName con el nombre de la aplicación. Además, el X-EBAY-SOA-OPERATION-NAME deberá establecerse en la llamada real y el JSON modificado si la llamada es diferente.


Estaba intentando crear una cadena GET para adjuntarla al final de una url como esta:

$get_params = array( ''include'' => array( ''enrollments'', ''current_grading_period_scores'' ), ''enrollment_type'' => array( ''student'', ), ); $get_params = http_build_query($get_params); $get_params = urldecode($get_params); $url = $domain.$slug; $url = $url.''?''.$get_params; echo $url;

que se imprime

include[0]=enrollments&include[1]=current_grading_period_scores&enrollment_type[0]=student

Pero a mi API no le gustaban los números entre corchetes, así que encontré una expresión regular que elimina los números:

preg_replace(''/[[0-9]+]/'', ''[]'', $get_params);

El código final, y el resultado -

$get_params = array( ''include'' => array( ''enrollments'', ''current_grading_period_scores'' ), ''enrollment_type'' => array( ''student'', ), ); $get_params = http_build_query($get_params); $get_params = urldecode($get_params); $get_params = preg_replace(''/[[0-9]+]/'', ''[]'', $get_params); $url = $domain.$slug; $url = $url.''?''.$get_params; echo $url;

Imprime -

include[]=enrollments&include[]=current_grading_period_scores&enrollment_type[]=student

Si alguien sabe de una mejor expresión regular, házmelo saber, soy un novato con eso.


Esto también podría funcionar

$fields = array( ''a'' => ''A'', ''b'' => ''B'' ); $separator = ''''; foreach($fields as $key=>$value) { $fields_string .= $separator . $key . ''='' . $value; $separator = ''&''; }


Intenté hacer esto recientemente https://gist.github.com/marcocesarato/4293986fe93139f04d8269aa3fbd47e9 La diferencia es que esta función es una matriz recursiva y compatible con PHP4. Puede gestionar aquí el urlencode

<?php /** * Build URL query params * as http_build_query build a query url the difference is * that this function is array recursive and compatible with PHP4 * * @author Marco Cesarato <[email protected]> * @param $query * @param string $parent * @return string * * @example * $p = array(''abbreviations'' => array(''google'' => ''ggle'', ''facebook'' => array(''abb_key'' => ''fbook'', ''fcbk'')), ''key'' => ''value''); * echo url_build_query($p); */ function url_build_query($query, $parent = null){ $query_array = array(); foreach($query as $key => $value){ $_key = empty($parent) ? urlencode($key) : $parent . ''['' . urlencode($key) . '']''; if(is_array($value)) { $query_array[] = url_build_query($value, $_key); } else { $query_array[] = $_key . ''='' . urlencode($value); } } return implode(''&'', $query_array); }


No, parece que siempre quiere codificar (lo que debería hacer es codificar URL al crear una lista de parámetros para una URL).

Podrías hacer tu propia ...

$params = array(''a'' => ''A'', ''b'' => ''B''); $paramsJoined = array(); foreach($params as $param => $value) { $paramsJoined[] = "$param=$value"; } $query = implode(''&'', $paramsJoined);

CodePad .


Puede usar la función urldecode() en una cadena de resultados que obtiene de http_build_query()


Puedes usar urldecode() . O use http_build_query con el argumento $ arg_separator .

$query_data= $data = array(''bar'', ''baz''=>''boom''); $numeric_prefix= ''test_''; $arg_separator = ''&''; $http_query = http_build_query ( $query_data, $numeric_prefix, $arg_separator ); var_dump( $http_query );

la salida de lo anterior es

string ''test_0=bar&baz=boom'' (length=19)

Prefijo numérico : si los índices de la matriz son números, esta cadena se agrega como prefijo en cada índice. En este caso, '' test_0 = bar'' .

arg_separator : se usa para separar argumentos. Si no se le da php usa el arg_separator.output definido en php.ini

Ver php http_build_query


http_build_query () es INVALIDO sin urlencoding. ¿Quizás lo codifique doblemente accidentalmente? Por ejemplo, intente crear una consulta http para esta matriz:

$params = array(''a'' => ''a&b=b'');

Sin codificación, obtendrías

a=a&b=b

Cuando está codificado correctamente, obtendría

a=a%26b%3Db

cual es correcta. Si omite la codificación, asegúrese de evitar los ataques de inyección de URL.


mi opinión sobre la respuesta de Alex, pero es más rápido

$params = array(''a'' => ''A'', ''b'' => ''B''); $query = ''''; foreach ($params as $param => $value) { $query .= $param.''=''.$value .''&''; } echo substr($query, 0, -1);


PHP 5.3.1 (Comportamiento de errores ) http_build_query SÍ escapa del carácter ''&'' ampersand que une los parámetros. Ejemplo: user_id=1&amp;setting_id=2 .

PHP 5.4+ http_build_query NO escapa al carácter ''&'' ampersand que une los parámetros. Ejemplo: user_id=1&setting_id=2

Ejemplo:

$params = array( ''user_id'' => ''1'', ''setting_id'' => ''2'' ); echo http_build_query($params); // Output for PHP 5.3.1: user_id=1&amp;setting_id=2 // NOTICE THAT: ''&'' character is escaped // Output for PHP 5.4.0+: user_id=1&setting_id=2 // NOTICE THAT: ''&'' character is NOT escaped

Solución al apuntar a múltiples versiones

Opción n. ° 1: escriba una función de contenedor:

/** * This will work consistently and will never escape the ''&'' character */ function buildQuery($params) { return http_build_query($params, '''', ''&''); }

Opción n. ° 2: abandone la función http_build_query y escriba la suya.