PHP Bildergalerie - Alben verwalten
Autor
Flitze
Klicks 161782
Keywords:
PHP Bildergalerie Tutorial, PHP Bildergalerie erstellen, PHP MySQL Bildergalerie, PHP Thumbnails erstellen, PHP Bilder speichern, Tutorial PHP Bildergalerie, Album, Verwaltung, Bildergalerie
Klicks 161782
Rating für PHP Bildergalerie
7.6 von 10
Bewertungen118
Stand
08.10.2014
7.6 von 10
Bewertungen118
Keywords:
PHP Bildergalerie Tutorial, PHP Bildergalerie erstellen, PHP MySQL Bildergalerie, PHP Thumbnails erstellen, PHP Bilder speichern, Tutorial PHP Bildergalerie, Album, Verwaltung, Bildergalerie
Breadcrumb:
Workshops » PHP Bildergalerie » PHP Bildergalerie - Alben verwalten
Alben anlegen, bearbeiten und löschen
[ADSENSE_LINE]Zunächst wird der Ordner "alben" angelegt und mit vier .php-Dateien gefüllt. Diese sind:index.php
- inkludiert das Skript für die gewünschte Aktion (hinzufügen, bearbeiten, löschen)
add.php
- ist für das Hinzufügen neuer Alben verantwortlich
edit.php
- ist für das Bearbeiten bestehender Alben verantwortlich
delete.php
- ist für das Löschen bestehender Alben verantwortlich
Die index.php ist folgendermaßen aufgebaut:
PHP:
<?php
error_reporting(E_ALL);
echo "<h1>Alben</h1>\n";
switch(isset($_GET['action'])?$_GET['action']:''){
case 'add':
include 'alben/add.php';
echo "» <a href=\"index.php?s=alben\">Zurück zum Alben-Menu</a>\n";
break;
case 'edit':
include 'alben/edit.php';
echo "» <a href=\"index.php?s=alben\">Zurück zum Alben-Menu</a>\n";
break;
case 'delete':
include 'alben/delete.php';
echo "» <a href=\"index.php?s=alben\">Zurück zum Alben-Menu</a>\n";
break;
default:
$actions = array('add' => 'hinzufügen',
'edit' => 'bearbeiten',
'delete' => 'löschen');
echo "<ul>\n";
foreach($actions as $action => $name)
echo "<li><a href=\"index.php?s=alben&action=".$action."\">".$name."</a></li>\n";
echo "</ul>\n";
break;
}
?>
Hinzufügen neuer Alben (add.php)
Um neue Alben zu erstellen benötigen wir ein Formular, das uns die Eingabe eines Datums, eines Namens und einer Beschreibung ermöglicht (s. Datenbankspalten). Ohne Rücksicht auf irgendwelche Formatierungen zu nehmen, könnte dieses Formular so aussehen:PHP:
<?php
error_reporting(E_ALL);
echo "<p style=\"font-weight:bold;\">Bereich: <span style=\"font-weight:italic;\">Album hinzufügen</span></p>\n";
echo "<form ".
" action=\"index.php?s=alben&action=add\" ".
" method=\"post\" ".
" accept-charset=\"ISO-8859-1\">\n";
echo "<div>\n";
echo "<label for=\"Name\">Name</label>\n";
echo "<input type=\"text\" name=\"Name\" id=\"Name\" maxlenght=\"50\">\n";
echo "<br />\n";
echo "<label for=\"Beschreibung\">Beschreibung</label>\n";
echo "<input type=\"text\" name=\"Beschreibung\" id=\"Beschreibung\" maxlenght=\"255\">\n";
echo "<br />\n";
// Eingabefelder fürs Datum erzeugen
$datum = getdate();
$tag = $datum['mday'];
$monat = $datum['mon'];
$jahr = $datum['year'];
echo "<select name=\"Tag\">\n";
for($i=1;$i<=31;$i++){
if($i == $tag)
echo "<option value=\"".$i."\" selected>\n";
else
echo "<option value=\"".$i."\">\n";
echo $i.".\n";
echo "</option>\n";
}
echo "</select>\n";
echo "<select name=\"Monat\">\n";
for($i=1;$i<=12;$i++){
if($i == $monat)
echo "<option value=\"".$i."\" selected>\n";
else
echo "<option value=\"".$i."\">\n";
echo $Monatsnamen[$i]."\n";
echo "</option>\n";
}
echo "</select>\n";
echo "<select name=\"Jahr\">\n";
for($i=$jahr-5 ;$i<=$jahr+5; $i++){
if($i == $jahr)
echo "<option value=\"".$i."\" selected>\n";
else
echo "<option value=\"".$i."\">\n";
echo $i."\n";
echo "</option>\n";
}
echo "</select>\n";
echo "<br />\n";
echo "<input type=\"submit\" name=\"submit\" value=\"Speichern\">\n";
echo "</div></form>\n";
?>
Das Formular wird zwecks Übersichtlichkeit an das gleiche Skript gesendet action=\"index.php?s=alben&action=add\" und dort im nächsten Schritt auch verarbeitet. Zuvor möchte ich aber noch kurz auf die Datumseingabe eingehen. Um es dem Benutzer angenehmer zu machen, erstelle ich 3 Auswahllisten (Tag, Monat, Jahr), die als Voreinstellung das aktuelle Datum haben. Dieses wird über die Funktion getdate() ermittelt.
Dann komme ich jetzt mal zur Verarbeitung der Daten, d.h. deren Überprüfung und Eintragung in die Datenbank.
PHP:
<?php
error_reporting(E_ALL);
echo "<p style=\"font-weight:bold;\">Bereich: <span style=\"font-weight:italic;\">Album hinzufügen</span></p>\n";
if(isset($_POST['submit']) AND $_POST['submit']== 'Speichern') {
$errors = array();
if(!isset($_POST['Name'], $_POST['Beschreibung'], $_POST['Tag'], $_POST['Monat'], $_POST['Jahr']))
$errors[] = "Bitte benutzen sie das Formular aus der <b>»</b> <a href=\"index.php?s=alben\">Alben-Administration</a>\n";
else{
if(trim($_POST['Name']) == "")
$errors[] = "Geben Sie die Name ein.\n";
if(trim($_POST['Beschreibung']) == "")
$errors[] = "Geben Sie die Beschreibung ein.\n";
if(!checkdate($_POST['Monat'], $_POST['Tag'], $_POST['Jahr']))
$errors[] = "Sie haben ein ungültiges Datum eingegeben.\n";
}
if(count($errors)){
echo "<p>\n".
"Das Album konnte nicht erstellt werden.<br />\n".
"<br />\n";
foreach($errors as $error)
echo $error."<br />\n";
echo "</p>\n";
}
else {
// Album speichern
$datum = sprintf('%04d-%02d-%02d', $_POST['Jahr'], $_POST['Monat'], $_POST['Tag']);
$sql = "INSERT INTO
Alben
(Name,
Beschreibung,
Datum
)
VALUES
('".mysql_real_escape_string(trim($_POST['Name']))."',
'".mysql_real_escape_string(trim($_POST['Beschreibung']))."',
'".$datum."'
)
";
mysql_query($sql) OR die("<pre>".$sql."</pre>".mysql_error());
echo "<p>\n".
"Das Album wurde gespeichert.<br />\n".
"Sie werden automatisch zu der Alben-Administration weitergeleitet.<br />\n".
"Sollte die automatische Weiterleitung nicht funktionieren, klicken sie bitte <a href=\"index.php?s=alben\">hier</a>\n".
"</p>\n";
echo "<meta http-equiv=\"refresh\" content=\"1; URL=index.php?s=alben\">\n";
}
}
else {
// Formular anzeigen
// ...
}
?>
Zuerst prüfe ich, ob alle $_POST-Variablen vorhanden sind. Danach stelle ich sicher, dass sowohl Name als auch Beschreibung ausgefüllt sind. Als letztes benutze ich die Funktion checkdate() um das eingegebene Datum zu validieren, denn schließlich ist es z.B. theoretisch möglich den 31. Februar 2007 durch die Auswahllisten auszuwählen. Sind alle Daten fehlerfrei, wird das Datum MySQL gerecht formatiert, d.h. im Format YYYY-MM-DD. Danach werden die Daten in die Datenbank eingetragen und der User wird zum Alben-Ausgangsmenu weitergeleitet.
Bearbeiten bestehender Alben (edit.php)
Es kann vorkommen, dass ein bereits erstelltes Album verändert werden muss, weil sich beispielsweise ein Rechtschreibfehler eingeschlichen hat oder ein falsches Datum angegeben wurde. Aus diesem Grund wird eine Editierungsdatei erstellt. Diese orientiert sich stark an der add.php. Der einzige Unterschied besteht darin, dass zunächst ein Auswahlmenu mit allen bestehenden Alben angezeigt wird, aus dem man das zu verändernde Album heraussucht. Die entsprechenden Daten werden dann bereits in das Formular eingetragen. Programmiertechnisch sieht das so aus:PHP:
<?php
error_reporting(E_ALL);
echo "<p style=\"font-weight:bold;\">Bereich: <span style=\"font-weight:italic;\">Album bearbeiten</span></p>\n";
if(isset($_POST['ID']) AND $_POST['ID'] != "0") {
if(isset($_POST['submit']) AND $_POST['submit'] == 'Album ändern') {
$errors = array();
if(!isset($_POST['Name'], $_POST['Beschreibung'], $_POST['Tag'], $_POST['Monat'], $_POST['Jahr']))
$errors[] = "Bitte benutzen sie das Formular aus der <b>»</b> <a href=\"index.php?s=alben\">Alben-Administration</a>\n";
else{
if(trim($_POST['Name']) == "")
$errors[] = "Geben Sie die Name ein.\n";
if(trim($_POST['Beschreibung']) == "")
$errors[] = "Geben Sie die Beschreibung ein.\n";
if(!checkdate($_POST['Monat'], $_POST['Tag'], $_POST['Jahr']))
$errors[] = "Sie haben ein ungültiges Datum eingegeben.\n";
}
if(count($errors)){
echo "<p>\n".
"Das Album konnte nicht bearbeitet werden.<br />\n".
"<br />\n";
foreach($errors as $error)
echo $error."<br />\n";
echo "</p>\n";
}
else {
// Album updaten
$datum = sprintf('%04d-%02d-%02d', $_POST['Jahr'], $_POST['Monat'], $_POST['Tag']);
$sql = "UPDATE
Alben
SET
Name = '".mysql_real_escape_string(trim($_POST['Name']))."',
Beschreibung = '".mysql_real_escape_string(trim($_POST['Beschreibung']))."',
Datum = '".$datum."'
WHERE
ID = '".$_POST['ID']."'
";
mysql_query($sql) OR die("<pre>".$sql."</pre>".mysql_error());
echo "<p>\n".
"Das Album wurde bearbeitet.<br />\n".
"Sie werden automatisch zu der Alben-Administration weitergeleitet.<br />\n".
"Sollte die automatische Weiterleitung nicht funktionieren, klicken sie bitte <a href=\"index.php?s=alben\">hier</a>\n".
"</p>\n";
echo "<meta http-equiv=\"refresh\" content=\"1; URL=index.php?s=alben\">\n";
}
}
elseif(isset($_POST['submit']) AND $_POST['submit'] == 'Album auswählen') {
$sql = "SELECT
Name,
Beschreibung,
YEAR(Datum) as Jahr,
MONTH(Datum) as Monat,
DAYOFMONTH(Datum) as Tag
FROM
Alben
WHERE
ID = '".$_POST['ID']."'
";
$result = mysql_query($sql) OR die("<pre>".$sql."</pre>".mysql_error());
$row = mysql_fetch_assoc($result);
echo "<form ".
" action=\"index.php?s=alben&action=edit\" ".
" method=\"post\" ".
" accept-charset=\"ISO-8859-1\">\n";
echo "<div>\n";
echo "<label for=\"Name\">Name</label>\n";
echo "<input type=\"text\" name=\"Name\" id=\"Name\" maxlenght=\"50\" value=\"".htmlentities($row['Name'], ENT_QUOTES)."\" >\n";
echo "<br />\n";
echo "<label for=\"Beschreibung\">Beschreibung</label>\n";
echo "<input type=\"text\" name=\"Beschreibung\" id=\"Beschreibung\" maxlenght=\"255\" value=\"".htmlentities($row['Beschreibung'], ENT_QUOTES)."\" >\n";
echo "<br />\n";
echo "<select name=\"Tag\">\n";
for($i=1;$i<=31;$i++){
if($i == $row['Tag'])
echo "<option value=\"".$i."\" selected>\n";
else
echo "<option value=\"".$i."\">\n";
echo $i.".\n";
echo "</option>\n";
}
echo "</select>\n";
echo "<select name=\"Monat\">\n";
for($i=1;$i<=12;$i++){
if($i == $row['Monat'])
echo "<option value=\"".$i."\" selected>\n";
else
echo "<option value=\"".$i."\">\n";
echo $Monatsnamen[$i]."\n";
echo "</option>\n";
}
echo " </select>\n";
echo " <select name=\"Jahr\">\n";
for($i=$row['Jahr']-5 ;$i<=$row['Jahr']+5; $i++){
if($i == $row['Jahr'])
echo "<option value=\"".$i."\" selected>\n";
else
echo "<option value=\"".$i."\">\n";
echo $i."\n";
echo "</option>\n";
}
echo "</select>\n";
echo "<br />\n";
echo "<input type=\"hidden\" name=\"ID\" value=\"".$_POST['ID']."\" />\n";
echo "<input type=\"submit\" name=\"submit\" value=\"Album ändern\" />\n";
echo "</div></form>\n";
}
}
else {
// Vorauswahl alles bestehenden Alben
$sql = "SELECT
ID,
Name
FROM
Alben
ORDER BY
Name ASC
";
$result = mysql_query($sql) OR die("<pre>".$sql."</pre>".mysql_error());
if(!mysql_num_rows($result)) {
echo "<p>\n".
"Es befinden sich keine Alben in der Datenbank\n".
"</p>\n";
}
else {
echo "<form ".
"action=\"index.php?s=alben&action=edit\" ".
"method=\"post\" ".
"accept-charset=\"ISO-8859-1\">";
echo " <div>\n";
echo "<select name=\"ID\">\n";
echo " <option value=\"0\">Bitte ein Album wählen</option>\n";
while($row = mysql_fetch_assoc($result)) {
echo " <option value=\"".$row['ID']."\">\n";
echo htmlentities($row['Name'], ENT_QUOTES)."\n";
echo " </option>\n";
}
echo "</select>\n";
echo "<br />\n";
echo "<input type=\"submit\" name=\"submit\" value=\"Album auswählen\" />";
echo " </div>\n";
echo "</form>\n";
}
}
?>
Im letzten else befindet sich das Vorauswahlformular, bei dessen Abschicken die ID des Albums übertragen wird. Aufgrund dieser ID werden die entsprechenden Daten aus der Datenbank geholt und in das zweite Formular eingetragen. Dabei ist zu erwähnen, dass ich das Datum nicht „als Ganzes“, sondern aufgeteilt in Tag mittels DAYOFMONTH, Monat mittels MONTH und Jahr mittels YEAR auslese, damit ich den Auswahllisten später die entsprechenden Werte zuweisen kann. Außerdem habe ich am Ende noch ein hidden-Feld eingefügt, damit ich die ID des Albums nicht verliere. Die Überprüfungen sind identisch mit denen der add.php aber statt des INSERT INTO-Statements benutze ich nun ein UPDATE-Statement das in der WHERE-Bedingung die übergebene ID erwartet, damit auch das richtige Album bearbeitet wird.
Löschen bestehender Alben (delete.php)
Erstmal gibt’s wieder ein Auswahlformular, das die Albennamen anzeigt und deren IDs übergibt. Zur Sicherheit werden dann ein paar Infos über das Album angezeigt (Name, Beschreibung, Anzahl der Bilder, Datum), man will ja nicht das falsche löschen. Außerdem sollte es noch möglich sein zu entscheiden, ob die Bilder in dem Album gelöscht oder nur einem anderen Album zugeordnet werden sollen. Das wird über radio-Buttons realisiert, denn wir wollen ja nur entweder löschen oder verschieben. Eine der beiden Aktionen muss aber durchgeführt werden, denn sonst gäbe es für die Fotos nach dem Löschen des Albums keine Zuordnung mehr. Lange Rede kurzer Sinn, hier der Code:PHP:
<?php
error_reporting(E_ALL);
echo "<p style=\"font-weight:bold;\">Bereich: <span style=\"font-weight:italic;\">Album löschen</span></p>\n";
if(isset($_POST['ID']) AND $_POST['ID'] != "0") {
if(isset($_POST['submit']) AND $_POST['submit'] == 'Album löschen') {
$errors = array();
if(!isset($_POST['Aktion']) OR ($_POST['Aktion']!='delete' AND $_POST['Aktion']!='move'))
$errors[] = "Bitte benutzen sie das Formular aus der <a href=\"index.php?s=alben\">Alben-Administration</a>\n";
else{
if($_POST['Aktion'] == 'move' AND (!isset($_POST['neue_ID']) OR $_POST['neue_ID']=='0'))
$errors[] = "Bitte wählen Sie ein Album aus, in das die Fotos verschoben werden sollen.\n";
}
if(count($errors)){
echo "<p>\n".
"Das Album konnte nicht gelöscht werden.<br />\n".
"<br />\n";
foreach($errors as $error)
echo $error."<br />\n";
echo "</p>\n";
}
else {
// Album löschen
$sql = "DELETE FROM
Alben
WHERE
ID = '".$_POST['ID']."'
";
mysql_query($sql) OR die("<pre>".$sql."</pre>".mysql_error());
echo "Das Album wurde gelöscht<br />\n";
if($_POST['Aktion'] == 'delete'){
$sql = "SELECT
ID,
Name
FROM
Fotos
WHERE
Alben_ID = '".$_POST['ID']."'
";
$result = mysql_query($sql) OR die("<pre>".$sql."</pre>".mysql_error());
while($row = mysql_fetch_assoc($result)){
// Bilder vom Server löschen
unlink(PIC_FOLDER.$row['Name']);
// Thumbnails vom Server löschen
unlink(TN_FOLDER."TN".substr($row['Name'],3));
// Bilder aus der Datenbank löschen
$sql = "DELETE FROM
Fotos
WHERE
ID = '".$row['ID']."'
";
mysql_query($sql) OR die("<pre>".$sql."</pre>".mysql_error());
}
echo "Die Fotos und Thumbnails wurden gelöscht<br />\n";
}
else{
$sql = "UPDATE
Fotos
SET
Alben_ID = '".$_POST['neue_ID']."'
WHERE
Alben_ID = '".$_POST['ID']."'
";
mysql_query($sql) OR die("<pre>".$sql."</pre>".mysql_error());
echo "Die Fotos wurden verschoben<br />\n";
}
echo "Sie werden automatisch zu der Alben-Administration weitergeleitet.<br />\n".
"Sollte die automatische Weiterleitung nicht funktionieren, klicken sie bitte <a href=\"index.php?s=alben\">hier</a>\n".
"</p>\n";
echo "<meta http-equiv=\"refresh\" content=\"1; URL=index.php?s=alben\">\n";
}
}
elseif(isset($_POST['submit']) AND $_POST['submit'] == 'Album auswählen') {
$sql = "SELECT
Name,
Beschreibung,
DATE_FORMAT(Datum, '%d.%m.%Y') as Datum
FROM
Alben
WHERE
ID = '".$_POST['ID']."'
";
$result = mysql_query($sql) OR die("<pre>".$sql."</pre>".mysql_error());
$row = mysql_fetch_assoc($result);
// Anzahl der Fotos im Album ermitteln
$sql = "SELECT
COUNT(*)
FROM
Fotos
WHERE
Alben_ID = '".$_POST['ID']."'
";
$result = mysql_query($sql) OR die("<pre>".$sql."</pre>".mysql_error());
$anzahl_fotos = mysql_result($result, 0);
echo "Name: ".htmlentities($row['Name'], ENT_QUOTES)."\n<br />".
"Beschreibung: ".htmlentities($row['Beschreibung'], ENT_QUOTES)."\n<br />".
"Datum: ".$row['Datum']."\n<br />".
"Fotos: ".$anzahl_fotos."\n<br />";
echo "<br />\n";
echo "<form ".
" action=\"index.php?s=alben&action=delete\" ".
" method=\"post\" ".
" accept-charset=\"ISO-8859-1\">\n";
echo "<div>\n";
echo "Die Fotos in diesem Album werden<br />\n";
echo "<input type=\"radio\" name=\"Aktion\" value=\"delete\" checked=\"checked\" />\n";
echo "gelöscht\n<br />";
$sql = "SELECT
ID,
Name
FROM
Alben
WHERE
ID <> '".$_POST['ID']."'
ORDER BY
Name ASC
";
$result = mysql_query($sql) OR die("<pre>".$sql."</pre>".mysql_error());
if(!mysql_num_rows($result)) {
echo "<span style=\"font-style:italic;\">Keine weiteren Alben vorhanden</span><br />\n";
}
else{
echo "<input type=\"radio\" name=\"Aktion\" value=\"move\" />\n";
echo "verschoben nach\n";
echo "<select name=\"neue_ID\">\n";
echo " <option value=\"0\">Bitte ein Album wählen</option>\n";
while($row = mysql_fetch_assoc($result)) {
echo " <option value=\"".$row['ID']."\">\n";
echo htmlentities($row['Name'], ENT_QUOTES)."\n";
echo " </option>\n";
}
echo "</select>\n";
echo "<br />\n";
}
echo "<input type=\"hidden\" name=\"ID\" value=\"".$_POST['ID']."\" />\n";
echo "<input type=\"submit\" name=\"submit\" value=\"Album löschen\" />\n";
echo "</div></form>\n";
}
}
else {
// Vorauswahl alles bestehenden Alben
$sql = "SELECT
ID,
Name
FROM
Alben
ORDER BY
Name ASC
";
$result = mysql_query($sql) OR die("<pre>".$sql."</pre>".mysql_error());
if(!mysql_num_rows($result)) {
echo "<p>\n".
"Es befinden sich keine Alben in der Datenbank\n".
"</p>\n";
}
else {
echo "<form ".
"action=\"index.php?s=alben&action=delete\" ".
"method=\"post\" ".
"accept-charset=\"ISO-8859-1\">";
echo " <div>\n";
echo "<select name=\"ID\">\n";
echo " <option value=\"0\">Bitte ein Album wählen</option>\n";
while($row = mysql_fetch_assoc($result)) {
echo " <option value=\"".$row['ID']."\">\n".
htmlentities($row['Name'], ENT_QUOTES)."\n".
" </option>\n";
}
echo "</select>\n";
echo "<br />\n";
echo "<input type=\"submit\" name=\"submit\" value=\"Album auswählen\" />";
echo " </div>\n";
echo "</form>\n";
}
}
?>
Das erste Auswahlformular ist identisch mit dem aus der edit.php. Mit Hilfe der übergebenen Alben ID wird der betroffene Datensatz ausgewählt. Dabei ist zu beachten, dass ich beim Auswählen des Datums die MySQL-Funktion DATE_FORMAT() benutze. '%d.%m.%Y' bedeutet dabei, dass ich das Datum in die in Deutschland gebräuchliche Form DD.MM.YYYY umwandle. Danach zeige ich die Informationen über das Album an und überprüfe, ob es außer dem zu löschenden Album noch weitere Alben gibt, in die die Bilder eventuell verschoben werden können. Das tue ich mit diesem Query :
PHP:
<?php
$sql = "SELECT
ID,
Name
FROM
Alben
WHERE
ID <> '".$_POST['ID']."'
ORDER BY
Name ASC
";
?>
Im nächsten Schritt werden dann die Eingaben auf etwaige Fehler geprüft (z.B. 'verschieben' gewählt, aber keinen Ziel-Ordner angegeben). Bei fehlerfreien Daten wird dann als nächstes das Album selbst gelöscht und die Bilder in diesem Album abhängig von meiner Auswahl der Radio-Buttons entweder gelöscht oder verschoben.
Löschen bedeutet, dass die Bilder
- aus der Datenbank gelöscht werden
- als Dateien und Thumbnails vom Server gelöscht werden
Beim physischen Löschen werden übrigens die Konstanten benutzt, die in der config.php stehen.
Beim Verschieben hingegen wird lediglich die Alben ID des Fotos gegen die des neuen Albums ausgetauscht.
Damit wir die delete.php auch ausreichend testen können, müssen wir erstmal Fotos hochladen können. Damit geht’s auf der nächsten Seite los.
Zurück zur vorigen Seite:
PHP Bildergalerie - Grundstruktur Weiter zur nächsten Seite:
PHP Bildergalerie - Thumbnails