PHP: Výchozí hodnota formulářů
O tom jak správně doplňovat již odeslané hodnoty z formulářových polí jako jejich value hodnoty.
Pomocí PHP můžeme kontrolovat hodnoty vyplněné uživatelem ve formuláři, ale bohužel až po jeho odeslání. Často tak nastane situace, kdy musíme uživateli vypsat stejný formulář znova a vyzvat jej aby opravil překlepy, kterých se dopustil.
Pokud vypisujeme formulář znova, tak bychom měli zachovat hodnoty, které již jednou byly vyplněné a tyto hodnoty doplnit do formuláře jako výchozí hodnoty.
Výchozí hodnotu ve formulářových polích určuje většinou atribut value (mimo select a textareu), který obsahuje jeho hodnotu.
Pokud chceme doplnit výchozí hodnoty do formuláře, musíme to udělat pomocí tohoto atributu, do kterého nastavíme jako hodnotu hodnotu uloženou po odeslání v globálním poli GET nebo POST:
1 2 3 4 |
print '<form method="GET" action="index.php">'; print '<input type="text" name="name" value="' . $_GET['name'] . '"/>'; print '<input type="submit" value="Send Form (Method GET)" name="submit" />'; print '</form>'; |
Tento jednoduchý způsob není moc praktický, protože vykazuje chybu typu Notice:
1 |
<b>Notice:</b> Undefined index: name in <b>C:wwwwwwdataindex.php</b> on line <b>2</b> |
Tato chyba se bude objevovat po načtení formuláře a je způsobena tím, že index pole GET při načtení formuláře neexistuje (formulář doposud nebyl odeslán a proto neexistuje pole GET ani POST).
Můžeme tento základní příklad rozšířit a chyby notice se snadno vyvarovat:
1 2 3 4 |
print '<form method="GET" action="index.php">'; print '<input type="text" name="name" value="' . ( isset( $_GET['form1'] ) ? $_GET['form1'] : NULL ) . '" />'; print '<input type="submit" value="Send Form (Method GET)" name="submit" />'; print '</form>'; |
Nyní jsme se konečně zbavily chybových hlášení, a poslední věc, kteru musíme udělat je ošetřit vstup. Vstup musíme ošetřit hlavně proti chybám typu XSS a to uděláme jednoduše například použitím funkce htmlspecialchars:
1 2 3 4 5 6 7 8 9 10 11 12 |
function default_value( $string ){ return ( htmlspecialchars( get_magic_quotes_gpc() == 1 ? stripslashes( $string ) : $string )); } print '<form method="GET" action="index.php">'; print '<input type="text" name="form1" value="' . ( isset( $_GET['form1'] ) ? default_value( $_GET['form1'] ) : NULL ) . '"/>'; print '<input type="submit" value="Send Form (Method GET)" name="submit" />'; print '</form>'; |
V případě pole POST by bylo všechno obdobné, jak je vidět na tomto příkladu:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 |
<?php error_reporting(15); function default_value( $string ){ return ( htmlspecialchars( get_magic_quotes_gpc() == 1 ? stripslashes( $string ) : $string )); } print 'GET: '; print_r( $_GET ); print '<br />'; print 'POST: '; print_r( $_POST ); print '<br />'; print '<form method="GET" action="index.php">'; print '<input type="text" name="form1" value="' . ( isset( $_GET['form1'] ) ? default_value( $_GET['form1'] ) : NULL ) . '"/>'; print '<input type="submit" value="Send Form (Method GET)" name="submit" />'; print '</form>'; print '<form method="POST" action="index.php">'; print '<input type="text" name="form1" value="' . ( isset( $_POST['form1'] ) ? default_value( $_POST['form1'] ) : NULL ) . '"/>'; print '<input type="submit" name="submit" value="Send Form (Method POST)" />'; print '</form>'; ?> |
error_reporting(15) – kdo to kdy videl ;)))
No protoze je zde popsane jak se script chova jenom pri nastaveni error reportin na E_ALL, tak proto.
Jinak treba ja osobne mam na localhostu nastavene error reporting na 15, na serveru samozrejme na 0.
Tady jde ciste o to, ze existuji i jine vyrazy nez E_ALL. Spolehat na binarni hodnotu je dost nebezpecne – definice se muze kdykoliv zmenit. Spravny zapis je spise:
error_repo rting( E_ERROR ; E_WARNING ; E_PARSE ; E_NOTICE);
Ze to funguje stejne je pravda, otazka je, co je citelnejsi a trvanlivejsi.