Anzeigen eines einzelnen Datensatzes

Bisher haben wir einfach alle Daten in Form einer Tabelle angezeigt. Das ist durchaus Sinnvoll und bei wenigen Felder pro Datensatz ein gangbarer Weg. Unsere Informationen wir Vorname, Nachname und Anmerkungen passen gut auf den Bildschirm. Aber sobald wir einige Felder mehr pro Datensatz haben wird das schon problematisch. Stellen Sie sich einfach vor, da kommt die komplette Anschrift noch dazu und weitere Felder. Ersten interessieren uns nicht alle Felder in Form einer Tabelle, die ja als erster Überblick dienen soll und sobald wir alle Daten eines Datensatzes benötigen, interessieren die anderen Daten nicht mehr.

Also integrieren wir die Möglichkeit, in der Tabelle einen Datensatz auswählen zu können und dann wird dieser komplett mit allen Feldern angezeigt. Diese Anzeige kann dann später auch entsprechenden Aufgehübscht werden und vor allem Sinnvoll je nach Einsatzart angezeigt werden.

Im ersten Schritt werden wir einen weiteren Link bei den Nutzeraktionen integrieren. Den Link „anzeigen“ werden wir vor ändern und löschen setzten. Normalerweise wird diese Funktion auch öfter benötigt werden wie die beiden anderen.

<tbody>
    <?php
    foreach ($daten as $inhalt) {
    ?>
    <tr>
        <td>
            <a href="?aktion=anzeigen&id=<?php echo $inhalt->id; ?>">anzeigen</a> 
            <a href="?aktion=bearbeiten&id=<?php echo $inhalt->id; ?>">ändern</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>

Anmerkung am Rande: Wenn wir Platz sparen wollen, könnten wir den Link auch direkt in eine Zelle in die Tabelle integrieren. Sprich, dass man den Nachnamen anklicken kann und dann wird alle Daten angezeigt. Dazu muss aber sichergestellt werden, dass immer auch Daten vorhanden sind – wenn kein Nachname eingetragen ist, sondern nur der Vornamen, kann man nicht auf den Nachnamen klicken. Oder wenn man Platz sparen möchte, kann man auch anstelle des Textes „anzeigen“ ein Icon integrieren. Das hier nur am Rande bemerkt.

Vor der Tabelle lassen wir nun die Daten zu diesem Datensatz ausgeben. Die Tabelle selber brauchen wir danach nicht ausgeben. Am Anfang von unserem PHP-Programm packen wir nun den entsprechenden Code:

<?php
require 'inc/db.php';
if (isset($_GET['aktion']) and $_GET['aktion'] == 'anzeigen') {
}

Wir kontrollieren wieder (was wir auch bereits schon bei Daten ändern und Daten löschen gemacht haben) die $id.

<?php
require 'inc/db.php';
if (isset($_GET['aktion']) and $_GET['aktion'] == 'anzeigen') {
    if ( isset($_GET['id'])) {
        $id_einlesen = (INT) $_GET['id'];
        echo "<h1>Daten anzeigen von $id_einlesen</h1>";
    }
}

Und lassen nun die Daten mit schon gewohnten 4 Schritten prepare ... ausgeben.

<?php
require 'inc/db.php';
if (isset($_GET['aktion']) and $_GET['aktion'] == 'anzeigen') {
    if ( isset($_GET['id'])) {
        $id_einlesen = (INT) $_GET['id'];
        if ($id_einlesen > 0) {
            echo "<h1>Daten anzeigen von $id_einlesen</h1>";
            $dseinlesen = $db->prepare("
                    SELECT id, vorname, nachname, anmerkung, erstellt 
                    FROM kontakte WHERE id = ? ");
            $dseinlesen->bind_param('i', $id_einlesen);
            $dseinlesen->execute();
            $dseinlesen->bind_result($id, $vorname, $nachname, 
                    $anmerkung, $erstellt);
            $dseinlesen->fetch();
            echo "<p>ID: <b> $id </b><br>";          
            echo "Vorname: <b> $vorname </b><br>";          
            echo "Nachname: <b> $nachname </b><br>";          
            echo "Anmerkung: <b> $anmerkung </b><br>";          
            echo "erstellt am: <b> $erstellt </b></p>";          
            echo '<p><a href="index.php">Tabelle anzeigen</a>';
            exit;   
        }
    }
}

Lassen wir nun unseren Code ausführen, werden die Daten des einzelnen Datensatzes ausgegeben, aber keine Tabelle mehr. Es kommt die Meldung „Es liegen keine Daten vor“, die wir ja mitgegeben haben. Allerdings haben wir absolut nichts an der alten Anweisung $db->query("SELECT * FROM kontakte") geändert.

Der einzige Unterschied ist, dass wir die Daten von dem einzelnen Datensatz abgefragt haben und diese anzeigen. Wir haben eine Datenbankverbindung geöffnet. Jetzt fährt die zweite gegen die Wand. Also schließen wie einfach die zuvor geöffnete Datenbankverbindung mit $dseinlesen->close();

Einfach mal probieren ohne das folgende eingefügte exit;!

Zum Schluss haben wir noch ein exit; mitgegeben – es macht ja wenig Sinn danach noch die Tabelle anzuzeigen. Zusätzlich kommt ein Link zum Anzeigen der Tabelle.

Und nun der komplette Quellcode bis zu diesem Punkt:

<?php
require 'inc/db.php';
if (isset($_GET['aktion']) and $_GET['aktion'] == 'anzeigen') {
    if ( isset($_GET['id'])) {
        $id_einlesen = (INT) $_GET['id'];
        if ($id_einlesen > 0) {
            echo "<h1>Daten anzeigen von $id_einlesen</h1>";
            $dseinlesen = $db->prepare("SELECT id, vorname, nachname, anmerkung, erstellt 
                                               FROM kontakte WHERE id = ? ");
            $dseinlesen->bind_param('i', $id_einlesen);
            $dseinlesen->execute();
            $dseinlesen->bind_result($id, $vorname, $nachname, $anmerkung, $erstellt);
            $dseinlesen->fetch();
            echo "<p>ID: <b> $id </b><br>";          
            echo "Vorname: <b> $vorname </b><br>";          
            echo "Nachname: <b> $nachname </b><br>";          
            echo "Anmerkung: <b> $anmerkung </b><br>";          
            echo "erstellt am: <b> $erstellt </b></p>";          
            echo '<p><a href="index.php">Tabelle anzeigen</a>';
            $dseinlesen->close();
            exit;   
        }
    }
}
if (isset($_GET['aktion']) and $_GET['aktion'] == 'loeschen') {
    // löschen von Datensatz
    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 $id 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']);
    }
    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 "<p>Daten werden gespeichert</p>";
    }
}
if (isset($_GET['aktion']) and $_GET['aktion'] == 'feedbackgespeichert') {
    echo '<p class="feedbackerfolgreich">Datensatz wurde gespeichert</p>'; 
}
$modus_aendern = false;
if (isset($_GET['aktion']) and $_GET['aktion'] == 'bearbeiten') {
    $modus_aendern = true;
}
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']);
    }
    $anmerkung = "";
    if (isset($_POST['anmerkung'])) {
        $anmerkung = trim($_POST['anmerkung']);
    }
    if ( $id != '' AND ( $vorname != '' or $nachname != '' or $anmerkung != '')) {
        $update = $db->prepare("UPDATE kontakte SET
                                vorname = ?, nachname = ?, anmerkung = ?
                                WHERE id = ? LIMIT 1");
        $update->bind_param("sssi", $vorname, $nachname, $anmerkung, $id);
        if ( $update->execute() ) {
            echo '<p class="feedbackerfolg">Datensatz wurde geändert</p>';
            $modus_aendern = false;
        }
    }
}
if ( $modus_aendern == false ) {
    $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(en)</th>
            <th>erstellt</th>
        </tr>
    </thead>
    <tbody>
        <?php
        foreach ($daten as $inhalt) {
        ?>
        <tr>
            <td>
                <a href="?aktion=anzeigen&id=<?php echo $inhalt->id; ?>">anzeigen</a> 
                <a href="?aktion=bearbeiten&id=<?php echo $inhalt->id; ?>">ändern</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
    }
} else {
    echo "<h1>Daten ändern</h1>";
    if ( 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->execute();
            $dseinlesen->bind_result($id, $vorname, $nachname, $anmerkung);
            while ($dseinlesen->fetch()) {
                // echo "<li>";
                // echo $id ." / ". $vorname . " ". $nachname;          
            }
        }
    }
}
if ( ! isset($vorname) ) {
    $vorname = '';
}
if ( ! isset($nachname) ) {
    $nachname = '';
}
if ( ! isset($anmerkung) ) {
    $anmerkung = '';
}
?>
<form action="" method="post">
    <p><label>Vorname: 
        <input type="text" name="vorname" id="vorname" value="<?php echo $vorname; ?>">
    </label></p>
    <p><label>Nachname:
        <input type="text" name="nachname" id="nachname" value="<?php echo $nachname; ?>">
    </label></p>
    <p><label>Anmerkung(en):
        <textarea name="anmerkung" id="anmerkung"><?php echo $anmerkung; ?></textarea>
        </label></p>
    <?php    
    if ($modus_aendern != true ) {
        echo '<input type="hidden" name="aktion" value="speichern">';
        echo '<p><input type="submit" value="speichern"></p>';
    }
    else
    {
        echo '<input type="hidden" name="aktion" value="korrigieren">';
        echo '<input type="hidden" name="id" value="'. $id .'">';
        echo '<p><input type="submit" value="ändern"></p>';
    }
    ?>
</form>