Vloženie dát zo stránky do databázy
Na tejto prednáške si spravíme formulár, cez ktorý budeme vkladať nové záznamy do databázy do našej tabuľky users. Ako už vieme, formulár je najpoužívanejšia cesta, ako používateľ môže zadať nejaké dáta webstránke. Toto by sme už mali zvládnuť, takže si poďme rozobrať problém ako programátori a rozdeliť si ho na menšie časti.
Najprv by sme mali spraviť formulár, ktorý bude obsahovať štyri textové inputy, ktoré budú reprezentovať hodnoty, resp. stĺpce v našej tabuľke users. Podobne ako pri odosielaní mailu, by sme po odoslaní (submit) formulára mali tieto dáta skontrolovať, či vyhovujú našim požiadavkam (číslo, dĺžka stringu a pod.). Ak vyhovujú, mali by sme sa pripojiť na databázu a vložiť nový záznam do tabuľky so zadanými dátami a následne vypísať používateľovi hlášku, že sa dáta úspešne odoslali. V prípade zle zadaných dát musíme tieto dáta načítať do formulára (ako value inputov) a zobraziť hlášku, že dáta nie sú správne zadané.
Poďme teda na to, najprv si skopírujeme kód formulára zo sekcie kontakt do sekcie domov (index.php) do hornej časti, pridáme aj nadpisy, aby sme v tom nemali bordel a upravíme položky formulára podľa stĺpcov v databáze, mohlo by to vyzerať takto:
index.php (obsah hlavného divu):
<h1>Domov</h1>
<div class="line"></div>
<h2>Pridanie nového používateľa</h2>
<!-- Formular pre vlozenie noveho usera -->
<form class="contact_form" action="<?php echo htmlspecialchars($_SERVER["PHP_SELF"]);?>" method="post">
<label for="user_name">Meno</label>
<input type="text" name="user_name" id="user_name" value="<?php echo $user_name;?>">
<label for="user_surname">Priezvisko</label>
<input type="text" name="user_surname" id="user_surname" value="<?php echo $user_surname;?>">
<label for="age">Vek</label>
<input type="text" name="age" id="age" value="<?php echo $age;?>">
<label for="role">Rola</label>
<input type="text" name="role" id="role" value="<?php echo $role;?>">
<input type="submit" name="user_form" value="Odoslať">
</form>
Ako vidíte, naša stránka zatiaľ obsahuje iba formulár, zvyšný kód sme zakomentovali, aby nás zbytočne nerozptyľoval a nezavadzal. Poďme na ďalší krok. Otestujeme, či bol formulár odoslaný, načítame si parametre, ktoré nám prišli a skontrolujeme, či vyhovujú našim požiadavkam. Požiadavky by v tomto prípade mali predstavovať dátové typy a obmedzenia stĺpcov v DB, pretože tam budeme dáta vkladať. Na otestovanie použijeme jednoduché regulárne výrazy, nebudeme sa týmto zbytočne zaoberať to podrobna, nie je to teraz hlavná časť programu. Ak dáta spĺňajú predpis stĺpcov, malo by byť všetko v poriadku. V prípade mena a priezviska by to nemal byť string dlhší ako 50 znakov (lebo varchar o dĺžke 50), v prípade veku by to malo byť číslo integer a v prípade role by to mal byť string nie dlhší ako 20 znakov. Táto časť by mohla vyzerať takto:
index.php (pred formulár):
<h2>Pridanie nového používateľa</h2>
<?php
//ZACHYTENIE PARAMETROV
if($_SERVER['REQUEST_METHOD'] == 'POST' && $_POST['user_form']){
$user_name = $_POST['user_name'];
$user_surname = $_POST['user_surname'];
$age = $_POST['age'];
$role = $_POST['role'];
if(preg_match('#^.{0,50}$#', $user_name) &&
preg_match('#^.{1,50}$#', $user_surname) &&
preg_match('#^.{0,20}$#', $role) &&
preg_match('#^[0-9]{0,3}$#', $age)){
//KOREKTNE DATA
echo '<p class="success">Položka bola uložená.</p>';
//ulozenie do DB
//vycistenie poloziek
$user_name = '';
$user_surname = '';
$age = '';
$role = '';
}else{
//CHYBNE DATA
echo '<p class="error">Nová položka nebola uložená - nesprávne vyplnené dáta vo formulári. </p>';
}
?>
Ako vidíte v kóde, po skontrolovaní, či bol formulár odoslaný (už skôr sme zmenili jeho name z contact_form na user_form) sme zachytili parametre. Následne sme vytvorili podmienku, kde všetky štyri parametre musia spĺňať nejaký predpis podľa regulárnych výrazov. Vo varcharových položkách kontrolujeme iba dĺžku (ako vieme bodka reprezentuje ľubovoľný znak a rozsah v zátvorke povolenú dĺžku hodnoty) a pri veku kontrolujeme, či to obsahuje iba čísla a dĺžku, ktorá by nemala presiahnuť tri číslice. Všimnite si, že len pri user_surname máme, že to musí obsahovať aspoň jeden znak, pretože jedine táto položka je v našej tabuľke ako NOT NULL, takže musí niečo obsahovať. Ak sú všetky predpisy splnené (podmienka je splnená), tak bude nasledovať uloženie do databázy a vyčistenie parametrov (vymazanie formulára), pretože ak sa dáta úspešne odoslali, nie je nutné zachovať predchádzajúce hodnoty. V prípade zle vyplneného formulára zobrazíme hlášku a taktiež ostanú hodnoty vo formulári zachované.
Skúste si obidva prípady – aj správne vyplnené dáta (zadané aspoň user_surname jedným znakom) aj nesprávne (nezadané číslo, iné dĺžky a podobne...), aby ste videli, že to skutočne funguje a hlášky sa vypisujú správne. Teraz nám ostáva už len dokonať dielo a to je zabezpečiť uloženie do databázy. Ako vieme, dáta vkladáme príkazom INSERT INTO. My si ho postupne vyskladáme podľa toho, či naše parametre obsahujú alebo neobsahujú hodnotu. V prípade, že parameter (a teda hodnota v danom stĺpci) nebola zadaná, budeme vkladať NULL. Aby to bolo kompletné, na začiatok kódu si vložíme pripojenie do databázy a na konci si odkomentujeme výpis tabuľky so všetkými používateľmi. Takto po úspešnom vložení hneď uvidíme našu položku v zozname používateľov natiahnutom z databázy. Celý kód by mohol teda vyzerať takto:
index.php:
<div class="main-content right">
<h1>Domov</h1>
<div class="line"></div>
<h2>Pridanie nového používateľa</h2>
<?php
//PRIPOJENIE DO DB
$server_name = "localhost";
$db_user_name = "root";
$password = "root";
$dbname = "zapr_db_1";
$connection = mysqli_connect($server_name, $db_user_name, $password, $dbname);
if (!$connection) {
echo 'Spojenie s databázou sa nepodarilo nadviazať.';
}else{
// echo 'Spojenie s databázou sa podarilo úspešne nadviazať.';
}
//ZACHYTENIE PARAMETROV
if($_SERVER['REQUEST_METHOD'] == 'POST' && $_POST['user_form']){
$user_name = $_POST['user_name'];
$user_surname = $_POST['user_surname'];
$age = $_POST['age'];
$role = $_POST['role'];
if(preg_match('#^.{0,50}$#', $user_name) &&
preg_match('#^.{1,50}$#', $user_surname) &&
preg_match('#^.{0,20}$#', $role) &&
preg_match('#^[0-9]{0,3}$#', $age)){
//KOREKTNE DATA
//ulozenie do DB
$sql_query = "INSERT INTO users (user_name, user_surname, age, role) VALUES (";
//otestovanie ci prisli parametre, inak vkladame NULL
if($user_name){
$sql_query .= "'".$user_name."',";
}else{
$sql_query .= "NULL,";
}
$sql_query .= "'".$user_surname."',";
if($age){
$sql_query .= $age.",";
}else{
$sql_query .= "NULL,";
}
if($role){
$sql_query .= "'".$role."')";
}else{
$sql_query .= "NULL)";
}
$result = mysqli_query($connection, $sql_query);
if($result){
echo '<p class="success">Položka bola úspešne uložená.</p>';
}else{
echo '<p class="error">Pri ukladaní dát do databzy sa vyskytla chyba.</p>';
}
//vycistenie poloziek
$user_name = '';
$user_surname = '';
$age = '';
$role = '';
}else{
//CHYBNE DATA
echo '<p class="error">Nová položka nebola uložená - nesprávne vyplnené dáta vo formulári. </p>';
}
}
?>
<!-- Formular pre vlozenie noveho usera -->
<form class="contact_form" action="<?php echo htmlspecialchars($_SERVER["PHP_SELF"]);?>" method="post">
<label for="user_name">Meno</label>
<input type="text" name="user_name" id="user_name" value="<?php echo $user_name;?>">
<label for="user_surname">Priezvisko</label>
<input type="text" name="user_surname" id="user_surname" value="<?php echo $user_surname;?>">
<label for="age">Vek</label>
<input type="text" name="age" id="age" value="<?php echo $age;?>">
<label for="role">Rola</label>
<input type="text" name="role" id="role" value="<?php echo $role;?>">
<input type="submit" name="user_form" value="Odoslať">
</form>
<?php
$sql_query = "SELECT * FROM users";
$result = mysqli_query($connection, $sql_query);
if (mysqli_num_rows($result) > 0) {
$data = mysqli_fetch_all($result, MYSQLI_ASSOC);
// echo '<br><br><pre>';
// print_r($data);
// echo '</pre>';
echo '<h2>Zoznam používateľov</h2>';
echo '<table class="persons">';
echo '<tr>';
echo '<th>ID</th>';
echo '<th>Meno</th>';
echo '<th>Priezvisko</th>';
echo '<th>Vek</th>';
echo '<th>Rola</th>';
echo '</tr>';
for($i=0; $i<count($data); $i++){
echo '<tr>';
foreach($data[$i] as $index => $value){
echo '<td>'.$value.'</td>';
}
echo '</tr>';
}
echo '</table>';
} else {
echo "0 results were selected.";
}
echo '<br><br>';
mysqli_close($connection);
?>
</div>
<div class="clear"></div>
</div>
Ako vidíte, na začiatku sme si vytvorili začiatok nášho príkazu INSERT INTO a následne si prechádzame všetky parametre. Podľa toho, či nám prišla ich hodnota, tak do stringu priliepame túto hodnotu, ak neprišla, tak tam vkladáme NULL. Všimnite si, že vkladáme pred hodnoty aj jednorité úvodzovky, pretože to je varchar (je to takto korektnejšie) a nakoniec sme museli aj zátvorku uzatvoriť. Ak si to chcete odskúšať, tak si skúste samotné vykonanie query (mysqli_query) zakomentovať a dajte si iba vypísať obsah premennej sql_query, aby ste videli, aký príkaz posielame.
Následne podľa odpovede vykonania query vypisujeme hlášku o úspešnom alebo neúspešnom uložení. Pri vykonaní insertu nám DB vráti hodnotu 1 (true) v prípade úspešného uloženia. Všimnite si ešte jednu vec, že načítanie dát z tabuľky sme dali až za vkladanie. Ak by sme mali najprv načítanie dát a potom vkladanie (načítanie sme predtým mali na začiatku kódu stránky), tak by sme po uložení museli ešte stránku refrešnúť, pretože by sa uloženie nového záznamu uskutočnilo až po načítaní dát z tabuľky, takže v našej tabuľke by sme nevideli už novovložený záznam. Takto je to optimálne, netreba žiadny refreš.
Celý náš kód sa skladá teda zo štyroch častí. Prvá je pripojenie do DB (museli sme premenovať premennú user_name na db_user_name, pretože user_name máme použitú pri parametri z formulára), druhá je zachytenie parametrov a vyhodnotenie odoslania formulára. Tretia je samotný formulár a posledná je načítanie dát z databázy a zobrazenie do tabuľky. Aj keď je kód na naše pomery celkom dlhý, celému kódu by ste mali rozumieť, všetko toto sme sa už naučili a spojili sme to logicky dokopy a ako vidíte na stránke, vyzerá to ako vloženie dát na naozajstnej stránke. Šikovní sme že? :)
Presne s týmto sa stretávate denne, ak sa niekde registrujete. Vypĺňate formuláre (dáta), kliknete na registrovať a dáta sa uložia do databázy. Alebo ak niečo komentujete a podobne...skrátka ako sme si už viackrát povedali, všetko čo vkladáte (vpisujete) a následne sa to niekde zobrazuje (status na FB, komentár, registrácia...) sa vo väčšine týmto spôsobom ukladá do databázy.