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 https://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>