TOPlist
Fotoalbum v PHP – manipulace s fotografiemi II

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.



Jaromír Skřivan (4.10. 2002)




Vyhledávání

Rozšířené vyhledávání




Nejčtenější






Knižní tip



Zoner Callisto, tipy, efekty, kouzla

Zoner Callisto, tipy, efekty, kouzla



Diskuzní kotel






Hodnotilo: 342 čtenářů
Výsledek: 2,82


 Tisk
 Doporučit článek

Diskuze: Fotoalbum v PHP – manipulace s fotografiemi II
       
Zobrazit všePřidat nový
Redakce Interval.cz |  Inzerce na Interval.cz |  Hledáme nové autory ISSN 1212-8651 
 © Zoner software, s.r.o., všechna práva vyhrazena, tento server dodržuje právní předpisy o ochraně osobních údajů.