Fotoalbum v PHP – manipulace s fotografiemi 2.

4. října 2002

Dnes budeme pokračovat tvorbou skriptu na manipulaci s fotografiemi, konkrétně vyřešíme problematiku mazání starých fotografií v existujicích kolekcích. Tím budeme mít skript „manip.php“ již dokončený a budete si jej moci zkopírovat do systémového adresáře aplikace.

Mazání fotografií

Na začátek zopakuji kostru té části skriptu manip.php, která zajišťuje mazání fotografií:

if ($action == „del“) { /* smazani stare fotografie */
  if ($krok == 0) {
    /* (3) vyber kolekce, ze ktere budeme chtit fotografie mazat */
  }
  elseif ($krok == 1) {
    /* (4) vyber fotografii ke smazani ve vybrane kolekci */
  }
  elseif ($krok == 2) {
    /* (5) smazani vybranych fotografii z databaze */
  }
}

Jak bude mazání fotografií fungovat? Uživatel nejprve vybere kolekci (3), ze které bude chtít mazat. Poté se zobrazí obsah kolekce. U každého z thumbnailů bude zobrazen checkbox pro označení fotografie, kterou bude chtít uživatel mazat (4). Nakonec provedeme smazání vybraných fotografií z databáze (5). Jednoduchou představu si lze udělat z následujícího obrázku (4):

Výběr kolekce (3)

    print „<h2>Smazání fotografií</h2>“;
    print „Vyberte kolekci, ze které chcete smazat fotografie<br><br>“;
    print „<form action=\“manip.php\“ method=\“get\“>“;
    print „<input type=\“hidden\“ name=\“action\“ value=\“del\“>“;
    print „<input type=\“hidden\“ name=\“krok\“ value=\“1\“>“;
    print „<b>Kolekce: </b> <select size=\“1\“ name=\“kolekce\“>“;
    mysql_connect(„localhost“, „login“, „heslo“);
    mysql_select_db(„album“);
    $result = mysql_query(„select ID, NAZEV, ROK, DOBA from KOLEKCE order by NAZEV“);
    $p = mysql_num_rows($result);
    if ($p > 0) {
      print „<option value=\“0\“> — vyberte kolekci —„;

      while (list ($kid, $knazev, $krok, $kdoba) = mysql_fetch_array($result)) {
        print „<option value=\“$kid\“> $knazev ($kdoba, $krok)“;
      }
      print „</select>“;
      print „<br><br><input type=\“submit\“ value=\“Vyber\“>“;
    }
    else {
      print „<br><br><b>Nelze smazat žádnou fotografii, neboť ještě není založena žádná kolekce!</b><br>“;
    }
    mysql_close();
    print „</form>“;

V této části se soustředíme zejména na vygenerování formuláře pro výběr kolekce. Na začátku formuláře zajistíme pomocí formulářových prvků typu hidden správné nastavení parametrů $action a $krok, potřebných pro provedení dalšího volání skriptu. Poté vygenerujeme podobným způsobem jako v předchozím díle formulářový prvek select, který bude obsahovat seznam všech kolekcí uložených aktuálně v databázi. Opět ošetříme případ, že v databázi není uložena žádná kolekce.

Výběr fotografií (4)

Po té, co uživatel vybere některou z kolekcí, přejde skript manip.php do 4. části (na vstupu je proměnná $krok == 1), ve které se zobrazí všechny fotografie vybrané kolekce. Pak je vygenerován rozsáhlejší formulář, který bude v html tabulce zobrazovat přehledně jednotlivé fotografie. U každé bude popis a zatržení pro smazání. V tomto formuláři opět použijeme formulářových prvků typu hidden pro předání parametrů $action a $krok pro realizaci 5. části.

    print „<h2>Smazání fotografií</h2>“;
    print „Zatrhněte fotografie, které chcete smazat.<br>“;
    mysql_connect(„localhost“, „login“, „heslo“);
    mysql_select_db(„album“);
    $result = mysql_query(„select ID, POPIS, DATUM, THUMB from FOTKA where KOLEKCE_ID = $kolekce“);
    $ch = mysql_errno();
    $pocet = mysql_num_rows($result);
    if (!$ch) {
      print „<form action=\“manip.php\“ method=\“get\“>“;
      print „<input type=\“hidden\“ name=\“action\“ value=\“del\“>“;
      print „<input type=\“hidden\“ name=\“krok\“ value=\“2\“>“;
      print „<input type=\“hidden\“ name=\“kolekce\“ value=\“$kolekce\“>“;
      print „<input type=\“hidden\“ name=\“pocet\“ value=\“$pocet\“>“;
      print „<table border=\“0\“ cellspacing=\“0\“ cellpadding=\“3\“>“;
      $i = 0;
      while (list ($cislo, $popis, $datum, $thumb) = mysql_fetch_array($result)) {
          print „<tr><td><input type=\“checkbox\“ name=\“photo[$i]\“ value=\“$cislo\“></td>“;
          print „<td valign=\“top\“><img src=\“../photos/$thumb\“ border=\“0\“></td>“;
          print „<td>$popis<br>$datum</td></tr>“;
          $i++;
      }
      print „</table><br><input type=\“submit\“ value=\“Odeber\“></form>“;
    }
    else {
      print „<font color=\“red\“>Při načítání fotografií zvolené kolekce došlo k chybě!</font><br>“;
    }
    mysql_close();

Smazání z databáze (5)

Pokud uživatel vybral kolekci a označil fotografie, které chce smazat, může proběhnout poslední část skriptu:

    print „<h2>Smazání fotografií</h2>“;
    mysql_connect(„localhost“, „login“, „heslo“);
    mysql_select_db(„album“);
    for ($i = 0; $i < $pocet; $i++) {
      if ($photo[$i] > 0) {
        mysql_query(‚delete from FOTKA where ID = ‚.$photo[$i]);
        $ch = mysql_errno();
        if (!$ch) {
          print „Fotografie ID=“.$photo[$i].“ byla úspěšně smazána<br>“;
          mysql_query(„update KOLEKCE set POCET = POCET – 1 where ID = $kolekce“);
        }
        else {
          print „<font color=\“red\“>Při mazání fotografie ID=“.$photo[$i].“ došlo k chybě!</font><br>“;
        }
      }
    }
    mysql_close();

I když je kód části (5) relativně krátký, uvedu zde přesto pár komentářů. Všimněte si, že nezjišťuji z databáze počet fotografií pro danou sekci. To proto, že v části (4) při generování formuláře jsem si vložil prvek hidden a hodnotu proměnné $pocet jsem si předal jako parametr. Tím jsem ve volání skriptu (v jeho 5. části) ušetřil jeden zbytečný přístup k databázi.

Jak poznám, které checkboxy byly zatrženy? K tomu nám slouží pole $photo[$i], kde $i udává pořadí fotografie v kolekci. Je-li hodnota $photo[$i] nulová (pro konkrétní $i), pak to znamená, že fotografie nebyla označena pro smazání. Pokud je hodnota nenulová, pak je tam uloženo skutečné ID fotografie v tabulce FOTKA.

Pokud se tedy podmínka $photo[$i] > 0 vyhodnotí kladně, pak nad tabulkou FOTKA provedeme rovnou sql příkaz DELETE. S každou smazanou fotkou nesmíme zapomenout na snížení počtu fotografií v záznamu vybrané kolekce v tabulce KOLEKCE (příkazem UPDATE). Příkazem cyklu for systematicky otestujeme všechny hodnoty $photo[$i].

Kompletní skript manip.php si můžete stáhnout. Nakopírujte si jej do adresáře \Album\system.

Štítky: Články

Mohlo by vás také zajímat

Nejnovější

Napsat komentář

Vaše e-mailová adresa nebude zveřejněna. Vyžadované informace jsou označeny *