PHP Datenbankformulare
Eher per Zufall habe ich das PEAR MDB_QueryTool entdeckt. War auch schon bei meiner Windows Apache-Version mitinstalliert, so dass ich es sofort genießen konnte. Das Teil macht schöne Sachen. Es gibt einem eine super OO-Schnittstelle zu beliebigen Datenbanken (solange die PEAR Datenbank-Treiber vorhanden sind - sind aber schon fast alle wichtigen da!). Man legt für seine Datenbank eine Klasse an und schon geht es recht zügig weiter. Mit ein bisschen Geschick lässt sich ein Skript entwickeln, dass für jede Datenbank geeignet und wiederverwendbar ist. Ich hab das mal ausprobiert und es geht!!! Für den Test mal ein paar Einschränkungen:
- die Tabelle hat nur CHAR, VARCHAR bzw. STRING-Spalten
- die erste Spalte ist der Primärschlüssel (auch Typ CHAR)
Ich denke, damit kann man erstmal leben (ne Bemerkung am Rande ... XML mag auch nur IDs von Typ CHAR ... müssen ja mit einem Buchstaben anfangen ... ). So nun zum php-Skript:
<?php require_once 'MDB/QueryTool.php'; define('TABLE', 'tabelle'); // <-- hier den Tabellennamen angeben $dsn = 'mysql://root@localhost/datenbank'; // <-- Verbindungsdaten anpassen class Tabelle extends MDB_QueryTool { var $table = TABLE; } $tab = new Tabelle($dsn); $keys = array_keys($tab->getDefaultValues()); // <-- Spaltennamen geholt $tab->primaryCol=$keys[0]; // <-- Primärschlüssel für Zugriffe gesetzt $data = array(); // <-- Zuordnung: Tabellenspaltennamen zu HTML-Formularfeldern und gleich auch foreach ($keys as $col) { $data[$col]=$_POST[$col]; } // POST-Datenzuordnung if ($_POST["action"] == "new") { $tab->add($data); } if ($_POST["action"] == "update") { $tab->update($data); } if ($_POST["action"] == "remove") { $tab->remove($_POST[$tab->primaryCol]); } // <-- aktuelle Spalte wird immer im Formular angezeigt $res = $tab->get($_POST[$tab->primaryCol]); // <-- Zugriff via Primärschlüssel ?>
Das war auch schon alles für die Bearbeitung der Datenbank. Was fehlt ist der dynamische Aufbau eines Formulars für die Datenbanktabelle. Hier unterstützt die Methode: $tab->metadata(). Mit ihrer Hilfe erfahren wir den Aufbau der Tabelle, wobei im Moment nur die Name und die Länge der Spalten von Bedeutung sind. Der Spaltentyp kann auch ausgelesen werden, so dass einer Verfeinerung der ganzen Formularverarbeitung nichts im Wege steht. Im Folgenden wird das Formular dynamisch generiert, also eine Schleife über die Tabellenspalten gelegt. (Im Hinterkopf behalten: Die Datenbank lässt sich ja mittels einer SQL-Abfrage abrufen; die Spalten sind die Spalten der SQL-Abfrage, nicht die der darunterliegenden Tabellen; in unserem Beispiel ist die Abfrage gleich der Tabelle.) Damit größere Felder auch schön angezeigt werden, gibt es einen Schalter bezüglich der Feldlänge (70 Zeichen); was größer ist wird als <textarea> gestaltet.
<style> .f { font-family:Calibri;font-size:14px; } </style> <form class="f" method="post" action="<?echo $_SERVER['PHP_SELF'] ?>"> <?php foreach ($tab->metadata() as $m) { ?>
Wenn man auf den Spaltenbezeichner/Formularnamen clickt, dann wird der Inhalt des Feldes geleert. Ist ganz parktisch :)
<span onclick='document.getElementsByName("<? echo $m['name'] ?>")[0].value=""'> <?php echo $m['name'] ?></span><br/>
Nun die angekündigte Prüfung, ob die Spalte kleiner 70 Zeichen ist. Wenn ja, dann wird ein <input>, wenn nein wird ein <textarea> genommen.
<?php if ($m['len'] < 70) { ?> <input class="f" type="text" name="<?php echo $m['name'] ?>" size="<?php echo $m['len'] ?>" value="<?php echo $res[$m['name']] ?>"/>
Wenn die Spalte der Primärindex ist, dann wird zur einfacheren Auswahl des Schlüssels ein Listfeld mit allen Werten zur Verfügung gestellt. Sobald man eins auswählt, wird der Wert in das eigentliche Formularfeld übernommen.
<?php if ($m['name'] == $tab->primaryCol) { ?> <select onchange='document.getElementsByName("<? echo $m['name'] ?>")[0].value=\ this.options[this.options.selectedIndex].text;' style="width:100;"> <?php foreach ($tab->getCol($m['name']) as $i) { echo '<option>'.$i.'</option>';} ?> </select> <?php } ?> <br/> <?php } else { ?>
Nun der Fall für große Spalten, welcher mittel <textarea> gelöst wird. die Werte für die Anzahl Spalten und Zeilen sind willkürlich und können nach Geschmack angepasst werden. Da das textarea-Feld scrollt, passt sowieso alles hinein.
<textarea class="f" name="<?php echo $m['name'] ?>" cols="80" rows="15"> <?php echo $res[$m['name']] ?></textarea><br /> <?php } } ?>
Die Steuerungzeile für die verschiedenen Aktionen.
<br/> <input type="radio" name="action" value="new" />new <input type="radio" name="action" value="search" checked="checked"/>search <input type="radio" name="action" value="update" />update <input type="radio" name="action" value="remove" />remove <input type="submit" value="senden" /> </form>
Und das war es auch schon. Funktioniert für jede Tabelle und das Skript ist nicht gerade groß geworden. Natürlich sieht es eher schlicht aus, aber manchmal möchte man einfach nicht nur das "phpmyadmin" benutzen, um ein wenig Datenpflege zu betreiben... Was Spass macht, ist die doch sehr knappe Datenbankanbindung via MDB_QueryTool, die trotzdem ausbaubar ist und alles enthält, was das Herz begehrt
2.8.2007
Ich habe das Tools ein wenig weiter ausgebaut. Es hat jetzt den Namen form4db und es gibt eine eigene Web-Site form4db, wo man auch die Skripte downloaden kann.
0 Kommentare:
Kommentar veröffentlichen