Autor | Zpráva | ||
---|---|---|---|
joe Profil |
#1 · Zasláno: 5. 8. 2008, 19:58:25 · Upravil/a: joe
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') A tak se ptám, je lepší napsat if( isset($_GET['strana']) && $_GET['strana'] == '5' ) |
||
mpark Profil |
#2 · Zasláno: 5. 8. 2008, 20:15:21
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 |
#3 · Zasláno: 5. 8. 2008, 20:24:36
„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 |
#4 · Zasláno: 5. 8. 2008, 21:09:03
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') if( isset($_GET['strana']) && $_GET['strana'] == '5' ) 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 |
#5 · Zasláno: 5. 8. 2008, 21:46:09
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 |
#6 · Zasláno: 5. 8. 2008, 22:15:27
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 |
#7 · Zasláno: 5. 8. 2008, 22:47:35
„A kdy to může dopadnou špatně? Zdá se mi, že když napíšu“
J, máš asi pravdu, bude to jedno |
||
pmg Profil |
#8 · Zasláno: 5. 8. 2008, 23:45:04 · Upravil/a: pmg
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 |
#9 · Zasláno: 6. 8. 2008, 00:35:52
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; if ($access) { if (isset($access) && $access) { if($access === true) |
||
pmg Profil |
#10 · Zasláno: 6. 8. 2008, 01:30:48 · Upravil/a: pmg
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 |
#11 · Zasláno: 6. 8. 2008, 02:34:22
pmg
Ok, už tomu rozumím. Teď jsem to upravil a dal do PHP a funguje, nastavil jsem error handler. Díky moc. |
||
Časová prodleva: 16 let
|
0