HalloPHP

Datenbankeintrag löschen

Tutorials | letzte Änderung am 19. Juli '10 um 23:15 Uhr

Motivation

Wir möchten bestimmte Datenbankeinträge über einen Hyperlink aus der Datenbank löschen können.

Die Ausgangssituation

Wir haben bereits alle Datenbankeinträge untereinander aufgelistet und möchten nun über einen simplen Hyperlink einen Eintrag zum Löschen auswählen. Unsere Datei entry.php sieht zunächst noch so aus:

<?php
$c 
mysql_connect('localhost''username''***') OR die (mysql_error());
mysql_select_db('database'$c) OR die (mysql_error());

$sql "SELECT  
          `author`                                          , 
          `text`                                            , 
          DATE_FORMAT(`date`, '%d.%m.%Y') as `date_format` 
        FROM 
          `table` 
        ORDER BY 
          `date`"
;
$result mysql_query($sql$c) OR die (mysql_error());

while (
$row mysql_fetch_assoc($result)) {
  
?>
<p>
  <?php echo $row['author'] . ' - ' $row['date_format']); ?>
</p>
<p>
  <?php echo $row['text']; ?>
</p>
  <?php
}

. Dabei ist es im nächsten Schritt wichtig, dass jeder Eintrag eindeutig identifiziert werden kann. Dazu benötigt unsere Datenbanktabelle, die unsere Einträge enthält, eine Spalte für eine ID, anhand derer wir jeden Datensatz eindeutig ansprechen können. Die Struktur unserer Beispieltabelle könnte zum Beispiel so aussehen:

+----+--------+------+------+
| id | author | text | date |
+----+--------+------+------+

. In dieser Tabelle könnten beispielsweise Kommentare, Gästebuch- oder Newseinträge stehen. Die Spalte ID sollte als Primärschlüssel der Tabelle und die Option auto_increment sollte ebenfalls gewählt werden. Der Code zum Erzeugen dieser Tabelle sieht so aus:

CREATE TABLE `table` (
  `id` INT NOT NULL AUTO_INCREMENT PRIMARY KEY, 
  `author` VARCHAR(30) NOT NULL, 
  `text` TEXT NOT NULL, 
  `date` DATETIME NOT NULL
) ENGINE = MyISAM;

Die Erweiterung

Nun können wir bereits unseren Code um einen Link erweitern, über den wir unsere Einträge löschen können.

<?php
$c 
mysql_connect('localhost''username''***') OR die (mysql_error());
mysql_select_db('database'$c) OR die (mysql_error()); 

$sql "SELECT 
          `id`                                              , 
          `author`                                          , 
          `text`                                            , 
          DATE_FORMAT(`date`, '%d.%m.%Y') as `date_format` 
        FROM 
          `table` 
        ORDER BY 
          `date`"
;
$result mysql_query($sql$c) OR die (mysql_error());

while (
$row mysql_fetch_assoc($result)) {
  
?>
<p>
  <?php echo $row['author'] . ' - ' $row['date_format']); ?>
</p>
<p>
  <?php echo $row['text']; ?>
</p>
<p>
  <a href="delete.php?id=<?php echo $row['id']; ?>">Eintrag löschen</a>
</p>
  <?php
}

Über den Link wird die ID eines gewählten Datensatzes an die delete.php übergeben, mit deren Hilfe wir den Eintrag aus der Datenbank entfernen können. In der delete.php führen wir nun den Löschvorgang aus.

<?php
error_reporting
(E_ALL E_STRICT);

$c mysql_connect('localhost''username''***') OR die (mysql_error());
mysql_select_db('database'$c) OR die (mysql_error());

$sql "DELETE FROM `table` WHERE `id` = " . (int)$_GET['id'];
mysql_query($sql$c) OR die (mysql_error());

header("Location: entry.php");
exit;

Damit funktioniert das Löschen schon ganz gut, doch wir haben noch einen kleinen Fehler im Script, der auf den ersten Blick vielleicht gar nicht einfach zu erkennen ist. Dazu habe ich bereits in der delete.php über error_reporting die Fehlerausgabe aktiviert. Rufen wir nun einmal unsere delete.php ohne den Parameter id auf, erhalten wir eine Fehlermeldung.

Notice: Undefined index: id in ..\delete.php  on line 7

Ein Programm läuft aber erst stabil, wenn es alle möglichen auftretenden Fälle, die den Programmablauf beeinflussen können - in unserem Fall ist das ein Parameter, der übergeben werden oder fehlen kann - berücksichtigt. Wir müssen also überprüfen, ob überhaupt eine ID übermittelt wurde, erst dann dürfen wir den Löschvorgang ausführen.

Variable auf Existenz prüfen

Um eine Variable, in unserem Fall einen GET-Parameter, auf Existenz zu prüfen, bedienen wir uns der Funktion isset().

<?php
error_reporting
(E_ALL E_STRICT);

if (isset(
$_GET['id'])) {
  
$c mysql_connect('localhost''username''***') OR die (mysql_error());
  
mysql_select_db('database'$c) OR die (mysql_error());

  
$sql "DELETE FROM `table` WHERE `id` = " . (int)$_GET['id'];
  
mysql_query($sql$c) OR die (mysql_error());
}

header("Location: entry.php");
exit;

Nun wird auch der auftretende Fall des fehlenden Parameters vom Programm berücksichtigt.

Ausgabe und Löschvorgang in einer Datei

Als letzten Schritt können wir noch den Löschvorgang in die entry.php übernehmen, wenn wir das wollen. Dazu schnappen wir uns einfach den relevanten Code aus der delete.php und fügen ihn an den Anfang unseres Scripts ein. Dies hat zudem den Vorteil, dass wir uns den header() - Befehl sparen können, der uns zuvor zurück zu unserer Liste der Datenbankeinträge gebracht hat. Außerdem können wir nun ganz leicht eine Meldung ausgeben, die uns den Löschvorgang bestätigt.

<?php
$c 
mysql_connect('localhost''username''***') OR die (mysql_error());
mysql_select_db('database'$c) OR die (mysql_error());

// initialize error message
$msg '';
if (isset(
$_GET['id'])) {
  
$sql "DELETE FROM `table` WHERE `id` = " . (int)$_GET['id'];
  
mysql_query($sql$c) OR die (mysql_error());

  
$msg 'Der gewählte Datenbankeintrag wurde gelöscht';
}

if (
$msg != '') {
  
?>
<p>
  <strong>Hinweis:</strong> <?php echo $msg?>
</p>
  <?php
}

$sql "SELECT 
          `id`                                              , 
          `author`                                          , 
          `text`                                            , 
          DATE_FORMAT(`date`, '%d.%m.%Y') as `date_format` 
        FROM 
          `table` 
        ORDER BY 
          `date`"
;
$result mysql_query($sql$c) OR die (mysql_error());

while (
$row mysql_fetch_assoc($result)) {
  
?>
<p>
  <?php echo $row['author'] . ' - ' $row['date_format']); ?>
</p>
<p>
  <?php echo $row['text']; ?>
</p>
<p>
  <a href="?id=<?php echo $row['id']; ?>">Eintrag löschen</a>
</p>
  <?php
}

Dabei muss natürlich der Link noch entsprechend angepasst werden!

<a href="?id=<?php echo $row['id']; ?>">Eintrag löschen</a>

Dieser verweist nun nicht mehr auf die delete.php, sondern auf die aktuelle Seite und hängt die ID an die URL an.

Antworten