MySQL, web - mazanie záznamov
Ďalšou úlohou, ktoré je treba v prostredí webu pri práci s databázou vyriešiť je mazanie údajov z tabuliek. V tejto časti bude opísaný a názorne ukázaný spôsob ako z prostredia web stránky vymažeme záznam v databázovej tabuľke.
V tejto časti budeme mazať záznamy z tabuľky city, databázy world.
Obsah
Mazanie údajov v aplikácii phpMyAdmin
Najjednoduchší spôsob ako zmazať z tabuľky údaje je použiť nejaký softvér pre správu databáz. Ukážeme si postup v prostredí phpMyAdmin. Po prihlásení sa do systému, voľbe databázy a tabuľky, z ktorej chceme mazať údaje, stačí kliknúť na ikonu zmazania záznamu:
Systém phpMyAdmin na pozadí odoslal databázovému systému nasledujúci SQL dotaz:
DELETE FROM city WHERE ID=6
Mazanie údajov z tabuľky v php aplikácii
Ako vzor si zoberieme súbor select.php. Štruktúra a opis tohto súboru je v časti MySQL a web. Princíp funkcionality je nasledovný:
- Údaje tabuľky zobrazíme podobne ako pri príkaze SELECT.
- Pre zobrazenie údajov z tabuľky použijeme už známe funkciu zobraz_vysledok_dotazu.
- Po pridaní druhého parametra 'delete', sa zobrazí posledný stĺpec s možnosťou zmazania záznamu,
- Funkcia zobraz_vysledok_dotazu zobrazí všetky záznamy v tabuľke a do posledného stĺpca pridá odkaz na zmazanie.
- Všimnite si, že pri prechode myšou nad tieto obrázky sa mení adresa odkazu:
- http://localhost/vyuka/das/fm/delete.php?id=1
- http://localhost/vyuka/das/fm/delete.php?id=2
- http://localhost/vyuka/das/fm/delete.php?id=3
- Rozdiel v adrese je len v poslednej časti 'id=...'. Práve toto číslo odkazuje na záznam, ktorých chceme zmazať.
- Všimnite si, že pri prechode myšou nad tieto obrázky sa mení adresa odkazu:
- Ak v php aplikácii zistíme, že existuje parameter 'id' a že má nejakú hodnotu, budeme tento záznam zmazať:
- Kontrola url adresy je rovnaká ako v prípade vkladania údajov.
- Vytvoríme SQL dotaz: DELETE FROM city WHERE ID=XXX, kde XXX bude hodnota z URL parametra ID.
- SQL dotaz pošleme na vykonanie a skontrolujeme úspešnosť mazania.
Krok 1: Zobrazenie tabuľky so stĺpcom 'zmazať'
Na riadku 1 až 3 je spojenie sa s databázou, nastavenie správnej znakovej sady a výber databázy. Nasleduje vytvorenie SQL dotazu, ktorý z tabuľky city vyberie záznamy podľa určitého kritéria (všetky slovenské mestá). Na riadku 5 je odoslanie dotazu na databázu. Na riadku č.7 je použitá už známa funkcia zobraz_vysledok_dotazu. Ak uvedieme druhý parameter hodnotu 'delete', vo výslednej tabuľke sa objaví posledný stĺpec, kde bude odkaz na zmazanie riadku.
Upozornenie: Nasledujúca aplikácia ráta s tým, že prvý stĺpec je vždy ID.
1 $link=mysql_connect("student.fmtnuni.sk","student","student") or die("Nespojene");
2 mysql_query("SET NAMES 'utf8'") or die("charset");
3 mysql_select_db("student") or die("Nevybrana DB");
4 $sql="SELECT * FROM city WHERE CountryCode = 'SVK'";
5 $res=mysql_query($sql) or die ("zly dotaz");
6 //zobraznie výsledkov dotazu aj so stĺpcom "delete"
7 zobraz_vysledok_dotazu($res,"delete");
Krok 2: Vytvorenie SQL dotazu
V prípade mazania údajov je tvorba SQL dotazu jednoduchá. Stačí do pripraveného dotazu doplniť jednu hodnotu a tou je ID mazaného záznamu.
Nastáva tu však rovnaký problém, ako pri pridávaní údajov. Údaje chceme mazať len v tom, prípade, ak sme klikli na ikonu zmazania záznamu. Potrebujeme teda skontrolovať URL adresu, či obsahuje časť 'id=hodnota'. Už vieme, že tieto parametre sú uložené v špeciálnej premennej $_GET.
// spojenie sa s databázou
if(sizeof($_GET)>0)
{
// samotné mazanie údajov
}
echo "<h3>Výpis tabuľky</h3>";
// ostatný kód - predchádzajúci výpis
SQL dotaz pre mazanie údajov z tabuľky city je:
DELETE FROM city WHERE ID=...
Tu stačí doplniť len hodnotu ID. Použijeme funkciu, ktorú sme použili aj v časti MySQL, web - vkladanie údajov, a to: getUdaje, ktorá nám prečíta všetky URL parametre a vytvorí nám z nich jednoduché pole.
// spojenie sa s databázou
if(sizeof($_GET)>0)
{
$udaje=getUdaje($_GET);
$SQL_delete="DELETE FROM city where ID=".$udaje["id"];
// samotné mazanie údajov
}
echo "<h3>Výpis tabuľky</h3>";
// ostatný kód
Po zavolaní funkcie getUdaje bude obsahovať premenná $udaje jeden údaj. Poznamenajme, že premenná $udaje je asociatívne pole, preto tento jeden údaj bude na indexe 'id' (hodnota indexu je daná URL parametrom). Chceme teda zmazať údaj v tabuľke city s číslom ID $udaje['id'].
Krok 3: Vykonanie SQL dotazu
Pripravený dotaz ($SQL_delete) stačí odoslať na databázu a skontrolovať odpoveď databázového servera. V prípade úspechu (zmazania) vráti funkcia mysql_query hodnoru true, v prípade neúspechu vráti hodnotu false.
<?php
$link=mysql_connect("db.server","user","password") or die("Nespojene");
mysql_query("SET NAMES 'utf8'") or die("charset");
mysql_select_db("databaza") or die("Nevybrana DB");
if(sizeof($_GET)>0)
{
$udaje=getUdaje($_GET);
$SQL_delete="DELETE FROM city where ID=".$udaje["id"];
$vysledok=mysql_query($SQL_delete);
if($vysledok==true)
{
echo "<p class='dotaz_vysledok'>";
echo "Záznam (".$udaje["id"].") sa podarilo zmazať";
echo "</p>";
}
else
{
echo "<p class='dotaz_vysledok2'>";
echo "Záznam nebol zmazaný. MySQL hlási:<br/>";
echo mysql_error();
echo "</p>";
}
echo "<hr/>";
}
//Výpis tabuľky city bude zobrazený vždy.
echo "<h3>Výpis tabuľky</h3>";
$sql="SELECT * FROM city WHERE CountryCode = 'SVK'";
$res=mysql_query($sql) or die ("zly dotaz");
zobraz_vysledok_dotazu($res,"delete");
mysql_close($link);
?>
Listingy pomocných funkcií
V tento časti sú použité funckie getUdaje a zobraz_vysledok_dotazu, ktoré boli definované v predchádzajúcich častiach. Pre doplnenie výpisu stĺpca s ikonou zmazania riadku bola zmenená funkcia zobraz_vysledok_dotazu.
function zobraz_vysledok_dotazu($res,$zmazat=false)
{
// zistenie, kolko je vo vysledku stlpcov
$field = mysql_num_fields( $res );
for ( $i = 0; $i < $field; $i++ ) {
//nazvy stlpcov si ulozime do pola $names
$names[] = mysql_field_name($res, $i);
}
// ak sa jedná o tabuľku s posledným stĺpcom "zmazať"
if($zmazat=="delete")
{
$names[$field-1] = "Zmazať";
$field++;
}
// informativny vypis o pocte riaadkov vysledku
echo "<p>";
echo "Počet riadkov: ".mysql_num_rows($res);
echo "</p>";
//vysoledok bude formatovany v tabulke
echo "<table border='1'>";
//hlavicka tabulky
echo "<tr class='tabulka_hlavicka'>";
for ( $i = 0; $i < $field; $i++ )
{ //pocet hlaviciek sme si zistili v riaku c. 5
echo "<th>".$names[$i]."</th>";
}
echo "</tr>";
//data tabulky
//prikazom mysql_fetch_array vyberieme jeden (dalsi) zaznam vysledku dotazu
//ak uz dalsi zaznam neexistuje funkcia vrati prazdnu hodnotu a cyklus sa zastavi
while($data=mysql_fetch_array($res,MYSQL_NUM))
{
// zaciatok riadka
echo "<tr>";
//v kazdom riadku bude tolko buniek, kolko je stlpcov vo vysledku
for ( $i = 0; $i < $field; $i++ )
{
//v premennej $data su vysledky dotazu pre jeden riadok
// stĺpec zmazať zobrazím len v prípade, ak má argument funckie $zmazat hodnotu "delete"
// a jedná sa o poslednú bunku v riadku
if($i==$field-1 && $zmazat=="delete")
{
echo "<td><a href=\"delete.php?id=".$data[0]."\"><img src=\"img/drop.png\" alt=\"zmazat\" border=\"0\"/></td>";
}
//v opačnom prípade sa jedná o záznam z databázovej tabuľky
else
{
echo "<td>".$data[$i]."</td>";
}
}
// koniec riadka
echo "</tr>";
}
// koniec tabulky
echo "</table>";
}
Súbory na stiahnutie
- http://subory.fmtnuni.sk/ki_files/databazy/dbs3.zip,
- index.php - súbor obsahujúci samotnú HTML stránku (bez príkazov jazyka PHP),
- select.php - súbor obsahujúci samotnú HTML stránku pre výpis obsahu tabuľky,
- funkcie.php - súbor s pomocnými funkciami pre uľahčenie práce,
- insert.php - súbor obsahujúci samotnú HTML stránku pre vloženie údajov (kód php treba doplniť),
- dbs_styl.css - súbor s definíciou zobrazenia HTML stránky,
- img - adresár s obrázkom použitým ako ikona pre zmazanie záznamu,
- delete.php - súbor obsahujúci samotnú HTML stránku pre mazanie údajov (kód php treba doplniť).