Löschen von einzelnen Datensätzen

Wie können nun alle Datensätze anzeigen und neue Datensätze anlegen. Aber wie können wir über unser Programm einzelne Datensätze gezielt löschen?

Für die Benutzeraktion benötigen wir einen Link. Und in diesem Link muss die ID von dem zu löschenden Datensatz mitgegeben werden.

Also erweitern wir im ersten Schritt unserer Tabelle um eine weitere Spalte, in der wir die Nutzeraktionen als Link anbieten können.

Also eine weitere Überschrift:

<table>
    <thead>
        <tr>
            <th>Nutzeraktion</th>
            <th>ID</th>
            <th>Vorname</th>
            <th>Nachname</th>
            <th>Anmerkung</th>
            <th>erstellt</th>
        </tr>
    </thead>
    <tbody>

Und im Bereich mit den Ausgaben erstellen wir eine HTML-Link:

<tbody>
    <?php
    foreach ($daten as $inhalt) {
    ?>
        <tr>
            <td>
                <a href="?aktion=loeschen&id=<?php echo $inhalt->id; ?>">Löschen</a>
            </td>
            <td><?php echo $inhalt->id; ?></td>
            <td><?php echo bereinigen($inhalt->vorname); ?></td>
            <td><?php echo bereinigen($inhalt->nachname); ?></td>
            <td><?php echo bereinigen($inhalt->anmerkung); ?></td>
            <td><?php echo $inhalt->erstellt; ?></td>
        </tr>
    <?php
    }
    ?>
</tbody>

Wieder müssen wir nun auf die Nutzeraktion (klicken auf den Löschlink) vor der Ausgabe und dem einlesen der Datenbank reagieren. Also wird am Anfang unserer PHP-Programm erweitert:

if (isset($_GET['aktion']) and $_GET['aktion']=='loeschen') {
    // loeschen 
}

Und wieder brauchen wir unsere üblichen Schritte mit Vorbereiten und Ausführen der SQL-Anweisung. Allerdings sollten wir davor absichern, dass die übergebene ID auch „nur“ eine Zahl ist bzw. überhaupt vorhanden ist:

Hier überprüfen wir im ersten Schritt, ob diese gesetzt wurde! Dies erfolgt über $_GET. Im Unterschied zu einem Formular, in dem wir die Methode POST oder GET auswählen können, erfolgt bei einem Link immer die Übergabe über GET (was schön in der URL des Browsers zu sehen ist).

if (isset($_GET['aktion']) and $_GET['aktion']=='loeschen') {
    if (isset($_GET['id'])) {

Jetzt transformieren wird noch die Nutzereingabe auf eine Zahl – sprich auf eine Integer. Das geschieht über den folgenden Aufbau:

if (isset($_GET['aktion']) and $_GET['aktion']=='loeschen') {
    if (isset($_GET['id'])) {
        $id = (INT) $_GET['id'];

Und nun können wir das Löschen ausführen, wenn die Variable $id größer als 0 ist:

Hier der komplette Code, ohne dass eine Sicherheitsabfrage erfolgt. Der Datensatz wird sofort gelöscht!

if (isset($_GET['aktion']) and $_GET['aktion']=='loeschen') {
    if (isset($_GET['id'])) {
        $id = (INT) $_GET['id'];
        if ($id > 0)
        {
            $loeschen = $db->prepare("DELETE FROM kontakte WHERE id=(?) LIMIT 1");
            $loeschen->bind_param('i', $id);
            if ($loeschen->execute()) {
                echo "<p>Datensatz wurde gelöscht</p>";
            }
        }       
    }
}

Das ist der grundsätzliche Aufbau, um Datensätze zu löschen. Hier ist jetzt erst einmal keinerlei Sicherheit. Jeder Nutzer kann jeden Datensatz löschen! Wichtig ist hier nun der Punkt, wie die Vorgehensweise zum Ansprechen eines Datensatzes ist.

Das Prinzip für das Ändern von Datensätzen ist gleich.

kompletter bisheriger Code

<?php
require 'inc/db.php';
if (isset($_GET['aktion']) and $_GET['aktion']=='loeschen') {
    if (isset($_GET['id'])) {
        $id = (INT) $_GET['id'];
        if ($id > 0)
        {
            $loeschen = $db->prepare("DELETE FROM kontakte WHERE id=(?) LIMIT 1");
            $loeschen->bind_param('i', $id);
            if ($loeschen->execute()) {
                echo "<p>Datensatz wurde gelöscht</p>";
            }
        }       
    }
}
if (isset($_POST['aktion']) and $_POST['aktion']=='speichern') {
    $vorname = "";
    if (isset($_POST['vorname'])) {
        $vorname = trim($_POST['vorname']);
    }
    $nachname = "";
    if (isset($_POST['nachname'])) {
        $nachname = trim($_POST['nachname']);
    }
    $anmerkung = "";
    if (isset($_POST['anmerkung'])) {
        $anmerkung = trim($_POST['anmerkung']);
    }
    $erstellt = date("Y-m-d H:i:s");
    if ( $vorname != '' or $nachname != '' or $anmerkung != '' )
    {
        // speichern
        $einfuegen = $db->prepare("
             INSERT INTO kontakte (vorname, nachname, anmerkung, erstellt) 
             VALUES (?, ?, ?, NOW())");
        $einfuegen->bind_param('sss', $vorname, $nachname, $anmerkung);
        if ($einfuegen->execute()) {
            header('Location: index.php?aktion=feedbackgespeichert');
            die();
            echo "<h1>gespeichert</h1>";
        }
    }   
}
if (isset($_GET['aktion']) and $_GET['aktion']=='feedbackgespeichert') {
    echo '<p class="feedbackerfolg">Datensatz wurde gespeichert</p>';
}
$daten = array();
if ($erg = $db->query("SELECT * FROM kontakte")) {
    if ($erg->num_rows) {
        while($datensatz = $erg->fetch_object()) {
            $daten[] = $datensatz;
        }
        $erg->free();
    }   
}
if (!count($daten)) {
    echo "<p>Es liegen keine Daten vor :(</p>";
} else {
?>
    <table>
        <thead>
            <tr>
                <th>Nutzeraktion</th>
                <th>ID</th>
                <th>Vorname</th>
                <th>Nachname</th>
                <th>Anmerkung</th>
                <th>erstellt</th>
            </tr>
        </thead>
        <tbody>
            <?php
            foreach ($daten as $inhalt) {
            ?>
                <tr>
                    <td>
                        <a href="?aktion=loeschen&id=<?php echo $inhalt->id; ?>">
                            Löschen</a>
                    </td>
                    <td><?php echo $inhalt->id; ?></td>
                    <td><?php echo bereinigen($inhalt->vorname); ?></td>
                    <td><?php echo bereinigen($inhalt->nachname); ?></td>
                    <td><?php echo bereinigen($inhalt->anmerkung); ?></td>
                    <td><?php echo $inhalt->erstellt; ?></td>
                </tr>
            <?php
            }
            ?>
        </tbody>
    </table>
<?php   
}
function bereinigen($inhalt='') {
    $inhalt = trim($inhalt);
    $inhalt = htmlentities($inhalt, ENT_QUOTES, "UTF-8");
    return($inhalt);
}
?>
<form action="" method="post">
    <label>Vorname: 
        <input type="text" name="vorname" id="vorname">
    </label>
    <label>Nachname: 
        <input type="text" name="nachname" id="nachname">
    </label>
    <label>Anmerkung: 
        <textarea name="anmerkung" id="anmerkung"></textarea>
    </label>
    <input type="hidden" name="aktion" value="speichern">
    <input type="submit" value="speichern">
</form>