MySQL, web - mazanie záznamov

Z Kiwiki
Skočit na navigaci Skočit na vyhledávání

Ď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.

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:

Mazanie údajov z tabuľky city v prostredí phpMyAdmin

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ť.
  • 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.
Výpis obsahu tabuľky city s možnosťou mazania záznamov

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

  1. 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ť).