Bearbeiten & Ändern von Datensätzen

Für das Ändern eines Datensatzes benötigen wir wieder eine Möglichkeit, dass der Nutzer einen Eintrag auswählen können. Dazu erstellen wir wieder einen Link, der neben dem Löschen-Link platziert wird.

<td>
    <a href="?aktion=bearbeiten&id=<?php echo $inhalt->id; ?>">bearbeiten</a>
</td>

Kommt jetzt über das Array $_GET[aktion] der Wert „bearbeiten“, sollte der entsprechenden bestehenden Inhalt in einem Formular angezeigt werden.

Aber warum dafür extra ein neues Formular erstellen, wenn wir bereits ein Formular für diese Daten haben? Und genau das ist unser Ansatzpunkt.

Wir können uns noch überlegen, ob wir den bestehenden Inhalt in der normalen Tabelle ausgeben lassen oder nicht. Aber das ist mehr Fingerübung und kann über eine einfache IF-Abfrage geregelt werden.

$modus_aendern = false;
if (isset($_GET['aktion']) and $_GET['aktion']=='bearbeiten') {
    $modus_aendern = true;
}
if ($modus_aendern != true) {
    // Tabelle ausgeben
}

Jetzt haben wir eine Variable mit dem Wert „true“, wenn ein Datensatz geändert werden soll bzw. „false“, wenn keine Änderung ansteht. Zusätzlich benötigen wir die Daten des zu änderten Inhaltes. Diese sollten wir einlesen, bevor wir das Formular anzeigen lassen.

Wir wissen, dass die gewünschte ID des einzulesenden Datensatzes mit über GET übergeben wird. Das als erstes gezeigte einfache Verfahren bietet keinen Schutz. Der Nutzer kann jeden beliebigen Datensatz ändern. Trotzdem wollen wir überprüfen, ob die ID wenigstens eine Ganzzahl ist. Daher wird diese beim Einlesen in eine Ganzzahl (INT) gecastet (so heißt das).

if ( isset($_GET['id']) ) {
    $id_einlesen = (INT) $_GET['id'];

Über (INT) wird alles was über $_GET['id'] herein kommt in eine Ganzzahl umgewandelt. Ändert nun irgendein Schelm in der URL die Zahl in einen Buchstaben, wird durch die Umwandlung daraus 0. Das Problem ist damit immerhin entschärft.

Wenn nun die $id_eingelesen eine Ganzzahl und größer als 0 ist, wird der entsprechende Datensatz eingelesen:

if ( isset($_GET['id']) ) {
    $id_einlesen = (INT) $_GET['id'];
    if ($id_einlesen > 0)
    {   
        $dseinlesen = $erg->prepare("
            SELECT id, vorname, nachname, anmerkung FROM kontakte WHERE id = ? ");
        $dseinlesen->bind_param('i', $id_einlesen);
        $dseinlesen->execute();
        $dseinlesen->bind_result($id, $vorname, $nachname, $anmerkung);
        while ($dseinlesen->fetch()) {
            echo "<li>";
            echo $id . ' / '. $vorname .' '. $nachname;
        }
    }
}

Nun nehmen wir unser Formular und mach dort folgende 4 Änderungen bzw. Erweiterungen.

  • Wir erstellen dort zusätzlich ein unsichtbares Feld, in der wir die ID des bestehenden Datensatzes mitführen.
  • Zusätzlich geben wir in den entsprechenden HTML-Input-Formularfeldern die bestehenden Werte mit über das Attribut
  • Das hidden-Feld mit dem value="speichern" ändern wir in den Wert value="korrigieren"
  • Beim Submit-Button lassen wir anstelle der Beschriftung „speichern“ nun die Beschriftung „ändern“

Nun die Schritte ausführlich.

Zusätzliches Formularfeld mit der ID

Dieses Feld müssen wir in unserem Formular nur ausgeben, wenn geändert wird. Uns Variable $modus_aendern hat dann den Status „true“. Diesen können wir abfragen über

if ($modus_aendern == true) {

Und da kürzer meistens schöner ist:

if ($modus_aendern) {

Ist diese also wahr, wird ein weiteres Feld ausgegeben:

if ($modus_aendern) {
    echo '<input type="hidden" name="id" value="'. $id .'">';
}

Bestehende Daten eintragen, damit diese geändert werden können

Die entsprechenden Formularfelder werden nun einfach mit dem Attribut „value“ erweitert. Bei einem HTML-Formular kann so ein Vorgabewert für ein Formularfeld mitgegeben werden, dass vom Nutzer dann auch geändert werden kann.

Hier benötigen wir nun keine große Abfrage, ob der Wert überhaupt vorhanden ist. Ist kein Wert vorhanden, wird auch nichts ausgegeben. Somit passt also ein einfaches echo immer.

<form action="" method="post">
    <label>Vorname: 
        <input type="text" name="vorname" id="vorname" 
               value="<?php echo $vorname; ?>">
    </label>

hidden-Feld von speichern auf korrigieren

Auch wenn korrigieren ein wenig sperrig sich anhört – es wurde hier bewusst gewählt, damit der Unterscheid klar wird. Wir prüfen später auf diesen Feldinhalt – beim Submit-Button wird „ändern“ verwendet, was aber nicht zur Kontrolle sich eignet, da das Formular auch ohne anklicken des Submit-Buttons abgesendet werden kann.

So sieht der der ursprüngliche Code aus:

    <input type="hidden" name="aktion" value="speichern">
    <input type="submit" value="speichern">
</form>

Und wir klären jetzt über eine if-Abfrage, ob es sich um eine Neuanlage von Daten handelt oder um eine Änderung:

if ($modus_aendern != true) {
    echo '<input type="hidden" name="aktion" value="speichern">';
    echo '<input type="submit" value="speichern">';
    echo '</form>';
}
else
{
    echo '<input type="hidden" name="aktion" value="korrigieren">';
    echo '<input type="submit" value="ändern">';
    echo '</form>';
}

Im obigen Code haben wir auch schon den vierten Punkt erledigt. Die Beschriftung des Submit-Buttons mit ändern.

Speichern der korrigierten Daten

Und somit kommen wir zum Speichern der korrigierten Daten. Auch das wird wieder am Anfang von unserem Programm stattfinden, damit bereits bei der Ausgabe der Tabelle mit allen Daten die korrigierten Daten enthalten sind.

Hierzu fragen wir als erstes ab, ob ein Formularübergabe stattgefunden hat, wo der Aktion-Wert auf „korrigieren“ gesetzt wurde.

Im Großen und Ganzen ist der Code sehr ähnlich wie beim Speichern eines neuen Datensatzes – mit der Ausnahme, dass wir in der SQL-Anweisung UPDATE verwenden und eine WHERE-Bedingung benötigen:

if (isset($_POST['aktion']) and $_POST['aktion']=='korrigieren') {
    $id = "";
    if (isset($_POST['id'])) {
        $id = (INT) trim($_POST['id']);
    }
    $vorname = "";
    if (isset($_POST['vorname'])) {
        $vorname = trim($_POST['vorname']);
    }
    $nachname = "";
    if (isset($_POST['nachname'])) {
        $nachname = trim($_POST['nachname']);
    }
    $anmerkungen = "";
    if (isset($_POST['anmerkungen'])) {
        $anmerkungen = trim($_POST['anmerkungen']);
    }
    if ( $id != '' AND ($vorname != '' or $nachname != '' or $anmerkung != '') )
    {
        // speichern
        $update = $erg->prepare("UPDATE kontakte SET 
                    vorname=?, nachname=?, anmerkung=? WHERE id=? LIMIT 1;");
        $update->bind_param('sssi', $vorname, $nachname, $anmerkungen, $id);
        if ($update->execute()) {
            echo '<p class="feedbackerfolg">Datensatz wurde geändert</p>';
        }
    }
}

Uns somit haben wir die Änderungen an einem bestehenden Datensatz durchgeführt.

kompletter Quellcode bisher

<?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']=='korrigieren') {
    echo "<h1>korrigieren der Daten";
    $upd_id = "";
    if (isset($_POST['id'])) {
        $upd_id = (INT) trim($_POST['id']);
    }
    $upd_vorname = "";
    if (isset($_POST['vorname'])) {
        $upd_vorname = trim($_POST['vorname']);
    }
    $upd_nachname = "";
    if (isset($_POST['nachname'])) {
        $upd_nachname = trim($_POST['nachname']);
    }
    $upd_anmerkung = "";
    if (isset($_POST['anmerkung'])) {
        $upd_anmerkung = trim($_POST['anmerkung']);
    }
    if ( $upd_id != '' AND ($upd_vorname != '' or $upd_nachname != '' or $upd_anmerkung != '') )
    {
        // speichern
        $update = $db->prepare("UPDATE kontakte SET vorname =?, nachname=?, anmerkung=? WHERE id=? LIMIT 1");
        $update->bind_param('sssi', $upd_vorname, $upd_nachname, $upd_anmerkung, $upd_id);
        if ($update->execute()) {
            echo '<p class="feedbackerfolg">Datensatz wurde geändert</p>';
            $modus_aendern = false;
        }
    }
}
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>';
}
$modus_aendern = false;
if (isset($_GET['aktion']) and $_GET['aktion']=='bearbeiten') {
    $modus_aendern = true;
}
if ($modus_aendern != true) 
{
    $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>
        </thead>
        <tbody>
            <?php
            foreach ($daten as $inhalt) {
            ?>
                <tr>
                    <td>
                        <a href="?aktion=bearbeiten&id=<?php echo $inhalt->id; ?>">
                            bearbeiten</a> 
                        <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   
    }
}
if ( $modus_aendern == true and isset($_GET['id']) ) {
    $id_einlesen = (INT) $_GET['id'];
    if ($id_einlesen > 0)
    {   
        $dseinlesen = $db->prepare("SELECT id, vorname, nachname, anmerkung FROM kontakte WHERE id=? ");
        $dseinlesen->bind_param('i', $id_einlesen);
        $dseinlesen->bind_result($id, $vorname, $nachname, $anmerkung);
        $dseinlesen->execute();
        while ($dseinlesen->fetch()) {
            // echo "<li>";
            // echo $id . ' / '. $vorname .' '. $nachname.' '. $anmerkung;
        }
    }
}
function bereinigen($inhalt='') {
    $inhalt = trim($inhalt);
    $inhalt = htmlentities($inhalt, ENT_QUOTES, "UTF-8");
    return($inhalt);
}
?>
<form action="index.php" method="post">
    <label>Vorname: 
        <input type="text" name="vorname" id="vorname" value="<?php echo $vorname; ?>">
    </label>
    <label>Nachname: 
        <input type="text" name="nachname" id="nachname" value="<?php echo $nachname; ?>">
    </label>
    <label>Anmerkung: 
        <textarea name="anmerkung" id="anmerkung"><?php echo $anmerkung; ?></textarea>
    </label>
    <input type="hidden" name="aktion" value="speichern">
<?php
if ($modus_aendern != true) {
    echo '<input type="hidden" name="aktion" value="speichern">';
    echo '<input type="submit" value="speichern">';
    echo '</form>';
}
else
{
    echo '<input type="hidden" name="id" value="'. $id .'">';   
    echo '<input type="hidden" name="aktion" value="korrigieren">';
    echo '<input type="submit" value="ändern">';
    echo '</form>';
}
?>
</form>