Autor Zpráva
joe
Profil
Ahoj,

mám jen takovou jednoduchou otázku, udělal jsem si funkci, která loguje všechny chyby do souboru a na výstupu se mi objeví třeba:

8 C:\web\www\sample.cz\www\html\stranka.php:101 Undefined index: strana

V kódu pak mám třeba
if($_GET['strana'] == '5')
pokud ale není v adrese zadaná strana, vyhodí to právě to upozornění, že daný index - "strana" v $_GET není, což je logické :-)

A tak se ptám, je lepší napsat
if( isset($_GET['strana']) && $_GET['strana'] == '5' )
nebo to je jedno, protože, to fungovat bude stejně tak i tak.. :) a jak to píšete?
mpark
Profil
Myslím, že to bude fungovat i bez isset, však si to zkus a uvidíš. Nebo dát if(intval($_GET['strana']) == '5')) {

Proč chyby nevypisuješ podle __FILE__ a __LINE__ ?

Apropo, nás profesor ve škole učil, že isset není potřeba psát, stačí prý if($GET['strana']) { je to pravda nebo ne? Já používám vlastní funkci, takže sám ani nevím.
Nox
Profil
Apropo, nás profesor ve škole učil, že isset není potřeba psát, stačí prý if($GET['strana']) { je to pravda nebo ne? Já používám vlastní funkci, takže sám ani nevím.
Není, tato podmínka testuje pouze, pokud je true, což znamená, že může být definovaná, ale pokud má hodnotu 0, tak neprojde...a nula je celkem častá hodnota, takže to může dělat neplechu

nebo to je jedno, protože, to fungovat bude stejně tak i tak.. :) a jak to píšete?
Proto je to Notice a ne třeba Warning ... záleží co pak s tou proměnnou děláš ... někdy to je jedno, někdy to může dopadnout špatně
Třeba v echu to je celkem jedno
joe
Profil
Nox
někdy to je jedno, někdy to může dopadnout špatně
A kdy to může dopadnou špatně? Zdá se mi, že když napíšu
if($_GET['strana'] == '5')
nebo
if( isset($_GET['strana']) && $_GET['strana'] == '5' )
vyjde to nastejno, protože buď ta proměnná je '5' a tím pádem platí i isset a nebo '5' není a isset je false.

Navíc mám mám nastavené hlášení chyb bez notice a přesto mi je to tam vypisuje, to mi taky přijde divné...

mpark
Jak bych měl chyby vypisovat podle __FILE__ a __LINE__ ?
pmg
Profil
V tomto případě to vyjde nastejno, ale doporučuje se používat delší variantu, protože negeneruje chyby (na vypnutí hlášení se vždy nelze spolehnout). Je navíc dobré E_USER_NOTICE vůbec nevypínat, protože nás upozorní na nezinicializovanou proměnnou, která může představovat bezpečnostní riziko.
joe
Profil
pmg
Ok, tak díky.
Nastavil jsem zobrazení ukládání všech chyb a stejně se to chová stejně :-)

která může představovat bezpečnostní riziko.
Mohl bych prosím vědět jaké riziko například?
Nox
Profil
A kdy to může dopadnou špatně? Zdá se mi, že když napíšu
J, máš asi pravdu, bude to jedno
pmg
Profil
Když je na serveru zapnutá direktiva register_globals (dnes málokdy), dá se jakákoliv proměnná nastavit v adrese požadavku:

Někdo zadá adresu index.php?access=true
My pracujeme s proměnnou $access, kterou ale neinicializujeme.

// $access = false;    // vynechaná inicializace, popř. se stačí přepsat v názvu

// autorizování selže
if (login_user($user, $password)) $access = true;

// ale použije se proměnná zvenčí
if ($access) {
    // neoprávněný přístup
}


Nemusí na nás někdo útočit, ale pokud chceme mít v proměnné true a přepíšeme se při inicializaci v jejím názvu, chyba je na světě.

Zkus dát do souboru .htaccess něco takového

php_value error_reporting 8191 # oznámit každou chybu
php_flag display_errors Off # ale nezobrazit
php_flag log_errors On # radši logovat
php_value error_log ./php.log

Popřípadě až ve skriptu:

ini_set('display_errors', false);
joe
Profil
pmg
Díky za objasnění, jen si nejsem jistý jestli to byl dobrý příklad :-)
V tomto případě je inicializace proměnné důležitá, asi bych při psání dal do else
$access = false;
Ale konkrétně tento řádek
if ($access) {
je jedno jestli bude tak jak je nebo bude mít o jednu funkci navíc
if (isset($access) && $access) {
A jinak kdyby se použilo jen
if($access === true)
se zapnutou direktivou, myslím, že by to neprošlo, protože pokud vím, tak parametry z url jsou jako string.
pmg
Profil
joe
Příklad popisuje stav, kdy si myslím, že je proměnná inicializovaná, popř. kdy počítám s tím, že inicializovaná není a vyhodnotí se jako NULL (mám vypnutá varování). Kód lze pozměnit jak píšeš, ale já to neudělám, protože podle toho, z čeho vycházím, je to zbytečné.

Když tě PHP varuje před neinicializovanou proměnnou, jsi nucen použitím isset nebo inicializace explicitně uvést, že s tím případem počítáš.

Povedlo se nastavit to zobrazování chyb?
joe
Profil
pmg
Ok, už tomu rozumím.
Teď jsem to upravil a dal do PHP a funguje, nastavil jsem error handler. Díky moc.

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: