Erweiterung: "Die Laderampe"

Nichts ist bekanntlich so gut, als dass man es nicht noch verbessern könnte. Mit unserem PHP-Code haben wir nun einen Frachter, der den Content transportieren und verwalten kann. Mit Hilfe einer "Laderampe" könnten wir es einem Online-Redakteur ermöglichen, über ein HTML-Formular Content "einzuladen" (Neueingabe) oder zu verändern (Bearbeiten, Löschen). Dazu erweitern wir unser Objekt Nachricht um die folgenden Methoden:

function Formular($id="") {}
function Speichern($id="") {}
function Loeschen($id) {}

Die Erzeugung des HTML-Formulars soll das Objekt natürlich ebenfalls übernehmen. Übrigens: die hier beschriebene Vorgehensweise ist im Prinzip mit dem bekannten "phpMyAdmin" vergleichbar.

Formularerzeugung

Der optionale Parameter der Methode Formular() gibt an, ob ein bestehender Datensatz bearbeitet (dann muss $id einen vorhandenen Wert besitzen) oder ein neuer angelegt werden soll. Die Methode liest daraufhin die Tabellenstruktur aus, in welcher der Datensatz gespeichert werden soll und erstellt ein dafür passendes HTML-Formular. Die einzelnen Formularelemente werden nach ihren Datenbankfeldern benannt und - falls eine $id übergeben wurde - mit dem derzeitigen Inhalt befüllt:

// HTML-Formular erstellen
function Formular($id="") {
  global $dbh;

  // ggfs. Nachricht lesen
  if($id!="") {
  $query = mysql_query("select * from nachricht where nachricht_id = $id", $dbh);
  $data = mysql_fetch_array($query);
  }

  // Tabellenstruktur ermitteln
  $query = mysql_query("show fields from nachricht", $dbh);
  while($row = mysql_fetch_array($query)) {
    echo ucfirst($row["Field"]) . "<br>";
    if(ereg("text", $row["Type"])) {
      echo "<textarea name='".$row["Field"]."' cols='30' rows='8'>".stripslashes($data[$row["Field"]])."</textarea><br>";
    } else {
      echo "<input type='text' name='".$row["Field"]."' size='30' value='".stripslashes($data[$row["Field"]])."'><br>";
    }
  }
}

Den Namen des Datenbankfeldes benutzen wir übrigens auch gleich als Label für das jeweilige Eingabefeld. Zusätzlich unterscheiden wir nach dem Typ der Datenbankfelder: handelt es sich um ein Feld vom Typ Text (tinytext, mediumtext, text), stellen wir eine <textarea> dar, in allen anderen Fällen ein einzeiliges <input>-Feld.

Wurde eine $id übergeben, dann erhalten alle Eingabefelder als Vorbelegung (value-Attribut) den aktuell gespeicherten Wert aus dem assoziativen Array $data. Das alles können wir bequem in einer einzigen while-Schleife erledigen, da die Feldnahmen und die Namen der Eingabefelder identisch sind und wir auf die Werte über das $data-Array zugreifen können.

Speichern

Auch hier wird anhand einer eventuell übergebenen $id entscheiden, ob wir ein INSERT oder ein UPDATE auf die Datenbank fahren. In jedem Fall wird auch hier die Struktur derjenigen Tabelle benötigt, in der wir den Datensatz speichern wollen. Über das assoziative Array $http_POST_VARS können wir die Formulardaten innerhalb unsere Methode Speichern() auswerten.

// Nachricht speichern
function Speichern($id="") {
  global $dbh;
  global $HTTP_POST_VARS;

  // Tabellenstruktur ermitteln
  $query = mysql_query("show fields from nachricht", $dbh);
  while($row = mysql_fetch_array($query)) {
    $felder[] = $row["Field"];
    $werte[] = "'".addslashes($HTTP_POST_VARS[$row["Field"]])."'";
    $update[] = $row["Field"]."='".addslashes($HTTP_POST_VARS[$row["Field"]])."'";
  }
  if($id=="") {
    // Neuen Datensatz speichern
    echo "insert into nachricht (".implode(",", $felder).") values (".implode(",", $werte).")";
  } else {
    // Bestehenden Datensatz updaten
    mysql_query("update nachricht set ".implode(",", $update)." where nachricht_id = $id", $dbh);
  }
}

Je nach "Auftragslage" - also INSERT oder UPDATE - bauen wir uns das jeweils passende SQL-Statement zusammen. Dabei vereinfachen wir, indem wir die Feldnamen und -werte zunächst in Arrays halten und sie erst im SQL-Statement via implode() in eine Zeichenkette umwandeln. Unsere Arbeit wird dadurch erleichtert, dass mySQL es zulässt, dass jeder Datentyp in (einfachen) Anführungszeichen übergeben werden kann, auch wenn es sich um numerische Daten handelt.

Die Methode Speichern() sollte auf jeden Fall zur Sicherheit noch mit Plausibilitätsprüfungen ausgestattet werden. Zusätzlich könnten einige Datenfelder Pflichteingaben sein, während andere optional wären. In diesem Fall sollte Speichern() erst dann aktiv werden, wenn auch wirklich alle benötigten Felder einen gültigen Inhalt aufweisen.

Löschen

Die Methode Loeschen() ist kurz und knapp gehalten. Als Parameter erwartet sie die $id des zu löschenden Datensatzes und fährt anschließend ein DELETE auf die Datenbank. Auch hier sollten natürlich Sicherheitsprüfungen vorgeschaltet werden, bevor tatsächlich gelöscht wird.

// Nachricht loeschen
function Loeschen($id) {
  global $dbh;

  mysql_query("delete from nachricht where nachricht_id = $id", $dbh);
}

Anwendung

Die erweiterten Funktionen (Methoden) der "Laderampe" innerhalb des Objektes Nachricht bringen selbstverständlich nur die reine Funktionalität mit. Angesteuert werden müssen sie natürlich nach wie vor über ein PHP/HTML-Skript. Dank der objekt-orientierten Programmierung ist der Quellcode der Steuerskripte aber erfreulich kurz.

Neue Nachricht:

<form action="neu.php" method="post">
<?
$n = new Nachricht();
if($_action=="go") $n->Speichern();
$n->Formular();
?>
<input type="submit" value="Speichern">
<input type="hidden" name="_action" value="go">
</form>

Das Bearbeiten einer bestehenden Nachricht erfolgt analog - hier muss in den Methoden Speichern() und Formular lediglich die $id angegeben werden.

Noch ein Ausblick - auf die "Laderampe"

Wir haben gelernt, mit Hilfe von Objekten schnell und einfach Content in einer Datenbank zu verwalten. Die vorgestellte Herangehensweise zeichnet sich vor allem durch ihre Flexibilität aus: sollten beispielsweise neue Datenbankfelder für das Objekt "Nachricht" hinzukommen, muss der Quellcode zur Pflege nicht einmal angefasst werden; schließlich sucht er sich seine Informationen selbst zusammen. Lediglich auf der Ausgabeseite müssen Veränderungen vorgenommen werden. Was könnte die Laderampe noch alles leisten?

Man sieht einmal mehr, dass mit dem richtigen Know-how und ein bisschen PHP fast nichts unmöglich ist. Mit Hilfe des "Containerfrachters" und seiner "Laderampen" lassen sich kleine CMS-Systeme im Handumdrehen erstellen und größere Sites wesentlich einfacher und effizienter realisieren.