V dnešnej lekcií si ukážeme, ako jednoducho a ľahko môžeme vkladať naše dáta do databázy MySQL pomocou formulára. Ďalej sa naučíme, ako si správne ošetriť naše dáta pred hacknutím SQL, PHP Injection alebo pred zle zadanými hodnotami.
V minulej lekcii sme si vytvorili databázu hlavne_mesta, tabuľku mesta a nechali sme si vypísať dáta pomocou funkcie mysql_fetch_array.
Dnes si vytvoríme jednoduchý formulár, ktorý bude obsahovať 3 inputy, do ktorých sa budú vkladať naše záznamy.
Ďalej budeme potrebovať dva PHP súbory. Prvý s názvom databaza.inc.php, kde budú uložené naše dáta, pomocou ktorých sa budeme pripájať k DB. V druhom (pridaj_mesto.php) bude samotný formulár s naším PHP kódom. Takže poďme na to.
databaza.inc.php
".SERVER.") na riadku číslo :".__LINE__."");
//Teraz vyberieme nasu databazu, v pripade chyby si nechame vypisat cislo riadku, //na ktorom sa chyba nachadza aj s popisom
$db=@mysql_select_db(DATABAZA,$connect) or die
("Chyba pripojenia k databáze (".DATABAZA.") na riadku číslo :".__LINE__."");
?>
pridaj_mesto.php
V tomto druhom PHP súbore som počas celej doby používal superglobálne premenné, nakoľko sa nikdy neviem spoľahnúť na to, že direktíva register_globals je nastavená na on.
register_globals môže nadobudnúť implicitnú hodnotu on, alebo off. Vyrobí z premenných track_vars – premenné globálne. Aj keď je táto voľba implicitne zapnutá, v poslednej dobe sa radšej z bezpečnostných dôvodov vypína. Pokial je nastavená na off, treba vždy používať superglobálne premenné, ktoré sú: $_GET, $_POST, $_REQUEST, $_COOKIE,$_SESSION, $_SERVER, $_ENV, $_FILES. Ako zistíme, či je táto voľba zapnutá alebo vypnutá ? Vytvoríme si nový php súbor s obsahom phpinfo();. A tam si nájdeme register_globals a jeho hodnotu.
Takto by mal vyzerať náš formulár po zadaní do prehliadača:
http://localhost/pridaj_mesto.php
Celý script je riešený viacerými podmienkami. Na začiatku som si vytvoril premennú $formular=false; – tá bude vždy ihneď pri spustení. Ďalej nasleduje formulár, do ktorého som, okrem našich 3 základných inputov, vložil aj 2 typu hidden.
\n";
echo "\n";
?>
Je to z toho dôvodu, aby sme zabránili náhodnému vloženiu do databázy iným užívateľom. Pretože pokiaľ si niekto pozrie náš zdrojový kód, tak si v ňom veľmi ľahko nájde, že akcia na formuláre je nastavená na
";
?>
Čiže: akcia = pridaj_mesto.php?action=pridat
Keby si ho náhodou takto niekto pozrel a do prhliadača by zadal www.stranka.cz/pridaj_mesto.php?action=pridat, mohol by zapísať prázdne údaje do DB, ale to sa nestane, nakoľko to máme tiež ošetrené.
Nasledujúci kód zisťuje, či sa naša akcia rovná tomu, čomu má, teda „pridat“, a ak áno, tak premenná $formular sa nastaví na hodnotu true.
Teraz si overujem nasledujúce veci:
- akcia sa musí rovnať „pridat“
- premenná $formular musí mať hodnotu „true“
- náš skrytý typ hidden s názvom „formular“sa musí rovnať „OK“
- a nakoniec posledný skrytý typ hidden s názvom „session“ by sa mal rovnať hodnote session, ktorá bola inicializovaná ihneď na začiatku stránky
Ak tieto 4 pravidlá platia načítam si naše údaje z DB a môžeme ísť overovať zadané hodnoty z formulára.
Najprv si ošetrím premenné z formulára pred škodlivým HTML kódom:
Teraz si overím, či sa niečo vôbec nachádza v&našom formulári:
Ak sú prázdne tak upozorním užívateľa a script ukončím pomocou zázračného slovíčka „exit“.
Teraz si overím, či mi užívateľ zadal v kolónke počet obyvateľov čísla:
Pokiaľ nie, tak sa mu zobrazí nasledujúci obrázok:
Tak to by bolo asi všetko z overovanie nakoľko si myslím, že pre náš formulár to bohato stačí. Samozrejme existuje mnoho funkcií, ktoré by sa tu dali ešte využiť, to už nechám na vašej fantázii.
Teraz nasleduje validný SQL dotaz na našu DB samozrejme s využitím f-ce magic_quotes_gpc a s ochranou proti SQL Injection.
magic_quotes_gpc môže nadobudnúť hodnotu on alebo off. Všetky špeciálne znaky, ako sú uvodzovky, sú chránené pri spracovávaní metódami GET, POST a COOKIES spätným lomítkom.
Teda pokial by bola táto metóda nastavená na off, tak pomocou PHP funkcií addslashes a htmlspecialchars si tie naše spätné lomítka sami doplníme.
A už len na koniec query dotaz a je to.
Ak všetko prebehlo v poriadku, tak by sme mali vidieť takéto okno:
Celý kód:
Hlavné Mestá - Formulár
Formulár mesto";
//Zaciatok tabulky a formulara
echo "\n";
//Ak sa akcia rovna pridat formular je true
if ($_GET['action']=='pridat') {$formular=true;};
//A ak platia pravidla naraz pripoj udaje z databazi
if ( ($_GET['action']='pridat') and ($formular=true) and($_POST['formular']=='OK')
and ($_POST['session']=="".$_SERVER['HTTP_COOKIE']."") ) {
require_once "databaza.inc.php";
//Osetrenie proti html kodu
$_POST['stat']=htmlspecialchars($_POST['stat']);
$_POST['mesto']=htmlspecialchars($_POST['mesto']);
$_POST['pocet']=htmlspecialchars($_POST['pocet']);
//Overim ci uzivatel nazadal prazdne pole so statom ak hej tak ukoncim
if(!($_POST['stat'])) {
echo "Nevyplnili ste pole so štátom.
";
echo "Späť
";
exit;};
//Overim ci uzivatel nazadal prazdne pole s mestom ak hej tak ukoncim
if(!($_POST['mesto'])) {
echo "Nevyplnili ste pole s mestom.
";
echo "Späť
";
exit;};
//Overim ci uzivatel nazadal prazdne pole s poctom obyvatelov ak hej tak ukoncim
if(!($_POST['pocet'])) {
echo "Nevyplnili ste pole s počtom obyvateľov.
";
echo "Späť
";
exit;}
//A nakoniec si overim ze ci je pocet obyvatel typ INT cez reg. vyraz
if (!ereg("^[0-9]",$_POST['pocet'])) {
// if(!is_int($_POST['pocet'])) {
echo "Zadali ste neplatne číslo (".$_POST['pocet'].").
";
echo "Späť
";
exit;}
//Ak je vestko splnene tak sa pustime na to vkladanie
//Validny SQL dotaz na vlozeneie do DB s vyuzitim ft magic_quotes_gpc
//+ s ochranou proti SQL injectionom
$sql="INSERT INTO mesta VALUES(
'".addslashes(htmlspecialchars($_POST['mesto']))."',
'".addslashes(htmlspecialchars($_POST['stat']))."',
'".addslashes(htmlspecialchars($_POST['pocet']))."',
'')";
//Query dotaz na DB
if ($mysql_query=@mysql_query($sql,$connect)) {
//Vypisem udaje uzivatelovy ak je OK query
echo "Vaše údaje boli úspešne vložené do databázy.\n
";
echo "Štát : ".$_POST['stat']."
";
echo " ";
echo "";
echo "Mesto : ".$_POST['mesto']."
";
echo " ";
echo "";
echo "Počet obyvateľov : ".$_POST['pocet']."
";
echo " ";
echo "
";
echo "Späť";
echo "";
$formular=false;
}
//Ak je chyba tak upozornim
else {
echo"Chyba pri vkladaní dát! Skúste neskôr alebo kontaktujte správcu.
";
echo "Späť
";
$formular=false;
}
}//Ukoncim akciu s postnutie formularu
//Ukončím spojenie s MySQL
@mysql_close($connect);
$formular=false;
?>
Samozrejme celý zdrojový kód taktiež prikladám ako txt súbor, ktorý si môžete stiahnuť na adrese: http://gulo.wz.cz/data/pridaj_mesto.php.txt
Zhrnutie
Dnes sme sa naučili vkladať dáta do tabuliek prostredníctvom formulára, naučili sme sa, ako si treba správne ošetriť naše dáta z formulára.
V ďalšej lekcii by som vás chcel naučiť, ako si naše dáta vypísať pomocou formulára. Vytvoríme si vyhľadávanie na stránke, ktoré nám bude hľadať naše záznamy uložené v DB.