Hauptmenü

Untermenü

PHP/MySQL - Praxistutorial 1 - Daten löschen

1. Die Abschnitte

2. Erweiterung

Um nun einen Datensatz zu löschen, müssen wir genau so vorgehen, als wenn wir ihn ändern. Also tragt den folgenden Code unterhalb des ersten <a ...>-Tags innerhalb der functions.inc.php ein.


$ausgabe .= '<a href="#"
              onclick="fenster('."'".$_GET['tabelle']."',
              '".$_GET['tabelle'].'&id='.$list[$i]['id']."'".');">
              Löschen
            </a>';

Zum Wegballern (damit mich auch die Counter-Strike-Geschädigten verstehen) nehmen wir diesmal die Datei produkte.php. Als kleines Schmankerl zeige ich euch diesmal, dass man keine drei Dateien benötigt, um ein Formular auszuwerten. Die Vorgehensweise mutet ein wenig seltsam an, es geht hier aber nur um das Prinzip.

3. Die produkte.php

Ich habe mal das Selbstverständliche direkt in den Code eingebaut, nur diesmal geben wir die Formulare komplett per PHP aus. Es gibt nur zwei erwähnenswerte Unterschiede zu den vorherigen Dateien.

$_SERVER['PHP_SELF']

Das habe ich bei der Theorie zu PHP mal kurz unter dem Punkt Arrays erwähnt. Damit ruft man dieselbe Seite noch mal auf. Diese Vorgehensweise ist ein wenig problematisch, da sich dadurch Sicherheitslücken auftun können. ich mache es trotzdem mal aus Anschauungsgründen. Die entsprechenden Parameter für die Tabelle und die ID des Produktes schleifen wir wieder mal per GET durch.

<input type="submit" name="do" value="Ausführen">

Diesmal geben wir unseren Submit-Buttons einen Namen, über den wir dann den Ablauf steuern. Das hat einen entscheidenden Vorteil. Wir könnten also mehrere davon in ein Formular einbauen. Dann haben wir in diesem Fall über $_POST['do'] Zugriff auf den Namen und über den Wert (value) wissen wir, wer gedrückt worden ist.

4. Fallunterscheidung

Bei der Auswertung des Formulars unterscheiden wir diesmal drei Möglichkeiten im Bezug auf den Wert der Radio"-Buttons.

Packt also bitte die Ausgabe des Formulars (echo ...) in folgende Bedingung.


if (!$_POST || $_POST['do'] == 'Zurück' || $warning)
{
  // bisherige Ausgabe des Formulars mittels echo
}

Erläuterung

!$_POST kennen wir schon, das tritt immer ein, wenn das Formular nicht versendet wurde. $_POST['do'] == 'Zurück' benötigen wir gleich für den Widerruf des Löschvorgangs und $warning brauchen wir für die Fehlermeldung.

5. Die Unterscheidung

... sieht wie folgt aus. Tragt sie bitte unterhalb von $produkt = mysql_fetch_assoc($result); ein.


if ($_POST['do'] == 'Ausführen')
{
  if (!$_POST['drop'])
  {
    $warning 'Du mußt dich schon für eines entscheiden!';
  }
  else if ($_POST['drop'] == 'nee')
  {
    $drop 1;
  }
  else if ($_POST['drop'] == 'jau')
  {
    $verify 1;
  }
}

Erläuterung Teil 1

if ($_POST['do'] == 'Ausführen') wird abgearbeitet, wenn der Submit-Button mit Namen do den Wert Ausführen hat, also beim erstmaligen Absenden des Formulars.

if (!$_POST['drop']) fragt ab, ob eine der beiden Radio-Buttons ausgewählt worden ist. Wenn nicht, wird eine Fehlermeldung erzeugt.

Damit diese ausgegeben wird, benötigen wir innerhalb von ...<p>Möchten Sie den Artikel "'.$produkt['produkt'].'" löschen?</p>'... und <p><input type="radio" name="drop" value="jau"... nur einen weiteren Eintrag, der da lautet:


if ($warning) 
{
  echo '<p style="color: #f00">'.$warning.'</p>';
}

Und dazu müsst ihr die bestehende Zeichenkette aufsplitten, also mit einem zusätzlichen echo arbeiten. Aber das macht ihr mal schön selber (oder schaut in die Lösung).

Erläuterung Teil 2

else if ($_POST['drop'] == 'nee') reagiert, wenn "Nee, lass mal" aktiviert wurde. Dann bekommt die Variable $drop den Wert 1 und das Fenster wird kommentarlos geschlossen.

else if ($_POST['drop'] == 'jau') tritt in Kraft, wenn Löschen ausgewählt wurde.

Danach findet eine zusätzliche Überprüfung statt. Dazu muss ein neues Formular erzeugt werden und zwar unterhalb der ersten Ausgabe mit der Bedingung if (!$_POST || $_POST['do'] == 'Zurück' || $warning).


else if ($verify)
{
  echo '<form action="'.$_SERVER['PHP_SELF']
          .'?tabelle='.$_GET['tabelle'].'&id='.$_GET['id']
          .'" method="post">
          <p>
            Sind Sie sich ganz sicher? Wollen Sie den
            Artikel "'.$produkt['produkt'].
            '" WIRKLICH löschen?
          </p>
          <p style="text-align: center">
            <input type="hidden" name="drop" value="'.
              $_POST['drop'].'">
            <input type="submit" name="do" value="Zurück">
            <input type="submit" name="do" value="Löschen">
          </p>
        </form>';
}

Den Wert unseres Radio-Buttons schleifen wir in einem versteckten Feld mit demselben Namen, also drop, durch.

Zurück

Die Bedingung haben wir schon bei der Fallunterscheidung definiert (4.), wir müssen nur den Wert des ausgewählten Radio-Buttons erhalten. Jetzt werdet ihr auch die seltsame Schreibweise in meinem Original-Code verstehen, denn ihr müsst nur unterhalb von <p><input type="radio" name="drop" value="jau"'; Folgendes eingeben.


if ($_POST['drop'] == 'jau') 
{
  echo ' checked="checked"';
}

Sobald ihr nach dem ersten Abschicken des Formulars auf den "Zurück"-Button klickt, bekommt ihr das Anfangsformular zu sehen, mit einem aktivierten "Löschen"-Button. Beim anderen radio-Element ist das nicht nötig, da sich in dem Fall das Fenster eh schließt.

Löschen

Ist auch nur noch Pillepups. Wir ergänzen die if ($_POST['do'] == 'Ausführen')-Bedingung um eine Weitere, die so aussieht.


else if ($_POST['do'] == 'Löschen')
{
  $query 'DELETE FROM 
              produkt 
            WHERE 
              id = '.$_GET['id'];
  $drop mysql_query ($query) or die (mysql_error());
}

Das ausgewählte Produkt wird gelöscht, das Fenster geschlossen und wir landen wieder im Hauptmenü bei den Produkten. Nur eines fehlt. Nämlich das Geplättete.

6. Fazit

Ich hoffe, ihr habt das verstanden und guckt nicht, wie eine Kuh, wenn es donnert. Zu Übungszwecken empfehle ich euch, mal alle Funktionalitäten für jeden einzelnen Punkt einzubauen. Dazu müsst ihr eigentlich nur entsprechende GET-Parameter übergeben und an den Abfragen etwas ändern. Probiert es mal. Solltet ihr Anmerkungen haben, so schickt mir einfach eine Mail.

Aber!

So wirklich sauber war das nicht. Entfernt zum Beispiel mal in der db.inc.php beim error_reporting den Eintrag & ~ E_NOTICE und spielt noch mal alles durch. Da werdet ihr euch ziemlich wundern. Außerdem haben wir noch keine Überprüfung der Inhalte vorgenommen. Und um das Thema Sicherheit haben wir uns auch noch nicht gekümmert. Und wie man Tabellen verbindet, wisst ihr immer noch nicht. Und ... und ... und. Darum holen wir das jetzt in den zwei folgenden Tutorials nach.

zurück zum vorherigen Abschnitt