Autor Zpráva
capricorn
Profil
Zdravim, mam problem s tim, ze nemuzu zobrazit hodnoty za prvnim separatorem v url. $_GET normalne funguje, ale kdyz je v url seperator, tak se vsechno od prvniho separatoru odrizne a hodi to NOTICE na ty hodnoty, ktere se odrizly.

Vyzkousel jsem:
$_SERVER['QUERY_STRING'] ; // zobrazi vsechno
print_r($_GET); // vsechno pred prvnim separatorem zobrazi a vsechno od prvniho separatoru odrizne.

Ale pokud dam print($_GET) primo do indexu a ne do includovaneho souboru, tak se vsechno zobrazi spravne.

Nevi nekdo, cim takove zahadne chovani muze byt?
nightfish
Profil
$_GET normalne funguje, ale kdyz je v url seperator, tak se vsechno od prvniho separatoru odrizne a hodi to NOTICE na ty hodnoty, ktere se odrizly.
tomu asi nerozumím, nebyl by příklad (ideálně URL, výpis $_GET a kopie těch NOTICE)?

Ale pokud dam print($_GET) primo do indexu a ne do includovaneho souboru, tak se vsechno zobrazi spravne.
před tím includem se s $_GET nějak manipuluje?
capricorn
Profil
nightfish

před tím includem se s $_GET nějak manipuluje?
Ano, manipuluje a ted jsem zjistil, ze to dela nasledujici funkce, ale tento jev si nedokazu vysvetlit, protoze do te chvile nez jsem udelal upgrade php, tak to fungovalo. Mam tam v te funkci nejakou chybu nebo proc tomu tak je?


function priprav_odkaz($hodnoty = array()){

$get = array();
foreach($hodnoty as $klic => $promenna){
unset($_GET[$klic]);
if($promenna != '') {$_GET[$klic] = $promenna;}
}
foreach($_GET as $klic => $promenna){
if(($klic != 'kategorie') && ($klic != 'hledej')){
$get[] = $klic . "=" . $promenna;
}
}
if(count($get) == 0){
return false;
} else {
return "?".implode("&", $get)."";
}
}

BetaCam
Profil
capricorn

Já teda nevim, ale přijde mi to docela normální. Ty někde v indexu z pole $_GET unsetuješ hodnoty pomcí té funkce co si sem poslal tak je logické, že je později už v poli $_GET nebudeš mít.

Sice ted sem si uvědomil, že to sice posléze hned v té funkci setuješ, ale vlastně z pole $_GET odstraníš vše krom toho co pošleš jako array té tvé funkci.
capricorn
Profil
BetaCam

Dobre, ale me normalni nepripada, protoze v php4 to normalne fungovalo. Mam za /?search=neco&limit=20

echo priprav_odkaz();
// ?search=neco

print_r($_GET);
// Array ( [kategorie] => blablabla [search] => neco

Jo a tu funkci nevolam, ta slouzi k necemu jinemu, ted proste chci zobrazit hodnuty z $_GET['limit'] a ono nic, zobrazi Notice: Undefined index: limit in ....
BetaCam
Profil
capricorn
Dobre, ale me normalni nepripada, protoze v php4 to normalne fungovalo

Ten můj předchozí post ber s rezervou protože i po této funkci zůstane pole $_GET stejné.


Mam za /?search=neco&limit=20 

echo priprav_odkaz(); 
// ?search=neco 

print_r($_GET); 
// Array ( [kategorie] => blablabla [search] => neco 


Už jenom tohle je blbost, protože pokud máš v URL "?search=neco&limit=20" tak kde se ti potom v print_r($_GET); veme [kategorie] => blablabla Vždyť to nemáš v URL tak kde se to bere v GET??
capricorn
Profil
BetaCam

Ten můj předchozí post ber s rezervou protože i po této funkci zůstane pole $_GET stejné.
No jo, ale v mem pripade to tak neni, pole $_GET zustane stejne pokud v te funkci zrusim unset. Nemuzu mit treba neco spatne nastavene?
capricorn
Profil
BetaCam
Už jenom tohle je blbost, protože pokud máš v URL "?search=neco&limit=20" tak kde se ti potom v print_r($_GET); veme [kategorie] => blablabla Vždyť to nemáš v URL tak kde se to bere v GET??

URL: http://localhost/pocitace/?search=asus&limit=20

print_r($_GET);
// Array ( [kategorie] => pocitace [search] => asus [limit] => 20 )

echo priprav_odkaz();
// ?search=asus
BetaCam
Profil
capricorn

Aha tak sme už asi pomalu doma. Pošli sem rewrite pravidla co používáš.
Davex
Profil
Při volání priprav_odkaz(); bez parametru přece první cyklus vůbec neproběhne, tak jak by ti mohl odebírat hodnoty z pole $_GET? A kde se ti bere ten klíč "kategorie"? Podle mě tam máš ještě něco dalšího.
BetaCam
Profil
Davex
Při volání priprav_odkaz(); bez parametru přece první cyklus vůbec neproběhne, tak jak by ti mohl odebírat hodnoty z pole $_GET? A kde se ti bere ten klíč "kategorie"? Podle mě tam máš ještě něco dalšího.

No má tam rewrite také mi to přišlo podezřelé odkud se to tam bere. :)
capricorn
Profil
BetaCam

RewriteCond %{REQUEST_URI} ^/([A-Za-z0-9-]+)/?$
RewriteRule ^([A-Za-z0-9-]+)/$ index.php?kategorie=$1 [L,QSA]
capricorn
Profil
Ale stejne to bude tou funkci, protoze kdyz dam print($_GET) pred volanim te funkce, tak se spravne vsechno zobrazi, ale kdyz nejprve zvolam fuknci a potom print_r($_GET), tak se vymazou hodnoty, napr. ted ten limit.
BetaCam
Profil
capricorn
Ty tvoje dvě pravidla si nahraď za tohle :

RewriteEngine On
RewriteRule ^([A-Za-z0-9-]+)/$ index.php?kategorie=$1 [L,QSA]


Mimochodem jakou, že to máš verzi PHP??
capricorn
Profil
BetaCam

Zmena pravidel nepomohla. Mam verzi 5.2.6, ktere je soucasti WAMP 2.0
BetaCam
Profil
capricorn

Nainstaloval sem WAMP 2.0 povolil sem mod_rewrite a jinak sem žádné nastavení neměnil PHP je tam taky 5.2.6

.htaccess

RewriteEngine On
RewriteRule ^([A-Za-z0-9-]+)/$ index.php?kategorie=$1 [L,QSA]


index.php

<?php
error_reporting(E_ALL);
function priprav_odkaz($hodnoty = array()){
$get = array();
foreach($hodnoty as $klic => $promenna){
unset($_GET[$klic]);
if($promenna != '') {$_GET[$klic] = $promenna;}
}
foreach($_GET as $klic => $promenna){
if(($klic != 'kategorie') && ($klic != 'hledej')){
$get[] = $klic . "=" . $promenna;
}
}
if(count($get) == 0){
return false;
} else {
return "?".implode("&amp;", $get)."";
}
}
echo priprav_odkaz();
print_r($_GET);
?>


Zadal sem url :
http://localhost/jpw/pocitace/?search=asus&limit=20


výstup scriptu je :
?search=asus&limit=20

Array
(
    [kategorie] => pocitace
    [search] => asus
    [limit] => 20
)


Takže v té funkci problém neni. Máš tam chybu někde jinde.
capricorn
Profil
BetaCam

Tak zkus:

echo priprav_odkaz('limit' => '');
print_r($_GET);
BetaCam
Profil
capricorn
Tak zkus:

echo priprav_odkaz('limit' => '');
print_r($_GET);


No tak tam už tento problém je. Jenže zde už to není záhada. Zde toto způsobuje právě onen unset ve funkci.
Davex
Profil
Nemělo by být spíš následující?
echo priprav_odkaz(array('limit' => '')); 
capricorn
Profil
BetaCam

To ano, ale proc tohle fungovalo v php4 a v php5 to nefunguje. Spravne to nemelo ani fungovat v php4.

Davex

Ano melo, ale to ten problem neresi.
BetaCam
Profil
capricorn

Zkus použít místo té tvé funkce tuto :
function priprav_odkaz($preset = array()){
$get = array();
	foreach($preset as $key => $val){
		$_GET[$key] = $val;
	}
	foreach($_GET as $key => $val){
		if(($key != 'kategorie') && ($key != 'hledej') && ($val != '')){
				$get[] = $key."=".$val;
		}
	}
	if(empty($get)){ return false; }

	return "?".implode("&amp;", $get);
}
BetaCam
Profil
capricorn

Jinak opět bohužel musím podotknout, že i když ti ta přepsaná funkce co sem tu postnul bude fungovat. Jako že by měla. Tak je to podle mého názoru funkce naprosto nevhodně napsaná. Superglobální pole $_GET by nemělo sloužit k takovýmto účelům.
capricorn
Profil
BetaCam

Nevim, jak u Tebe, ale u mne je to porad stejne.
Pokud zvolam nejprve funkci priprav_odkaz(array('limit' => '')); a potom chci pracovat s $_GET['limit'], tak proste se nic nezobrazi, i kdyz v adresnim radku limit=20 je.
capricorn
Profil
BetaCam

A jak by jsi to tedy udelal, kdyby jsi chtel z nekterych odkazu hodnoty vymazat, ale zaroven by jsi s nima chtel dale pracovat?
BetaCam
Profil
capricorn

Ano to je logické. Protože ta funkce je prostě prasácky navržená. Uvědom si, že $_GET je superglobální pole, ale ty ho díky té tvé "šikovně" navržené funkci měníš za běhu.

Dej si na konec toho scriptu :

echo priprav_odkaz();
echo '<pre>';
print_r($_GET);
echo '</pre>';
echo priprav_odkaz(array('limit' => ''));
echo '<pre>';
print_r($_GET);
echo '</pre>';
echo priprav_odkaz(array('limit' => '30'));
echo '<pre>';
print_r($_GET);
echo '</pre>';
echo priprav_odkaz();
echo '<pre>';
print_r($_GET);
echo '</pre>';


Pak pochopíš co se tam vlastně děje. Měnit $_GET způsobem, jakým to děláš může vedst pouze k jednomu. K těžko odladitelným chybám.
capricorn
Profil
BetaCam

Abych nemenil $_GET za behu, tak ho vlozim na zacatku do noveho pole, se kterym pak budu v te funkci pracovat a tim padem ho nezmenim k dalsimu pouziti. Ted jsem si to v rychlosti vyzkousel a pomohlo to. Jinak ten navrh te funkce jsem nasel tady a jen jsem si to trosku poopravil k obrazu svemu. A prece uz vis, jak ty moje funkce vypadaji, jsou bud slozite nebo ted prasacky navrzene. ;-)
Ale stejne mne porad nejde do hlavy, proc to v php4 fungovalo a php5 nefunguje a je moc dobre, ze to nefunguje, alepson ted vim, cim to bylo.
BetaCam
Profil
capricorn
Abych nemenil $_GET za behu, tak ho vlozim na zacatku do noveho pole, se kterym pak budu v te funkci pracovat a tim padem ho nezmenim k dalsimu pouziti.

Gratuluju. Přesně to sem měl zhruba na mysli.

A prece uz vis, jak ty moje funkce vypadaji, jsou bud slozite nebo ted prasacky navrzene. ;-)

Nebo oboje. :) Doufám, že mě nebudeš brát jako někoho kdo tě furt kritizuju, ale prostě přijde mi to lepší než ti trochu poupravit nějakou prasárnu, která sice bude fungovat, ale jinak je to šílenost.

Jinak já bych to napsal asi zhruba nějak takto.

function createLink($preset = array()){
	$cache = array_merge($_GET, $preset);
	foreach($cache as $key => $val){
		if($val != '' AND $key != 'kategorie' AND $key != 'hledej'){
			$out[] = $key.'='.$val;
		}
	}
	if(empty($out)){ return false; }
	return "?".implode("&amp;", $out);
}
capricorn
Profil
BetaCam

Gratuluju. Přesně to sem měl zhruba na mysli.
Dekuji. ;-)

Nebo oboje. :) Doufám, že mě nebudeš brát jako někoho kdo tě furt kritizuju, ale prostě přijde mi to lepší než ti trochu poupravit nějakou prasárnu, která sice bude fungovat, ale jinak je to šílenost.
No to taky, priznavam. ;-) Urcite ne, jsem rad za kazdou kritiku, protoze strom se ma ohybat dokud je mlady, neplati to ted o mem veku, ale o mych dostavadnich zkusenostech z php. Muj vecny problem, v hlave si promitnu, jak nejaka cast kodu bude pracovat, ale proste nedokazu to ted udelat bez chybicek nebo bez zbytecne slozitosti anebo obojiho, takze jsem vazne vdecny za kazdou kritiku.

Co se tyce te funkce, tak opet smekam. Funkcnost te funkce je mne jasna, nejprve se slouci obe pole, potom pomoci cyklu se prochazi pole a na zaklade podminky a dochazi k ukladani do noveho pole, z ktereho se na konci vytvori cast odkazu. Nemam proste slov, jen opet dekuji za pomoc. ;-)

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm: