Editácia dát v databáze
Na tejto prednáške budeme pokračovať so zavádzaním najpoužívanejších operácii s databázou do praxe a ukážeme si, ako dáta v databáze upravovať. Keďže vieme na našej stránke pridávať používateľov do našej tabuľky a aj si ich zobrazujeme a vieme medzi nimi aj vyhľadávať, teraz si ukážeme, ako dané záznamy upraviť.
Systém upravovania jednotlivých položiek by mohol vyzerať asi takto. V našej tabuľke pribudne ešte jeden stĺpec, v ktorom sa na každom riadku bude nachádzať tlačítko s názvom napríklad upraviť položku. Po kliknutí na tento odkaz nás presmeruje na inú stránku (novú), na ktorej sa bude nachádzať rovnaký formulár, aký máme na domovskej stránke a bude obsahovať už existujúce dáta o danom zázname. Tieto dáta bude možné samozrejme upravovať a po odoslaní editačného formulára sa naše dáta prepíšu a načítajú sa už upravené dáta daného záznamu.
Na naprogramovanie tejto funkcionality netreba žiadne nové vedomosti, už by ste to mohli zvládnuť, kľudne sa s tým skúste potrápiť. Začneme teda pridaním odkazu pre editovanie do každého riadka a vytvorením nového súboru (stránky) pre editovanie. Súbor si nazveme uprava-zaznamu.php. Pre odkaz musíme zabezpečiť, aby sa po presmerovaní vedelo, ktorý záznam chceme editovať, takže si v parametre cez url prepošleme id záznamu pre úpravu. V novom súbore si zatiaľ iba vypíšeme zachytený parameter. Mohlo by to teda vyzerať takto:
index.php (zmena výpisu tabuľky):
…
for($i=0; $i<count($data); $i++){
echo '<tr>';
foreach($data[$i] as $index => $value){
echo '<td>'.$value.'</td>';
}
echo '<td><a href="uprava-zaznamu.php?id_user='.$data[$i]['id'].'">Upraviť záznam</a></td>';
echo '</tr>';
}
…
uprava-zaznamu.php:
<!DOCTYPE html>
<html lang="sk">
<head>
<link rel="stylesheet" type="text/css" href="global.css">
</head>
<body>
<div class="main">
<?php include "header.php";?>
<div class="content">
<?php include "menu.php";?>
<div class="main-content right">
<h1>Editácia používateľa</h1>
<div class="line"></div>
<?php
$id_user = $_GET['id_user'];
echo "ID User : ".$id_user;
?>
</div>
<div class="clear"></div>
</div>
<?php include "footer.php";?>
</div>
</body>
</html>
Ako vidíte, túto sekciu systému (našej webstránky) nebudeme pridávať do menu, používateľ sa na ňu môže dostať len cez odkaz v zozname používateľov. Nová stránka neobsahuje nič, iba kostru našej stránky a výpis zachyteného parametra – id používateľa, ktorého ideme upravovať. Všimnite si najmä, ako sme vytvorili odkaz pre editáciu v tabuľke. Pridali sme nový stĺpec do zoznamu hlavičkových buniek s názvom akcie a do obsahu bunky sme umiestnili odkaz (za výpis všetkých hodnôt stĺpcov pomocou cyklu foreach sme natvrdo pridali poslednú bunku s odkazom). Toto všetko sa generuje v cykle, ktorým prechádzame všetky záznamy v tabuľke, takže sme použili ako výpis parametra prvok id aktuálnej premennej (záznam v aktuálnom kroku cyklu). Keď sa myšou prejdete postupne cez odkazy v jednotlivých riadkoch, v ľavom dolnom rohu prehliadača vidíte url adresu, na ktorú sa po kliknutí prekliknete. Ako idete smerom od hora dole vidíte, že id parameter v url sa vždy mení podľa toho, na akom zázname sme.
Teraz si len skopírujeme formulár do novej stránky a podľa parametra, ktorý nám prišiel, si načítame dáta o danom zázname z databázy. Tieto dáta následne zobrazíme vo formulári, aby boli predvyplnené na editáciu. Malo by to vyzerať asi takto:
uprava-zaznamu.php:
<?php
$id_user = $_GET['id_user'];
//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 '<p class="error">Spojenie s databázou sa nepodarilo nadviazať.</p>';
}
//NACITANIE DAT O USEROVI
if($id_user){
$sql_query = "SELECT * FROM users WHERE id=".$id_user.";";
$result = mysqli_query($connection, $sql_query);
if (mysqli_num_rows($result) > 0) {
$data = mysqli_fetch_all($result, MYSQLI_ASSOC);
$user_name = $data[0]['user_name'];
$user_surname = $data[0]['user_surname'];
$age = $data[0]['age'];
$role = $data[0]['role'];
?>
<!-- Formular pre editovanie 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="edit_user_form" value="Odoslať">
</form>
<?php
}else{
echo '<p class="error">Nepodarilo sa načítať dáta pre editovanie.</p>';
}
}else{
echo '<p class="error">Parameter používateľa pre editáciu sa nepodarilo načítať.</p>';
}
?>
Ako vidíte, na stránke sa nám teraz zobrazí formulár s vyplnenými dátami používateľa, ktoré chceme editovať. V kóde sme sa najprv rovnakým spôsobom pripojili na databázu a následne načítali dáta o konkrétnom používateľovi ($sql_query = "SELECT * FROM users WHERE id=".$id_user.";";). Po načítaní dát sme si tieto dáta priradili do premenných, ktoré máme vytvorené pre hodnoty v položkách formulára (pre atribút value). Ako vidíte, pri priradené sme použili index 0 na premennú data, pretože by sme mali dostať pri selecte podľa id vždy len jeden záznam (keďže to je unique) a tento záznam by mal v poli data ako prvý, preto index 0.
Poďme ale ďalej v našej úlohe, kde nám už stačí len napísať (naprogramovať), čo sa má stať po odoslaní formulára. V podstate si iba skopírujeme kód zo stránky index.php, kde sme po odoslaní formulára dáta ukladali do databázy ako nový záznam s tým, že teraz nebudeme vykonávať príkaz INSERT INTO ale UPDATE, kde budeme musieť špecifikovať, ktorý záznam sa má editovať (s našim ID) a budeme tiež musieť upraviť troška zloženie query. Pri skladaná query (lepenie stringu cez .= a postupné pridávanie názvov stĺpcov na menienie a hodnlt) si môžete dať print_r na vypísanie query a za tým exit, aby sa vám query nevykonávalo a aby ste videli, čo sa má vykonať, resp. ako ste zlepili query, kým to nebudete mať tak, ako treba. V prípade zle zadaných parametrov sa zobrazí rovnako hláška o zle zadaných dátach. V prípade správne zadaných dát sa záznam v DB upraví (vykoná sa query s UPDATE) a dáta sa načítajú už zmenené. Aby to takto bolo, riešenie odoslania formulára umiestnime v kóde pred načítanie dát o danom zázname. Mohlo by to vyzerať asi takto:
uprava-zaznamu.php (pridané za pripojenie do DB pred nacitanie dat o userovi:
...
//SPRACOVANIE ODOSLANIA FORMULARA
if($_SERVER['REQUEST_METHOD'] == 'GET' && $_GET['edit_user_form']){
$user_name = $_GET['user_name'];
$user_surname = $_GET['user_surname'];
$age = $_GET['age'];
$role = $_GET['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 = "UPDATE users SET user_name=";
//otestovanie ci prisli parametre, inak vkladame NULL
if($user_name){
$sql_query .= "'".$user_name."',";
}else{
$sql_query .= "NULL,";
}
$sql_query .= "user_surname='".$user_surname."',age=";
if($age){
$sql_query .= $age.",";
}else{
$sql_query .= "NULL,";
}
$sql_query .= "role=";
if($role){
$sql_query .= "'".$role."'";
}else{
$sql_query .= "NULL";
}
$sql_query .= " WHERE id=".$id_user.";";
$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 databázy sa vyskytla chyba.</p>';
}
}else{
//CHYBNE DATA
echo '<p class="error">Položka nebola uložená - nesprávne vyplnené dáta vo formulári. </p>';
}
}
…
<input type="hidden" name="id_user" value="<?php echo $id_user;?>">
...
Ako sme povedali, iba sme skopírovali kód pre spracovanie formulára z index.php a následne spravili pár zmien. Zmenili sme názov formulára, ktorý sa odoslal, čiže hodnota tlačítka submit (edit_user_form) a celé odoslanie sme zmenili z POST na GET. Ako vieme, kľúčová vec pre túto stránku je parameter id_user, ktorý nám príde, ak sa na túto stránku preklikneme zo sekciu domov. Tu si ale musíme dať pozor na jednu vec a to je to, že ak sa odošle formulár, tak ako vieme, prídu nám iba tie parametre, ktoré sa nachádzajú vo formulári ako položky. Tým pádom je náš parameter po odoslaní formulára a načítaní stránky stratený!
Preto sme do formulára, ako vidíte na konci kódu (hocikde do formu, napríklad pred submit button), pridali skrytý prvok (hidden), ktorý nesie názov id_user a hodnotu, ktorá nám prišla na začiatku. Týmto sme zabezpečili, že sa po odoslaní formu bude v url nachádzať aj parameter id_user, ktorý potrebujeme (táto finta sa využíva veľmi často). Posledná vec, čo sme zmenili, je troška komplikovanejšie vyskladanie query pre príkaz UPDATE. Všimnite si, že sme museli dávať pozor, aby sa nám medzi stĺpcami a hodnotami nachádzali čiarky a na konci sme museli pridať WHERE klauzulu.
Daný kód skutočne pekne funguje, podarilo sa nám teda spraviť aj systém upravovania položiek v databáze. Ako vidíte, po odoslaní formulára dostaneme úspešnú hlášku a dáta vo formulári sú už zmenené. Ak sa prekliknete po editovaní naspäť do sekcie domov, v tabuľke už budú dána naozaj zmenené. Ak ale stále neveríte a chcete si naozaj overiť, že či ste spravili skutočne systém cez web, ktorý mení dáta, pozrite sa do databázy cez phpMyAdmin:) Pomaly sa naša webstránka stáva riadnym informačným systémom, pomocou ktorého vieme spravovať dáta v našej databáze (v tabuľke users). Dúfam, že ste všetko pochopili a poďme našu správu tabuľky v databáze skompletizovať.