Você deseja a parse_strfunção e precisa definir o segundo parâmetro para que os dados sejam colocados em uma matriz em vez de em variáveis individuais.
Eu tenho um problema com esta resposta, porque ela não funciona se você usar a mesma chave várias vezes (sim, porque as chaves da matriz php são únicas). Então ?key=lorem&key=ipsum, resultará em array(["key"]=>"ipsum")A questão é: existe uma função para obter s.th. assim array(["key"]=>array("lorem", "ipsum"))ou eu tenho que criar essa função por conta própria?
Mabi
11
Tecnicamente, o PHP também trataria ?key=lorem&key=ipsumcomo se você fornecesse apenas key=ipsumse essa fosse a string de consulta na URL. E acho que é considerado inválido reutilizar a chave e esperar resultados consistentes ou que todas as instâncias da chave sejam mantidas. A abordagem válida, pelo menos para uma string de consulta enviada ao PHP, seria ?key[]=lorem&key[]=ipsum, portanto, sua abordagem doméstica pode procurar por quaisquer ocorrências de &{x}=onde x ocorre mais de uma vez e substituir por x[](e tratando? O mesmo que &)
Isso foi útil! Decicei fazê-lo assim ?key[]=lorem&key[]=ipsumhá algumas semanas. Mas obrigado por compartilhar o link!
Mabi
2
Algo a ser observado são as strings que incluem '+', como [email protected]. Estes serão analisados por parse_str para um espaço. key = myemail [email protected].
dudeman
61
Às vezes, por parse_str()si só, a nota é precisa, ela pode exibir, por exemplo:
$url ="somepage?id=123&lang=gr&size=300";
parse_str () retornaria:
Array([somepage?id]=>123[lang]=> gr [size]=>300)
Seria melhor combinar parse_str()com parse_url()o seguinte:
Este é o código PHP para dividir a consulta no mysql e mssql
enter code here
function splitquery($strquery){
$arrquery=explode('select',$strquery);
$stry='';$strx='';for($i=0;$i<count($arrquery);$i++){if($i==1){
echo 'select '.trim($arrquery[$i]);}
elseif($i>1){
$strx=trim($arrquery[($i-1)]);if(trim(substr($strx,-1))!='('){
$stry=$stry.'
select '.trim($arrquery[$i]);}else{
$stry=$stry.trim('select '.trim($arrquery[$i]));}
$strx='';}}return $stry;}
Exemplo:
Consulta antes
selecione xx de xx selecione xx, (selecione xx) de xx onde y = 'cc' selecione xx de xx junção esquerda (selecione xx) onde (selecione 1 xxx de xxx) ou mais por xxx desc ";
Consulta após
selecione xx de xx
selecione xx, (selecione xx) em xx, em que y = 'cc'
selecione xx de xx junção esquerda (selecione xx) onde (selecione 1 xxx de xxx) ou od por xxx desc
Para esta pergunta específica, a resposta escolhida está correta, mas se houver um parâmetro redundante - como um "e" extra - no URL, a função falhará silenciosamente, sem que ocorra um erro ou exceção:
a=2&b=2&c=5&d=4&e=1&e=2&e=3
Então, eu prefiro usar meu próprio analisador da seguinte forma:
//$_SERVER['QUERY_STRING'] = `a=2&b=2&c=5&d=4&e=100&e=200&e=300`
$url_qry_str = explode('&', $_SERVER['QUERY_STRING']);//arrays that will hold the values from the url
$a_arr = $b_arr = $c_arr = $d_arr = $e_arr = array();foreach( $url_qry_str as $param ){
$var = explode('=', $param,2);if($var[0]=="a") $a_arr[]=$var[1];if($var[0]=="b") $b_arr[]=$var[1];if($var[0]=="c") $c_arr[]=$var[1];if($var[0]=="d") $d_arr[]=$var[1];if($var[0]=="e") $e_arr[]=$var[1];}
var_dump($e_arr);// will return ://array(3) { [0]=> string(1) "100" [1]=> string(1) "200" [2]=> string(1) "300" }
Agora você tem todas as ocorrências de cada parâmetro em sua própria matriz, sempre pode mesclá-las em uma matriz, se desejar.
Você nunca deve ter o mesmo nome de parâmetro de consulta com valores diferentes. Não faz sentido, pois apenas um será aceito de qualquer maneira.
Cristian
3
@ Christian: “Você nunca deve ter o mesmo nome de parâmetro de consulta com valores diferentes.” Você está correto, mas a resposta declara: "... a URL em que a função falhará silenciosamente sem que um erro ou exceção seja lançada". O que poderia quebrar um aplicativo. Embora essa resposta não seja ótima, ela destaca um problema. Especialmente se o seu aplicativo pode ser deixado de funcionar por alguém apenas arbitrariamente fazer uma solicitação com parâmetros extras jogados dentro.
?key=lorem&key=ipsum
, resultará emarray(["key"]=>"ipsum")
A questão é: existe uma função para obter s.th. assimarray(["key"]=>array("lorem", "ipsum"))
ou eu tenho que criar essa função por conta própria??key=lorem&key=ipsum
como se você fornecesse apenaskey=ipsum
se essa fosse a string de consulta na URL. E acho que é considerado inválido reutilizar a chave e esperar resultados consistentes ou que todas as instâncias da chave sejam mantidas. A abordagem válida, pelo menos para uma string de consulta enviada ao PHP, seria?key[]=lorem&key[]=ipsum
, portanto, sua abordagem doméstica pode procurar por quaisquer ocorrências de&{x}=
onde x ocorre mais de uma vez e substituir porx[]
(e tratando? O mesmo que &)?key[]=lorem&key[]=ipsum
há algumas semanas. Mas obrigado por compartilhar o link!Às vezes, por
parse_str()
si só, a nota é precisa, ela pode exibir, por exemplo:parse_str () retornaria:
Seria melhor combinar
parse_str()
comparse_url()
o seguinte:fonte
$_SERVER['QUERY_STRING']
Usando
parse_str()
.fonte
Use http://us1.php.net/parse_str
Atenção, seu uso é:
não
fonte
parse_str($str,&$arr);
um erro terrívelSe você estiver com problemas para converter uma string de consulta em uma matriz por causa de e comercial codificado
então não deixe de usar
html_entity_decode
Exemplo:
fonte
Existem vários métodos possíveis, mas para você, já existe uma função interna
parse_str
fonte
Esta é uma linha para analisar a consulta do URL atual na matriz:
fonte
Você pode usar a função de string PHP
parse_str()
seguida deforeach
loop.fonte
Este é o código PHP para dividir a consulta no mysql e mssql
Exemplo:
Consulta antes
selecione xx de xx selecione xx, (selecione xx) de xx onde y = 'cc' selecione xx de xx junção esquerda (selecione xx) onde (selecione 1 xxx de xxx) ou mais por xxx desc ";
Consulta após
selecione xx de xx
selecione xx, (selecione xx) em xx, em que y = 'cc'
selecione xx de xx junção esquerda (selecione xx) onde (selecione 1 xxx de xxx) ou od por xxx desc
Obrigado, da Indonésia Sentrapedagang.com
fonte
Para esta pergunta específica, a resposta escolhida está correta, mas se houver um parâmetro redundante - como um "e" extra - no URL, a função falhará silenciosamente, sem que ocorra um erro ou exceção:
Então, eu prefiro usar meu próprio analisador da seguinte forma:
Agora você tem todas as ocorrências de cada parâmetro em sua própria matriz, sempre pode mesclá-las em uma matriz, se desejar.
Espero que ajude!
fonte