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.
- Es wurde keiner von beiden markiert, also soll eine Fehlermeldung ausgegeben werden.
- Es wurde "Nee. lass mal" ausgewählt und das Fenster wird geschlossen.
- Es wurde "Löschen" ausgewählt und es soll eine zusätzliche Möglichkeit geben, das zu bestätigen oder rückgängig zu machen.
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.