Formulare mit PHP dynamisch erzeugen
Daten aus/in einer MySQL-Tabelle abrufen, ändern oder neu anlegen
mit einem dynamisch erzeugtem Formular
Oftmals sieht man hier Skripte, die ein Formular darstellen,
das von einer Datenbank "gefüttert" wird.
Diese Formulare sind manchmal recht umfangreich und enthalten
eine entsprechende Anzahl von Zeilen wie...
Das ist natürlich einigermaßen umständlich:
Wird die Tabellenstruktur der Tabelle geändert, aus der die Daten stammen,
muß das Formular immer nachgebessert werden.
Schreibfehler können sich einschleichen.
Deshalb hab' ich jetzt mal versucht, die Sache ein bißchen zu vereinfachen.
Das folgende Skript stellt ein Formular dar, das aufgrund einer Tabellenstruktur
erzeugt wird. Das heißt, dass auch nachträglich in die Tabelle eingefügte Spalten
im Formular angezeigt werden, ohne dass man das Formular ändern muß.
Zusätzlich enthält das Formular ein Suchfeld zur Eingabe eines Datensatzes.
Nicht sehr originell, normalerweise würde man einen "Suchbegriff" eingeben,
aber das kann man ja ändern.
Was jeweils im Skript geändert werden muß, ist der Name der Tabelle, was ja mit
der Ersetzen-Funktion eines Editors leicht zu bewerkstelligen ist.
Bei Tabellen ist zu beachten, macht, glaub' ich, sowieso jeder, dass sich die Datensatz-ID
in der ersten Spalte befindet.
Auf Fehler abzufragen, z.B. sind alle Felder ausgefüllt etc., hab' ich jetzt natürlich
verzichtet, um das Skript so kurz wie möglich zu halten.
Heißt, beim Klick auf die Schaltfläche Speichern wird einfach ein leerer Datensatz
eingefügt. Das muß dann jeder selber abfangen.
Verwendete Software:
Linux Debian Sarge
Apache
MySQL
PHP
Das Skript:
Ich habe mit dem Skript verschiedene Tabellen bearbeitet, hat einwandfrei funktioniert.
Das soll aber jetzt keine Garantie sein.
Wer sich wundert, warum in der Formulardeklaration action="aleks.php" steht:
Inspiriert wurde ich von dem User Aleksander, der immer solche endlosen Formulare postet.
So, jetzt machen wir mal Schluß, ist eh' lang genug.
Grüße
Günni
mit einem dynamisch erzeugtem Formular
Oftmals sieht man hier Skripte, die ein Formular darstellen,
das von einer Datenbank "gefüttert" wird.
Diese Formulare sind manchmal recht umfangreich und enthalten
eine entsprechende Anzahl von Zeilen wie...
<INPUT type="text" name="email" value="'.$row['email']….usw.
Das ist natürlich einigermaßen umständlich:
Wird die Tabellenstruktur der Tabelle geändert, aus der die Daten stammen,
muß das Formular immer nachgebessert werden.
Schreibfehler können sich einschleichen.
Deshalb hab' ich jetzt mal versucht, die Sache ein bißchen zu vereinfachen.
Das folgende Skript stellt ein Formular dar, das aufgrund einer Tabellenstruktur
erzeugt wird. Das heißt, dass auch nachträglich in die Tabelle eingefügte Spalten
im Formular angezeigt werden, ohne dass man das Formular ändern muß.
Zusätzlich enthält das Formular ein Suchfeld zur Eingabe eines Datensatzes.
Nicht sehr originell, normalerweise würde man einen "Suchbegriff" eingeben,
aber das kann man ja ändern.
Was jeweils im Skript geändert werden muß, ist der Name der Tabelle, was ja mit
der Ersetzen-Funktion eines Editors leicht zu bewerkstelligen ist.
Bei Tabellen ist zu beachten, macht, glaub' ich, sowieso jeder, dass sich die Datensatz-ID
in der ersten Spalte befindet.
Auf Fehler abzufragen, z.B. sind alle Felder ausgefüllt etc., hab' ich jetzt natürlich
verzichtet, um das Skript so kurz wie möglich zu halten.
Heißt, beim Klick auf die Schaltfläche Speichern wird einfach ein leerer Datensatz
eingefügt. Das muß dann jeder selber abfangen.
Verwendete Software:
Linux Debian Sarge
Apache
MySQL
PHP
Das Skript:
// Datei enthält Funktionen zur Datenbankverbindung etc.
include("net-comm/inc/session.inc.php");
/*
Datensatz suchen:
cmd: Name der Schaltfläche, die angeklickt wurde
Suchen: Value-Eintrag der Schaltfläche
txt_suchen: Name des Textfeldes, in das ein Datensatz eingegeben werden kann
------------------------------------------------------------------
Gesucht wird ein Eintrag, dessen Datensatz-ID mit id übereinstimmt
*/
$cmd=$_POST['cmd'];
if($cmd=="Suchen"){
$id=$_POST['txt_suchen'];
$query="select * from tabelle where id=$id";
$result=mysql_query($query);
}
/*
Datensatz ändern:
cmd: Name der Schaltfläche, die angeklickt wurde
Ändern: Value-Eintrag der Schaltfläche
HTTP_POST_VARS: Array der übertragenen Formulardaten
data: Array, das die übertragenen Formulardaten aufnimmt
fields: Anzahl der Spaltennamen
-------------------------------------------------------------------
Wenn Daten übertragen wurden, werden sie in der foreach-Schleife
in ein Array übertragen.
Da der Value-Eintrag der Schaltfläche auch übertragen wird, wird das Kopieren
in das Array mit continue unterbunden.
Anschließend wird eine Abfrage abgesetzt, um die Spaltennamen zu ermitteln.
Je nach dem wieviel Spalten ermittelt wurden, werden in der while-Schleife
Updates durchgeführt.
mysql_field_name($result1,$i) enthält jeweils den Spaltennamen,
$data[$i] den Wert, der eingetragen werden soll, where id=".$_POST['id'] bestimmt den Datensatz
*/
if($cmd=="Ändern"){
if($HTTP_POST_VARS){
foreach($HTTP_POST_VARS as $wert){
if($wert=="Ändern"){continue;}
$data=$wert;
}
$query="select * from tabelle";
$result1=mysql_query($query);
$fields=mysql_num_fields($result1);
$i=1;
while($i<$fields){
mysql_query("update tabelle set ".mysql_field_name($result1,$i)." = '$data[$i]' where id=".$_POST['id']) or die("Feld ".mysql_field_name($result1,$i)." wurde nicht aktualisiert");
$i++;
}
}
}
/*
Neuen Datensatz speichern:
cmd: Name der Schaltfläche, die angeklickt wurde
Speichern: Value-Eintrag der Schaltfläche
HTTP_POST_VARS: Array der übertragenen Formulardaten
data: Array, das die übertragenen Formulardaten aufnimmt
valuestring: Enthält die Werte, die gespeichert werden sollen als
Zeichenkette, um sie dem insert-Statement zu übergeben
-----------------------------------------------------------
Die übertragenen Formulardaten werden in ein Array gespeichert.
Dann wird dem Valuestring das zweite Element von data zugewiesen.
Das erste Element wäre das Suchtextfeld, und das ist ja leer bzw. soll ja
nicht abgespeichert werden.
In der for-Schleife werden valuestring nun nacheinander ein Komma und das nächste
Element von data zugewiesen.
Das //echo $query; kann man sich anzeigen lassen, falls der Datensatz nicht gespeichert wird.
Dann sieht man, ob die Abfrage Syntaxfehler enthält.
Die Null im insert-Statement ist ein Platzhalter für die ID des Datensatzes, die ja
automatisch hochgezählt wird und deshalb nicht angegeben werden kann.
*/
if($cmd=="Speichern"){
if($HTTP_POST_VARS){
foreach($HTTP_POST_VARS as $wert){
if($wert=="Speichern"){continue;}
$data=$wert;
}
$valuestring="'$data[1]'";
for($i=2;$i<count($data)-1;$i++){
$valuestring.=",'$data[$i]'";
}
$query="insert into tabelle values(0,$valuestring)";
//echo $query;
mysql_query($query) or die("Datensatz konnte nicht gespeichert werden");
}
}
?>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>Untitled</title>
</head>
<body>
<form action="aleks.php" method="post">
<table border="1">
<tr><td colspan="2">
Datensatz suchen: <input type="text" name="txt_suchen" />
</td></tr>
<tr><td colspan="2"><hr></td></tr>
<?
/*
Wenn die Suche nach einem Datensatz erfolgreich war, wird er
im Formular angezeigt.
*/
if($result){
$row=mysql_fetch_array($result,MYSQL_ASSOC) or die("Keinen passenden Datensatz gefunden");
// Zeiger auf Tabellenkopf, der in der while-Schleife mit der Funktion key ausgelesen wird,
// einmal vorsetzen, da die id nicht geändert werden darf
next($row);
while(key($row)){
echo "<tr><td>".key($row)."</td><td><input type="text" name=".key($row)." value=".$row[key($row)]."></td></tr>";
next($row);
}
/*
Wenn die Suche nicht erfolgreich war bzw. wenn die Seite aufgerufen wird, sind
keine Daten da. Deshalb wird, s.o., eine Abfrage abgesetzt, um die Spaltennamen zu ermitteln
und das Formular aufzubauen
*/
}else{
$query="select * from tabelle";
$result=mysql_query($query);
$fields=mysql_num_fields($result);
$i=1;
while($i<$fields){
echo "<tr><td>".mysql_field_name($result,$i)."</td><td><input type="text" name=".mysql_field_name($result,$i)."></td></tr>";
$i++;
}
}
?>
<tr><td align="center" colspan="2">
<input type="submit" name="cmd" value="Suchen" title="Datensatz suchen(Nr eingeben)">
<input type="submit" name="cmd" value="Ändern" title="Datensatz ändern">
<input type="submit" name="cmd" value="Speichern" title="Neuen Datensatz speichern">
<input type="hidden" name="id" value=<?echo $row[id];?>>
</td></tr>
</table>
</form>
</body>
</html>
Ich habe mit dem Skript verschiedene Tabellen bearbeitet, hat einwandfrei funktioniert.
Das soll aber jetzt keine Garantie sein.
Wer sich wundert, warum in der Formulardeklaration action="aleks.php" steht:
Inspiriert wurde ich von dem User Aleksander, der immer solche endlosen Formulare postet.
So, jetzt machen wir mal Schluß, ist eh' lang genug.
Grüße
Günni
Please also mark the comments that contributed to the solution of the article
Content-ID: 59196
Url: https://administrator.de/contentid/59196
Printed on: December 10, 2024 at 14:12 o'clock
7 Comments
Latest comment
Hallo,
auch wenn ich diese eigene Lösung ganz nett finde, wollte ich anmerken, dass es im PEAR bereits eine fertige, sehr funktionale Lösung gibt: QuickForm!
Zu finden ist dies unter: http://pear.php.net/package/HTML_QuickForm
Neben einer klassenbasierten Bearbeitung des Formulars (das gesamte Formular ist ein PHP-Objekt) bietet es sowohl eingebaute Filter (zB. trim) als auch beliebige Validierungsregeln.
Für alle, die etwas Zeit zur Einarbeitung mitbringen, lohnt sich der Einsatz auf jeden Fall.
PS: Hier ein paar Tutorials, die mir am Anfang geholfen haben:
(de) http://www.rrze.uni-erlangen.de/dienste/web/php/artikel/html-quickform- ...
(de) http://phpmagazin.de/itr/online_artikel/psecom,id,491,nodeid,62.html
(en) http://www.devarticles.com/c/a/Web-Graphic-Design/Using-HTML-Quickform- ...
auch wenn ich diese eigene Lösung ganz nett finde, wollte ich anmerken, dass es im PEAR bereits eine fertige, sehr funktionale Lösung gibt: QuickForm!
Zu finden ist dies unter: http://pear.php.net/package/HTML_QuickForm
Neben einer klassenbasierten Bearbeitung des Formulars (das gesamte Formular ist ein PHP-Objekt) bietet es sowohl eingebaute Filter (zB. trim) als auch beliebige Validierungsregeln.
Für alle, die etwas Zeit zur Einarbeitung mitbringen, lohnt sich der Einsatz auf jeden Fall.
PS: Hier ein paar Tutorials, die mir am Anfang geholfen haben:
(de) http://www.rrze.uni-erlangen.de/dienste/web/php/artikel/html-quickform- ...
(de) http://phpmagazin.de/itr/online_artikel/psecom,id,491,nodeid,62.html
(en) http://www.devarticles.com/c/a/Web-Graphic-Design/Using-HTML-Quickform- ...
Hallo Günni,
ach so, dann verzeih bitte meinen voreiligen Kommentar.
Wenn Du an soetwas schreibst, solltest Du Dir aber eventuell mal CakePHP (http://cakephp.org/) mit dem Scaffolding-Feature ansehen. Das ist auch so etwas in dieser Richtung.
So long,
Stefan
EDIT: Link added.
ach so, dann verzeih bitte meinen voreiligen Kommentar.
Wenn Du an soetwas schreibst, solltest Du Dir aber eventuell mal CakePHP (http://cakephp.org/) mit dem Scaffolding-Feature ansehen. Das ist auch so etwas in dieser Richtung.
So long,
Stefan
EDIT: Link added.
Servus Günni,
find dein Script klasse und wollte es einsetzen - geht soweit auch ganz gut aber ich habe noch ein Problem damit. Die Spalten sind beim Eintrag in die Datenbank immer um 1 nach rechts verschoben. Ich werde noch wahnsinnig. Ich vermute dass es mit dem Feld 'txt_suchen' zusammenhängt. Ich habe in meiner html Seite die das Script aufruft ein Feld mit diesem Namen gemacht und übergebe einen leeren Wert weiter der in deinem Script ja dann in der Variable id gespeichert wird. Auch wenn ich nicht weiss was diese Variable mit dem Eintragen Teil zu tun hab bekomme ich ansonsten eine Fehlermeldung wenn ich das nicht mit an die PHP posten lasse. Wenn ich es posten lasse sieht der Text der eingetragen werden soll so aus: values (0,",'text1'........ mir ist nur nicht klar warum das beim Eintragen teil cmd=Schreiben mit dem was zu tun hat. Ich hoffe du kannst mir helfen
Vielen Dank vorab.
Gruß
Daniel
find dein Script klasse und wollte es einsetzen - geht soweit auch ganz gut aber ich habe noch ein Problem damit. Die Spalten sind beim Eintrag in die Datenbank immer um 1 nach rechts verschoben. Ich werde noch wahnsinnig. Ich vermute dass es mit dem Feld 'txt_suchen' zusammenhängt. Ich habe in meiner html Seite die das Script aufruft ein Feld mit diesem Namen gemacht und übergebe einen leeren Wert weiter der in deinem Script ja dann in der Variable id gespeichert wird. Auch wenn ich nicht weiss was diese Variable mit dem Eintragen Teil zu tun hab bekomme ich ansonsten eine Fehlermeldung wenn ich das nicht mit an die PHP posten lasse. Wenn ich es posten lasse sieht der Text der eingetragen werden soll so aus: values (0,",'text1'........ mir ist nur nicht klar warum das beim Eintragen teil cmd=Schreiben mit dem was zu tun hat. Ich hoffe du kannst mir helfen
Vielen Dank vorab.
Gruß
Daniel