Autor Zpráva
Jiří Hradecký
Profil
Zdravím všechny,
snad se to tu ještě neřešilo, ale po asi 30ti minutách hledání jsem užitečnou odpověď nikde nenašel.

Mám několik webů, které v současné době přesouvám z hostingu kde bylo PHP 5.1.6 na hosting s PHP 5.3. Po přesunu nastala chyba u některých funkcí, respektive s využíváním defaultní hodnoty parametru.

Příklad (funkce se volá v souboru kam jsou předávány argumenty pomocí GET buď výška nebo šířka, ten který chybí se má nahradit defaultem)
<?
$W=300;
// $H v tomto případě není definován a měla by se použít hodnota 100
$XY=resize($W,$H);

function resize($width=100, $height=100){
.
.
$podil=$width/$height;
.
.
}
// $height se ve funkci chybně tváří jako nula tudíž Warning ... division by zero :-(
?>

Ještě dodám že řešení v kódu bych věděl např před volání funkce dát if(!isset($H)) ... ale tato funkce už slouží celkem dlouho a je použita v X projektech a opravdu ji nechci všude dohledávat a přepisovat pokud to nebude naprosto nezbytné.

O změně chování PHP ve verzi 5.3 co se týče práce s argumenty funkcí jsem nic nenašel.

ještě doplním, že když zkusím z volání druhý parametr vypustit tzn. $XY=resize($W); tak to normálně funguje. zatímco varianty resize($W,"") a resize($W,NULL) prostě ne.

Napadá mě, že by toto chování mohla mít za následek nějaká volba v php.ini, ale netuším jaká.

Mnohokrát děkuji za každou odpověď.


Moderátor Joker: Vkládej prosím kódy mezi značky [pre] a [/pre] (stačí kliknout na ).
Jan Tvrdík
Profil
Jiří Hradecký:
Tohle v PHP 5.3 funguje pokud vím bez problémů, chyba bude jinde. Vypiš si před voláním get_defined_vars.

zatímco varianty resize($W,"") a resize($W,NULL) prostě ne.
Tohle nefungovalo ani na PHP 5.1.6.

nějaká volba v php.ini
Nic takového se v php.ini nenastavuje.
Joker
Profil
Jiří Hradecký:
když zkusím z volání druhý parametr vypustit tzn. $XY=resize($W); tak to normálně funguje. zatímco varianty resize($W,"") a resize($W,NULL) prostě ne.
Což je ale správně, výchozí hodnota se má použít když není předána žádná hodnota, ale prázdný řetězec a NULL jsou taky hodnoty.

Proč to nefunguje s nedefinovanou proměnnou nevím, ale nevyvolá ten uvedený kód notice o použití nedefinované proměnné?
Jiří Hradecký
Profil
Joker & Jan Tvrdík:
ano vyvolá, ale ta mi nijak nevadí. Ten script se používá jako soubor obrázku tumbnail.php. Tento se volá z tagu <img

takto <img src="tumbnail.php?W=200"> nebo <img src="tumbnail.php?H=200"> nebo <img src="tumbnail.php?W=200&H=150">

mime typ toho souboru tumbnail.php se v průběhu nastavuje na jpg a poté vypíše návrat z funkce na zmenšování obrázků.

notice mi nevadí, jelikož je v tomto scriptu nenechávám vypisovat.

problém je v tom, že při změně velikosti ve funkci se dopočítává výše zmíněný poměr stran kde se používá $W/$H a na tom padne ta funkce jelikož dělí nulou, nedopočítá a padne.

Přesné volání té funkce v tom scriptu tumbnail.php je <?resize($W,$H);?> ten null a prázdný řetězec byl pro ilustraci hodnoty když není druhý parametr definován.

Jinak na php 5.1.6 to opravdu chodilo :-( obrázky náhlédů se zobrazovali, změna verze php a nezobrazují.

Teď nejsem u PC kde mám možnost zkusit tu radu s get vars. Tak během odpovedne dám vědět.

Jinak Vám pánové oběma moc děkuji za rady
Joker
Profil
Jiří Hradecký:
notice mi nevadí, jelikož je v tomto scriptu nenechávám vypisovat.
Divná úvaha.
Podstatná věc není jak a kde se (ne)zobrazuje upozornění na chybu, ale existence chyby na kterou je upozorňováno.

Ten aktuálně řešený problém je následkem právě toho, že jste tu notice ignoroval a skript neopravil.

Jinak řešením by asi bylo i do té funkce přidat něco jako:
if(empty($H)) $H = 100;
Což by tam mimochodem mělo být každopádně, protože by to nemělo spadnout ani když někdo zavolá třeba resize(0,0)
Tori
Profil
A na tom PHP 5.1.něco byly vypnuté register_globals nebo ne? (Na 5.3 automaticky předpokládám vypnuté.)
Jiří Hradecký
Profil
Na PHP 5.1 bylo reg. Globals zapnuté. A dle phpinfo je zapnuté i v 5.3.

Vím že je to ignorovaná chyba v již několik let staré funkci a je to moje chyba. Jen se mi jí nechce moc ručně dohledávat všude kde je zanesená je to minimálně 20 webů.

Nicméně jak to zatím vypadá asi se tomu nevyhnu a bude to samozřejmě čisté řešení a ne vyhnutí se problému :-)

Znáte to, když něco funguje bez obav to člověk používá a již nekouká na obsah. Až když to fungovat přestalo tak jsem zjistil, že stav nedefinované proměnné jsem ve volané scriptu neřešil a dnes bych to již takto nenapsal. :-) Ale před pár lety jelikož to nezařvalo chybu a fungovalo to tak jsem to z lajdáckosti ignoroval a teď na to zřejmě doplácím :-).
Jiří Hradecký
Profil
Zdravím všechny tak jsem na to přišel.
Musím se přiznat jsem a promiňte mi to slovo VŮL přemýšlel jsem o tom úplně špatně. Chyba resp. ne chyba, ale rozdíl byl skutečně v php.ini a sice v error_reporting.

Řešení které jsem pro tuto chvíly zvolil z časových důvodů je vypnout display_error a nechat chyby pouze zapisovat do separátních logů. A následně dle chyb opravit ty prasárny v kódu, kterých jsem se dopustil ve svých začátcích.

Ta funkce jak jsem měl za to že padá kvůli nezískané proměnné vůbec nepadala chovala se skutečně naprosto standartně. Ovšem kvůli hloubce vypisování errorů na obrazovku se při vygenerování binárky obrázku tam přicpala hláška WARNING a tím pádem plsek a obrázek nebyl. :-)

S defaultně vypnutým vypisováním chyb na obrazovku se to již neděje a obrázky se normálně zobrazují. Nicméně chyba tam stále je a proto to nechávám logovat a později dle hlášek v logu chyby v klidu opravím :-)

Takže vyřešeno. Změna v php 5.3 se nekonala

Díky za odpovědi a příspěvky.

PS: ještě bych se zeptal ve věci ereg funkcí které jsou deprecated. Ať to nemusím zkoumat. v 5.3 fungují a v příští verzi budou vyřazeny. Je to tak? V takovém případě mi na úpravu kódu a doladění pro případný update poslouží log stejně jako v první věci.

Ještě jednou díky za Váš čas.

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: