Gedächtnis für das Datenpflege-Tool

Wir haben gesehen, dass unser in PHP programmiertes Datenpflege-Tool vergesslich ist. Nicht die eingegebenen Daten vergisst es, sondern beispielsweise Zustände. Wir suchen etwas, lassen aus dem Ergebnis einen Datensatz anzeigen und wollen dann zurück zu den Ergebnissen der Suche. Das klappt noch nicht! Wir wollen nun unserem Datenpflege-Tool ein Zustand-Gedächtnis mitgeben.

Und dafür bieten sich die SESSION-Technik an (siehe im Kurs http://www.php-kurs.com/session-anwenden.htm ). Über Sessions kann man Zustände speichern und kann auf diese wieder zugreifen. Wird also eine PHP-Seite zum ersten Mal aufgerufen, kann man für den Nutzer und seine Aktion in einer Session-Variablen einen Zustand abspeichern und diesen beim nächsten Aufruf wieder einlesen und so wieder nutzen. Dazu müssen zwei Dinge beachtet werden:

  • session_start(); Am Anfang unseres PHP-Programmes müssen die SESSIONs aktiviert (gestartet) werden
  • $_SESSION[''] – Zustände werden in frei benennbaren Platzhaltern gespeichert

Das Starten der Session packen wir am besten in unsere Datei „db.inc“. Diese wird in allen unseren Programmen (gut gerade haben wir nur 1 Seite mit dem Namen index.php) als erstes eingebunden. Dadurch, dass es als erstes eingebunden wird, funktioniert es dann auch. Wichtig ist, dass keinerlei Ausgabe davor erfolgt.

<?php
session_start(); 
error_reporting(E_ALL);
// error_reporting(0);
$db = new mysqli('localhost', 'root', 'root', 'adressbuch');
$db->set_charset('utf8');
if ($db->connect_errno){
    die('Sorry - gerade gibt es ein Problem');
}
function bereinigen($inhalt='') {
    $inhalt = trim($inhalt);
    $inhalt = htmlentities($inhalt, ENT_QUOTES, "UTF-8");
    return($inhalt);
}
?>

Ab jetzt können wir den Zustand unserer Suche in einer Session speichern.

Bisher sieht der PHP-Code unserer Suche wie folgt aus:

    if ( isset($_GET['suchbegriff']) and trim ($_GET['suchbegriff']) != '' )
    {
        $suchbegriff = trim ($_GET['suchbegriff']);

Wir überprüfen vor unserer Suche, ob der Inhalt vorliegt für $_SESSION['suchbegriff']. Diesen gemerkten Inhalt nutzen wir, falls keine neue Suche nach neuen Begriffen vorliegt. Daher die Abfrage ! isset($_GET['suchbegriff'])

Insgesamt sieht unser Code vor der bisherigen Suche also wie folgt aus:

    if ( ! isset($_GET['suchbegriff']) and isset($_SESSION['suchbegriff']) ) 
    {
        $_GET['suchbegriff'] = $_SESSION['suchbegriff'];
    }    

In unserer Suche packen wir jetzt den zu suchenden Inhalt gleich in die SESSION.

    if ( ! isset($_GET['suchbegriff']) and isset($_SESSION['suchbegriff']) ) 
    {
        $_GET['suchbegriff'] = $_SESSION['suchbegriff'];
    }
    if ( isset($_GET['suchbegriff']) and trim ($_GET['suchbegriff']) != '' )
    {
        $_SESSION['suchbegriff'] = $_GET['suchbegriff'];
        $suchbegriff = trim ($_GET['suchbegriff']);

Soweit so gut. Wir haben jetzt ein Gedächtnis für unsere Suche. Aber wie bekommen wir wieder unsere komplette Tabelle? Wir müssen die $_SESSION['suchbegriff']) löschen. Dazu geben wir dem Nutzer die Möglichkeit, die Eingrenzung auf den Suchbegriff wieder aufzuheben. Neben dem „Gesucht wird nach:“ packen wir einen Link:

    if ( isset($_GET['suchbegriff']) and trim ($_GET['suchbegriff']) != '' )
    {
        $_SESSION['suchbegriff'] = $_GET['suchbegriff'];
        $suchbegriff = trim ($_GET['suchbegriff']);
        echo "<p>Gesucht wird nach: <b>$suchbegriff</b>";
        echo ' - wieder <a href="?aktion=allesanzeigen">alle Daten anzeigen</a>';
        echo "</p>"; 
        $suche_nach = "%{$suchbegriff}%";

Die Variable aktion=allesanzeigen können wir am Anfang abfragen und die SESSION dazu löschen.

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

Und nun haben wir ein „Zustands-Gedächtnis“. Für unsere Suchfunktion funktioniert es bereits wunderbar. Für das kommende Kapitel für die Seitenweise anzeige der Daten werden wir es wieder nutzen können.

komplette Quellcode aus diesem Kapitel

<?php
require 'inc/db.php';
if (isset($_GET['aktion']) and $_GET['aktion'] == 'allesanzeigen') {
    unset($_SESSION['suchbegriff']);
}
if (isset($_GET['aktion']) and $_GET['aktion'] == 'sicherheitsabfrage') {
    if ( isset($_GET['id'])) {
        $id_einlesen = (INT) $_GET['id'];
        echo '<h1>Sicherheitsabfrage Löschen</h1>';
        echo '<p>Soll der folgende Datensatz unwiderruflich gelöscht werden?</p>';
        echo '<p><a href="?aktion=loeschen&id='. $id_einlesen.'">endgültig löschen!!</a></p>';
        $_GET['aktion'] = 'anzeigen';
    }
}
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;
        }
    }
}
?>
<form action="" method="get">
    suchen nach:
    <input type="hidden" name="aktion" value="suchen">
    <input type="text" name="suchbegriff" id="suchbegriff">
    <input type="submit" value="suchen">
</form>
<?php
if ( $modus_aendern == false ) {
    $daten = array();
    if ( ! isset($_GET['suchbegriff']) and isset($_SESSION['suchbegriff']) ) 
    {
        $_GET['suchbegriff'] = $_SESSION['suchbegriff'];
    }
    if ( isset($_GET['suchbegriff']) and trim ($_GET['suchbegriff']) != '' )
    {
        $_SESSION['suchbegriff'] = $_GET['suchbegriff'];
        $suchbegriff = trim ($_GET['suchbegriff']);
        echo "<p>Gesucht wird nach: <b>$suchbegriff</b>";
        echo ' - wieder <a href="?aktion=allesanzeigen">alle Daten anzeigen</a>';
        echo "</p>"; 
        $suche_nach = "%{$suchbegriff}%";
        $suche = $db->prepare("SELECT id, vorname, nachname, anmerkung, erstellt FROM kontakte WHERE nachname LIKE ? OR vorname LIKE ? OR anmerkung LIKE ?");
        $suche->bind_param('sss', $suche_nach,$suche_nach,$suche_nach);
        $suche->execute();
        $suche->bind_result($id, $vorname, $nachname, $anmerkung, $erstellt);
        while ($suche->fetch()) {
            $daten[] = (object) array('id' => $id, 
                              'vorname'   => $vorname, 
                              'nachname'  => $nachname, 
                              'anmerkung' => $anmerkung, 
                              'erstellt'  => $erstellt);
        }
        $suche->close();
        $id        = '';
        $vorname   = '';
        $nachname  = '';
        $anmerkung = '';
        $erstellt  = '';
    }
    else
    {
        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=sicherheitsabfrage&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>