Pobranie wartosci z linku przepisanego do zmiennej

Języki, których efekty są wykonywane po stronie serwera. PHP, ASP czy CGI w połączeniu z bazami danych SQL dają niezwykłe możliwości budowy i zarządzania stron WWW. Tu zadajemy pytania oraz demonstrujemy kod, z którym mamy problem.
pavelw
Nowy
Nowy
Posty: 28
Rejestracja: wt gru 20, 2005 5:45 pm

Pobranie wartosci z linku przepisanego do zmiennej

Post autor: pavelw »

Załóżmy, że mamy taki link: http://www.strona.pl?wartosc=1&nazwa=2

Jeśli taki link jest normalnie wpisany w przeglądarce to żeby pobrać wartość wystarczy użyć $_GET[wartosc] a czy jest podobna możliwość żeby pobrać ja jeśli link jest przypisany załóżmy do zmiennej $link = "http://www.strona.pl?wartosc=1&nazwa=2" ?
gorylek
Zaczyna działać
Zaczyna działać
Posty: 427
Rejestracja: śr gru 19, 2007 7:29 pm

Re: Pobranie wartosci z linku przepisanego do zmiennej

Post autor: gorylek »

To może się wdawać odrobinę dzikie ale ma swoje praktyczne strony:

Kod: Zaznacz cały

$link = "http://www.strona.pl?wartosc=1&nazwa=2"
Krok pierwszy:

Kod: Zaznacz cały

$adres = explode('?',$link)
Teraz w $adres pod $adres[0] masz adres http://www.strona.pl a dalej w $adres[1] masz parametry.

Krok drugi:

Kod: Zaznacz cały

$parametry = explode('&',$adres[1]);
Teraz w $parametry, każde element tablicy poczynając od zera ma coś takiego ($parametry[0],$parametry[1] itp...):
wartosc=1
nazwa=2
costam=69
itp...

Krok trzeci:

Kod: Zaznacz cały

$limit = count($parametry);
for($i=0;$i<$limit;$i++) {
    $temp = explode('=',$parametry[$i];
    $zmienne[$temp[0]] = $temp[1];    
}
I w ten sposób tablice $zmienne wygląda kropka w kropkę tak samo jak $_GET.

Alternatywa

Można użyć parse_url() dostępne w PHP by wyciągnąć to co Cie interesuje i przy okazji rozbić Twój adres na czynniki pierwsze.
parse_url() na php.net.pl

Wtedy krok pierwszy będzie wyglądał tak:

Kod: Zaznacz cały

$adres = parse_url($link);
To co znajduje się po ? czyli parametry nasze będzie wtedy pod $adres['query']. Znowu $adres['query'] można potraktować parse_str w ten sposób:

Kod: Zaznacz cały

$parametry = Array();
parse_str($adres,$parametry)
Wtedy otrzymasz coś takiego:
$parametry['wartosc'] == 1;
$parametry['nazwa'] == 2;

W skrócie - podejścia są dwa - proponuje to drugie. Chciałem tylko pokazać że się da :-) No i parse_str ma znacznie większe możliwości. Przykładowo poprzez link możesz przekazać tablicę. O ile parse_str weźmie to od uwagę o tyle mój sposób wyżej już nie. Są też inne przypadki.
Aha... uważaj tylko na kropkę. Jeżeli parsował byś coś w stlu cos.class = 4 to parse_str zamieni to na cos_class = 4. Tak na przyszłość.
pavelw
Nowy
Nowy
Posty: 28
Rejestracja: wt gru 20, 2005 5:45 pm

Re: Pobranie wartosci z linku przepisanego do zmiennej

Post autor: pavelw »

dzieki za pomoc, coś z tego się zrobi
Keph
Nowy
Nowy
Posty: 23
Rejestracja: śr gru 06, 2006 10:48 pm
Kontakt:

Re: Pobranie wartosci z linku przepisanego do zmiennej

Post autor: Keph »

gorylek pisze: Krok pierwszy:
Pierwszy wariant strasznie nieoptymalnie, bo ten pierwszy explode() nie ma kompletnie sensu, a trzeci też jakoś naokoło. Tak z głowy proponowałbym

Kod: Zaznacz cały

$link = "http://www.strona.pl?wartosc=1&nazwa=2";
$obrobka = substr($link, strpos($link, '?')); //*
$obrobka = explode('&', $obrobka);
$efekt_koncowy = array();
foreach ($obrobka as $kombinacja) {
   list($zmienna, $nazwa) = explode('=', $kombinacja);
   $efekt_koncowy($zmienna) = $nazwa; //**
}
print_r($efekt_koncowy);
I w ten sposób otrzymujemy associative array, gdzie $efekt_koncowy['nazwa_zmiennej'] = 'wartosc_zmiennej'. Za kod nie ręczę - ot, takie coś na szybko na kolanie ;)

*głowy nie dam, być może do strpos() trzeba dodać lub odjąć 1
**naturalnie, jeśli nie chcemy otrzymać associative array'a, robimy jakieś inne przypisanie do jakichś innych zmiennych
gorylek
Zaczyna działać
Zaczyna działać
Posty: 427
Rejestracja: śr gru 19, 2007 7:29 pm

Re: Pobranie wartosci z linku przepisanego do zmiennej

Post autor: gorylek »

Keph, pomyśl człowieku odrobinę. Jeżeli potrzebne Ci to co jest przed ? to explode jak najbardziej.
Po drugie dalej zrobiłeś praktycznie to samo tylko przy pomocy innej pętli i innych instrukcji. Jeżeli widzisz różnicę to gratuluję. Bo ja przepuściłem oba rozwiązania przez xdebug tak dla pewności i wiesz co ? Sam sprawdź.
Keph
Nowy
Nowy
Posty: 23
Rejestracja: śr gru 06, 2006 10:48 pm
Kontakt:

Re: Pobranie wartosci z linku przepisanego do zmiennej

Post autor: Keph »

Dude, chill.

Co do "tego, co przed '?'" - OP pytał o pozyskiwanie samych wartości i podał przykładowy link z ?wartosc=1&nazwa=y. Dla mnie w tym momencie pierwszy explode() na znak zapytania w takim przypadku traci sens.

Ale ok, załóżmy, że pavelw potrzebuje również tego, co jest przed '?'. Wtedy przyznaję, explode() się przyda, chociaż osobiście zrobiłbym to z list(), o tak (najistotniejsza jest trzecia linijka):

Kod: Zaznacz cały

$link = "http://www.strona.pl?wartosc=1&nazwa=2";
$efekt_koncowy = array();
list($efekt_koncowy["adres"], $obrobka) = explode("?", $link);
$obrobka = explode('&', $obrobka);
foreach ($obrobka as $kombinacja) {
   list($zmienna, $nazwa) = explode('=', $kombinacja);
   $efekt_koncowy($zmienna) = $nazwa;
}
print_r($efekt_koncowy);
Ale, jak to się mówi, każdemu jego porno ;)
gorylek
Zaczyna działać
Zaczyna działać
Posty: 427
Rejestracja: śr gru 19, 2007 7:29 pm

Re: Pobranie wartosci z linku przepisanego do zmiennej

Post autor: gorylek »

Co do "tego, co przed '?'" - OP pytał o pozyskiwanie samych wartości i podał przykładowy link z ?wartosc=1&nazwa=y. Dla mnie w tym momencie pierwszy explode() na znak zapytania w takim przypadku traci sens.
Mały drobiazg. Jeżeli w ogóle pomyślałeś by przeczytać post autora tematu to wiedział byś do czego chce użyć. Gdybaniem sobie można :P Poza tym jak byś nie zauważył - dałem mu kompletne i wydajne rozwiązanie przy drugim sposobie. Pierwszy pokazuje jak to ładnie rozłożyć jeżeli chcieli byśmy coś kiedyś podobnego zrobić czymś innym ale ręcznie - jako ciekawostkę.
Na koniec dodam że to co zrobiłeś to zamienienie 2-elementowej tablicy na 2 zmienne i tyle. Nie wiem czy to zrozumiesz. O ile komuś może wydawać się to czytelniejsze o tyle nie sprawia to kompletnej różnicy w działaniu skryptu.

Chodzi po prostu o to że szczerze mnie rozbawiłeś tym że nazwałeś rozwiązanie (opcjonalne jak byś jeszcze nie zauważył) nieoptymalnym by później bezmyślnie przyklepać je ponownie zmieniając raptem dwa nic nie znaczące drobiazgi (zastosowanie foreach i list).
Keph
Nowy
Nowy
Posty: 23
Rejestracja: śr gru 06, 2006 10:48 pm
Kontakt:

Re: Pobranie wartosci z linku przepisanego do zmiennej

Post autor: Keph »

gorylek pisze:Jeżeli w ogóle pomyślałeś by przeczytać post autora tematu to wiedział byś do czego chce użyć.
Kulą w płot ten atak. A widzę też, że nie przeczytałeś mojego ostatniego posta tutaj.

Może krótsza piłka, w formie dwóch pytań:

1. Zgadzamy się, że jeśli chodziło mu tylko o wartości, a nie o sam bazowy url, to pierwszy explode() w Twoim kodzie jest bez sensu?
2. Zgadzamy się też, że w moim rozwiązaniu eliminujemy trzy zmienne, których używasz przy ostatnim explodzie ($i nie liczę), jak również operację count()?

I jeszcze, już kompletnie poza konkursem, ustaliliśmy, że pierwszy wariant jest li tylko ciekawostką (nawiasem mówiąc, skoro piszesz, że podany jako ciekawostka, to nie rozumiem, czemu nie podałeś go w drugiej kolejności), w związku z tym cała dyskusja o nim ma charakter raczej akademicki, right?
gorylek
Zaczyna działać
Zaczyna działać
Posty: 427
Rejestracja: śr gru 19, 2007 7:29 pm

Re: Pobranie wartosci z linku przepisanego do zmiennej

Post autor: gorylek »

Ty widzę chyba czegoś nie rozumiesz. Sugestia dla Ciebie, przynajmniej się czegoś nauczysz. Kojarzysz coś co się zwie xdebug ? Przepuść oba skrypty i porównaj raport :-) Tłumaczyć widzę nie ma sensu. Poza tym nic nie wyeliminowałeś a zastąpiłeś zaś operacja count jest tak debilnie prosta i szybka oraz operuje na tablicach o tak małym rozmiarze że nie mamy z niej żadnego wartego uwagi narzutu. A wyciągnięta przed for jest po to by nie była przeprowadzana przy każdym przebiegu pętli.
Keph
Nowy
Nowy
Posty: 23
Rejestracja: śr gru 06, 2006 10:48 pm
Kontakt:

Re: Pobranie wartosci z linku przepisanego do zmiennej

Post autor: Keph »

Czyli: oba skrypty wykonują się porównywalnie sprawnie, w granicach błędu statystycznego. Tak?
gorylek
Zaczyna działać
Zaczyna działać
Posty: 427
Rejestracja: śr gru 19, 2007 7:29 pm

Re: Pobranie wartosci z linku przepisanego do zmiennej

Post autor: gorylek »

Zgadłeś. Twój komentarz po prostu sugerował że nie masz pojęcia czym jest optymalizacja skryptu - a przynajmniej mogło by się tak wydawać. Stąd mój komentarz.

No i na prawdę sugeruję Ci byś poznał genialne narzędzie jakim jest xdebug. Rozłoży Ci skrypt na czynniki pierwsze i pozwoli wyszukać tzw "wąskie gardła".
Keph
Nowy
Nowy
Posty: 23
Rejestracja: śr gru 06, 2006 10:48 pm
Kontakt:

Re: Pobranie wartosci z linku przepisanego do zmiennej

Post autor: Keph »

Czyli otrzymujemy dwa porównywalnie szybkie skrypty, z których jeden jest o kilkadziesiąt procent* krótszy? ;)

Nie zrozum mnie źle, ja po prostu lubię tego rodzaju nerd-puzzle, gdzie jeżeli coś da się zrobić lepiej, to w sumie czemuby nie :)

A co do xdebuga - dzięki za przypomnienie, że takie coś istnieje. Kojarzy mi się, że było toto chyba zintegrowane z NetBeansami, ale gryzło się trochę z codeIgniterem, więc na codzień używam raczej CI'owego benchmarking class'a i chytrze porozmieszczanych echo i die() ;)

*nie, żeby w tym przypadku to robiło jakąś znaczącą różnicę
gorylek
Zaczyna działać
Zaczyna działać
Posty: 427
Rejestracja: śr gru 19, 2007 7:29 pm

Re: Pobranie wartosci z linku przepisanego do zmiennej

Post autor: gorylek »

A co do xdebuga - dzięki za przypomnienie, że takie coś istnieje. Kojarzy mi się, że było toto chyba zintegrowane z NetBeansami, ale gryzło się trochę z codeIgniterem, więc na codzień używam raczej CI'owego benchmarking class'a i chytrze porozmieszczanych echo i die() ;)
Na prawdę dowiedz się co to xdebug bo nie masz pojęcia z tego co czytam. Znajdź sobie też coś ciekawego do interpretacji raportów. Co do skryptu to patrzę i patrzę i nie mogę zrozumieć w którym miejscu to krótsze jest, szybsze na pewno nie jest. Dla nerdów pozostaje druga wersja (2 instrukcje w końcu :P).
Keph
Nowy
Nowy
Posty: 23
Rejestracja: śr gru 06, 2006 10:48 pm
Kontakt:

Re: Pobranie wartosci z linku przepisanego do zmiennej

Post autor: Keph »

Tam dla nerdów. Dla nerdów to jest assembler i malbolge, ewentualnie LOLCODE. :P
gorylek
Zaczyna działać
Zaczyna działać
Posty: 427
Rejestracja: śr gru 19, 2007 7:29 pm

Re: Pobranie wartosci z linku przepisanego do zmiennej

Post autor: gorylek »

Jakoś za nerda się nie uważam a w assemblerze nie jedno w życiu wyklepałem :P
ODPOWIEDZ