Kúsok kódu, aby si si to vedel predstaviť:
HTML:
Kód:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<meta http-equiv="content-type" content="text/html; charset=windows-1250">
<meta name="generator" content="PSPad editor, www.pspad.com">
<title></title>
</head>
<body>
<form enctype="multipart/form-data" method="post" action="nieco">
<fieldset>
<legend>Údaje</legend>
<input type="text" name="meno">
<input type="text" name="priezvisko">
<input type="text" name="adresa">
</fieldset>
<fieldset>
<legend>Obrázok</legend>
<input type="file" name="obrazok">
</fieldset>
</form>
</body>
</html>
PHP:
Kód:
<?php
if (isset($_POST)) {
$polia = array("meno", "priezvisko", "adresa");
foreach ($polia as $key) {
if (isset($_POST[$key])) {
$_SESSION['udaje_z_formulara'][$key] = strip_tags($_POST[$key]);
}
}
}
funkcia_na_spracovanie_obrazka($_FILES['obrazok']); //alebo cely blok prikazov
blok_prikazov_na_vypis_formulara{
// vypises rovnaky formular aj so zadanymi hodnotami
}
unset($_SESSION['udaje_z_formulara']); // odstranenie nepotrebnych udajov
?>
No, a vysvetlime si postupne ten PHP kód: ak mám nejaké dáta v POST-e, tak si zadefinujem pole, ktoré bude mať hodnoty prvkov pomenované presne ako jednotlivé políčka vo formulári (neskôr vysvetlím prečo). Následne
foreach konštrukciou toto pole preleziem (pri každej iterácii sa do premennej
$key uloží príslušná hodnota, tj. najprv
meno, potom
priezvisko, potom
adresa. Frk je v tom, že aj pole
$_POST má pri správnom odoslaní položky s hodnotami zadanými od užívateľa pomenované rovnako ako prvky nášho poľa
$polia. Takže, ešte kontrola, či naozaj pole
$_POST obsahuje položku s názvom
$key (teda takú, ktorú sme si dopredu definovali) a ak hej, tak do užívateľskej relácie (session, premenná
$_SESSION) si uložíme konkrétnu hodnotu (v tomto prípade po ošetrení funkciou
strip_tags, nejaké ošetrenie by tam byť malo, obzvlášť ak chceš tie dáta ešte raz vypísať, možno by sa oplatilo ešte použíť tesne pred výpisom aj funkciu
htmlspecialchars). Takto sme si naplnili údaje do užívateľskej relácie a môžeme sa zaoberať spracovaním obrázka, vypísať formulár so zadanými hodnotami a zrušiť nepotrebnú časť užívateľskej relácie (
unset($_SESSION['udaje_z_formulara']);).
A ešte vysvetlenie, prečo to šaškovanie s nejakým poľom. Je veľmi nepohodlné vypisovať jednotlivo všetky položky spôsobom (ľahko spravíš preklep, pri každej zmene HTML formulára treba meniť aj PHP kód):
Kód:
$_SESSION['udaje_z_formulara']['meno'] = strip_tags($_POST['meno']);
$_SESSION['udaje_z_formulara']['priezvisko'] = strip_tags($_POST['priezvisko']);
$_SESSION['udaje_z_formulara']['adresa'] = strip_tags($_POST['adresa']);
Oveľa pohodlnejšie je použitie
foreach konštrukcie:
Kód:
foreach($_POST as $key => $value) {
$_SESSION['udaje_z_formulara'][$key] = strip_tags($value);
}
Takto sa automaticky do užívateľskej relácie vložia všetky údaje z POST časti HTTP požiadavku. Lenže, nie je problém, odoslať formulár na tvoj server s úplne inými poliami (jednoducho si niekto stiahne tvoju stránku ako obyčajný html súbor, ľubovoľne pozmení kód a odošle ho na tvoju adresu pomocou parametra
action tagu
form). Takýmto spôsobom sa k tebe môžu dostať údaje, ktoré nie sú tým, čo sám chceš.
Preto si na kontrolu definujeme pole, v ktorom vymenujeme, ktoré prvky poľa
$_POST naozaj chceme a do užívateľskej relácie sa tak dostane naozaj len to, čo chceme aby tam bolo. Navyše, veľmi intuitívne sa tam dajú aplikovať rôzne sanitizačné funkcie (v tomto prípade napr.
strip_tags na odstránenie škodlivého HTML kódu, pri samotnom výpise do HTML stránky sa ešte oplatí zabrániť XSS útokom použitím funkcie
htmlspecialchars).
_________________
A. S. Tanenbaum píše:
The terms LF, MF, and HF refer to low, medium, and high frequency, respectively. Clearly, when the names were assigned, nobody expected to go above 10 MHz, so the higher bands were later named the Very, Ultra, Super, Extremely, and Tremendously High Frequency bands. Beyond that there are no names, but Incredibly, Astonishingly, and Prodigiously high frequency (IHF, AHF, and PHF) would sound nice.