Mam problem z tą odpowiedzią, ponieważ nie działa, jeśli użyjesz tego samego klucza wiele razy (tak, ponieważ w tablicy php klucze są unikalne). W ?key=lorem&key=ipsumrezultacie powstanie array(["key"]=>"ipsum")pytanie: czy istnieje funkcja pozwalająca uzyskać s.th. lubię to, array(["key"]=>array("lorem", "ipsum"))czy muszę samodzielnie utworzyć tę funkcję?
MaBi
11
Technicznie PHP potraktowałoby to ?key=lorem&key=ipsumtak, jakbyś podał tylko, key=ipsumjeśli byłby to ciąg zapytania w adresie URL. I myślę, że ponowne użycie klucza i uznanie za spójne wyniki lub że wszystkie wystąpienia klucza zostaną zachowane, jest uważane za nieprawidłowe. Prawidłowe podejście, przynajmniej dla ciągu zapytania wysłanego do PHP, byłoby takie ?key[]=lorem&key[]=ipsum, więc twoje własne podejście może szukać wszelkich przypadków, w &{x}=których x występuje więcej niż jeden raz i zastąpić x[](i traktować? Tak samo jak &)
To było pomocne! ?key[]=lorem&key[]=ipsumKilka tygodni temu postanowiłem zrobić to w ten sposób . Ale dziękuję za udostępnienie linku!
MaBi
2
Należy uważać na ciągi zawierające „+”, takie jak [email protected]. Zostaną one sparsowane przez parse_str do spacji. klucz = myemail [email protected].
dudeman
61
Czasami parse_str()sam jest dokładny, może wyświetlać na przykład:
To jest kod PHP do dzielenia zapytania w mysql i 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;}
Przykład:
Zapytanie wcześniej
wybierz xx od xx wybierz xx, (wybierz xx) od xx gdzie y = 'cc' wybierz xx od xx lewy dołącz (wybierz xx) gdzie (wybierz top 1 xxx od xxx) lub oder przez xxx desc ";
Zapytanie po
wybierz xx z xx
wybierz xx, (wybierz xx) z xx gdzie y = „cc”
wybierz xx od xx lewe dołącz (wybierz xx) gdzie (wybierz top 1 xxx od xxx) lub oder przez xxx desc
W przypadku tego konkretnego pytania wybrana odpowiedź jest prawidłowa, ale jeśli w adresie URL znajduje się nadmiarowy parametr - taki jak dodatkowe „e” - funkcja po cichu zawiedzie bez zgłoszenia błędu lub wyjątku:
a=2&b=2&c=5&d=4&e=1&e=2&e=3
Wolę więc używać własnego parsera:
//$_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" }
Teraz masz wszystkie wystąpienia każdego parametru we własnej tablicy, zawsze możesz je scalić w jedną tablicę, jeśli chcesz.
Nigdy nie powinieneś mieć tej samej nazwy parametru zapytania o różnych wartościach. To nie ma sensu, ponieważ tylko jeden zostanie zaakceptowany.
Cristian,
3
@Cristian: „Nigdy nie powinieneś mieć tej samej nazwy parametru zapytania o różnych wartościach.” Masz rację, ale odpowiedź brzmi: „… URL, który funkcja po cichu zawiedzie bez zgłoszenia błędu lub wyjątku”. Co może zepsuć aplikację. Chociaż ta odpowiedź nie jest świetna, uwypukla problem. Zwłaszcza jeśli twoja aplikacja może zostać zawieszona przez kogoś, kto po prostu samowolnie
?key=lorem&key=ipsum
rezultacie powstaniearray(["key"]=>"ipsum")
pytanie: czy istnieje funkcja pozwalająca uzyskać s.th. lubię to,array(["key"]=>array("lorem", "ipsum"))
czy muszę samodzielnie utworzyć tę funkcję??key=lorem&key=ipsum
tak, jakbyś podał tylko,key=ipsum
jeśli byłby to ciąg zapytania w adresie URL. I myślę, że ponowne użycie klucza i uznanie za spójne wyniki lub że wszystkie wystąpienia klucza zostaną zachowane, jest uważane za nieprawidłowe. Prawidłowe podejście, przynajmniej dla ciągu zapytania wysłanego do PHP, byłoby takie?key[]=lorem&key[]=ipsum
, więc twoje własne podejście może szukać wszelkich przypadków, w&{x}=
których x występuje więcej niż jeden raz i zastąpićx[]
(i traktować? Tak samo jak &)?key[]=lorem&key[]=ipsum
Kilka tygodni temu postanowiłem zrobić to w ten sposób . Ale dziękuję za udostępnienie linku!Czasami
parse_str()
sam jest dokładny, może wyświetlać na przykład:parse_str () zwróci:
Lepiej byłoby połączyć
parse_str()
zparse_url()
:źródło
$_SERVER['QUERY_STRING']
Korzystanie
parse_str()
.źródło
Użyj http://us1.php.net/parse_str
Uwaga, jego użycie to:
nie
źródło
parse_str($str,&$arr);
straszny błądJeśli masz problem z konwersją ciągu zapytania na tablicę z powodu zakodowanych znaków ampersands
następnie użyj
html_entity_decode
Przykład:
źródło
Istnieje kilka możliwych metod, ale dla ciebie jest już wbudowana
parse_str
funkcjaźródło
Jest to jeden wiersz dla parsowania zapytania z bieżącego adresu URL do tablicy:
źródło
Możesz użyć funkcji łańcuchowej PHP,
parse_str()
a następnieforeach
pętli.źródło
To jest kod PHP do dzielenia zapytania w mysql i mssql
Przykład:
Zapytanie wcześniej
wybierz xx od xx wybierz xx, (wybierz xx) od xx gdzie y = 'cc' wybierz xx od xx lewy dołącz (wybierz xx) gdzie (wybierz top 1 xxx od xxx) lub oder przez xxx desc ";
Zapytanie po
wybierz xx z xx
wybierz xx, (wybierz xx) z xx gdzie y = „cc”
wybierz xx od xx lewe dołącz (wybierz xx) gdzie (wybierz top 1 xxx od xxx) lub oder przez xxx desc
Dziękuję, z Indonezji Sentrapedagang.com
źródło
W przypadku tego konkretnego pytania wybrana odpowiedź jest prawidłowa, ale jeśli w adresie URL znajduje się nadmiarowy parametr - taki jak dodatkowe „e” - funkcja po cichu zawiedzie bez zgłoszenia błędu lub wyjątku:
Wolę więc używać własnego parsera:
Teraz masz wszystkie wystąpienia każdego parametru we własnej tablicy, zawsze możesz je scalić w jedną tablicę, jeśli chcesz.
Mam nadzieję, że to pomaga!
źródło