Top-Themen

AppleEntwicklungHardwareInternetLinuxMicrosoftMultimediaNetzwerkeOff TopicSicherheitSonstige SystemeVirtualisierungWeiterbildungZusammenarbeit

Aktuelle Themen

Administrator.de FeedbackApache ServerAppleAssemblerAudioAusbildungAuslandBackupBasicBatch & ShellBenchmarksBibliotheken & ToolkitsBlogsCloud-DiensteClusterCMSCPU, RAM, MainboardsCSSC und C++DatenbankenDatenschutzDebianDigitiales FernsehenDNSDrucker und ScannerDSL, VDSLE-BooksE-BusinessE-MailEntwicklungErkennung und -AbwehrExchange ServerFestplatten, SSD, RaidFirewallFlatratesGoogle AndroidGrafikGrafikkarten & MonitoreGroupwareHardwareHosting & HousingHTMLHumor (lol)Hyper-VIconsIDE & EditorenInformationsdiensteInstallationInstant MessagingInternetInternet DomäneniOSISDN & AnaloganschlüsseiTunesJavaJavaScriptKiXtartKVMLAN, WAN, WirelessLinuxLinux DesktopLinux NetzwerkLinux ToolsLinux UserverwaltungLizenzierungMac OS XMicrosoftMicrosoft OfficeMikroTik RouterOSMonitoringMultimediaMultimedia & ZubehörNetzwerkeNetzwerkgrundlagenNetzwerkmanagementNetzwerkprotokolleNotebook & ZubehörNovell NetwareOff TopicOpenOffice, LibreOfficeOutlook & MailPapierkorbPascal und DelphiPeripheriegerätePerlPHPPythonRechtliche FragenRedHat, CentOS, FedoraRouter & RoutingSambaSAN, NAS, DASSchriftartenSchulung & TrainingSEOServerServer-HardwareSicherheitSicherheits-ToolsSicherheitsgrundlagenSolarisSonstige SystemeSoziale NetzwerkeSpeicherkartenStudentenjobs & PraktikumSuche ProjektpartnerSuseSwitche und HubsTipps & TricksTK-Netze & GeräteUbuntuUMTS, EDGE & GPRSUtilitiesVB for ApplicationsVerschlüsselung & ZertifikateVideo & StreamingViren und TrojanerVirtualisierungVisual StudioVmwareVoice over IPWebbrowserWebentwicklungWeiterbildungWindows 7Windows 8Windows 10Windows InstallationWindows MobileWindows NetzwerkWindows ServerWindows SystemdateienWindows ToolsWindows UpdateWindows UserverwaltungWindows VistaWindows XPXenserverXMLZusammenarbeit

Formulare mit PHP dynamisch erzeugen

Anleitung Entwicklung PHP

Mitglied: Guenni

Guenni (Level 2) - Jetzt verbinden

16.05.2007, aktualisiert 28.04.2008, 34132 Aufrufe, 7 Kommentare, 1 Danke

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...

<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.

efa2d0732a7a76603e1f19c0cd6daafe-unbenannt - Klicke auf das Bild, um es zu vergrößern

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:

01.
// Datei enthält Funktionen zur Datenbankverbindung etc. 
02.
include("net-comm/inc/session.inc.php"); 
03.
/* 
04.
Datensatz suchen: 
05.
cmd: Name der Schaltfläche, die angeklickt wurde 
06.
Suchen: Value-Eintrag der Schaltfläche 
07.
txt_suchen: Name des Textfeldes, in das ein Datensatz eingegeben werden kann 
08.
------------------------------------------------------------------ 
09.
Gesucht wird ein Eintrag, dessen Datensatz-ID mit id übereinstimmt 
10.
*/ 
11.
$cmd=$_POST['cmd']; 
12.
if($cmd=="Suchen"){ 
13.
 $id=$_POST['txt_suchen']; 
14.
 $query="select * from tabelle where id=$id"
15.
 $result=mysql_query($query); 
16.
17.
/* 
18.
Datensatz ändern: 
19.
cmd: Name der Schaltfläche, die angeklickt wurde 
20.
Ändern: Value-Eintrag der Schaltfläche 
21.
HTTP_POST_VARS: Array der übertragenen Formulardaten 
22.
data: Array, das die übertragenen Formulardaten aufnimmt 
23.
fields: Anzahl der Spaltennamen 
24.
------------------------------------------------------------------- 
25.
Wenn Daten übertragen wurden, werden sie in der foreach-Schleife 
26.
in ein Array übertragen. 
27.
Da der Value-Eintrag der Schaltfläche auch übertragen wird, wird das Kopieren 
28.
in das Array mit continue unterbunden. 
29.
Anschließend wird eine Abfrage abgesetzt, um die Spaltennamen zu ermitteln. 
30.
Je nach dem wieviel Spalten ermittelt wurden, werden in der while-Schleife 
31.
Updates durchgeführt. 
32.
mysql_field_name($result1,$i) enthält jeweils den Spaltennamen, 
33.
$data[$i] den Wert, der eingetragen werden soll, where id=".$_POST['id'] bestimmt den Datensatz 
34.
*/ 
35.
if($cmd=="Ändern"){ 
36.
 if($HTTP_POST_VARS){ 
37.
  foreach($HTTP_POST_VARS as $wert){ 
38.
   if($wert=="Ändern"){continue;} 
39.
    $data[]=$wert
40.
41.
  $query="select * from tabelle"
42.
  $result1=mysql_query($query); 
43.
  $fields=mysql_num_fields($result1); 
44.
  $i=1; 
45.
  while($i<$fields){ 
46.
   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"); 
47.
	 $i++;  
48.
49.
50.
51.
/* 
52.
Neuen Datensatz speichern: 
53.
cmd: Name der Schaltfläche, die angeklickt wurde 
54.
Speichern: Value-Eintrag der Schaltfläche 
55.
HTTP_POST_VARS: Array der übertragenen Formulardaten 
56.
data: Array, das die übertragenen Formulardaten aufnimmt 
57.
valuestring: Enthält die Werte, die gespeichert werden sollen als 
58.
Zeichenkette, um sie dem insert-Statement zu übergeben 
59.
----------------------------------------------------------- 
60.
Die übertragenen Formulardaten werden in ein Array gespeichert. 
61.
Dann wird dem Valuestring das zweite Element von data zugewiesen. 
62.
Das erste Element wäre das Suchtextfeld, und das ist ja leer bzw. soll ja 
63.
nicht abgespeichert werden. 
64.
In der for-Schleife werden valuestring nun nacheinander ein Komma und das nächste 
65.
Element von data zugewiesen. 
66.
Das //echo $query; kann man sich anzeigen lassen, falls der Datensatz nicht gespeichert wird. 
67.
Dann sieht man, ob die Abfrage Syntaxfehler enthält. 
68.
Die Null im insert-Statement ist ein Platzhalter für die ID des Datensatzes, die ja 
69.
automatisch hochgezählt wird und deshalb nicht angegeben werden kann. 
70.
*/ 
71.
if($cmd=="Speichern"){ 
72.
 if($HTTP_POST_VARS){ 
73.
  foreach($HTTP_POST_VARS as $wert){ 
74.
   if($wert=="Speichern"){continue;} 
75.
    $data[]=$wert
76.
77.
	$valuestring="'$data[1]'"
78.
  for($i=2;$i<count($data)-1;$i++){ 
79.
   $valuestring.=",'$data[$i]'"
80.
81.
	$query="insert into tabelle values(0,$valuestring)"
82.
	//echo $query
83.
	mysql_query($query) or die("Datensatz konnte nicht gespeichert werden"); 
84.
85.
86.
?> 
87.
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
88.
 
89.
<html> 
90.
<head> 
91.
<title>Untitled</title> 
92.
</head> 
93.
<body> 
94.
<form action="aleks.php" method="post"
95.
<table border="1"
96.
<tr><td colspan="2"
97.
Datensatz suchen: <input type="text" name="txt_suchen" /> 
98.
</td></tr> 
99.
<tr><td colspan="2"><hr></td></tr> 
100.
<? 
101.
/* 
102.
Wenn die Suche nach einem Datensatz erfolgreich war, wird er 
103.
im Formular angezeigt. 
104.
*/ 
105.
if($result){ 
106.
 $row=mysql_fetch_array($result,MYSQL_ASSOC) or die("Keinen passenden Datensatz gefunden"); 
107.
 // Zeiger auf Tabellenkopf, der in der while-Schleife mit der Funktion key ausgelesen wird, 
108.
 // einmal vorsetzen, da die id nicht geändert werden darf 
109.
 next($row); 
110.
  while(key($row)){ 
111.
  echo "<tr><td>".key($row)."</td><td><input type="text" name=".key($row)." value=".$row[key($row)]."></td></tr>"
112.
 next($row); 
113.
114.
/* 
115.
Wenn die Suche nicht erfolgreich war bzw. wenn die Seite aufgerufen wird, sind 
116.
keine Daten da. Deshalb wird, s.o., eine Abfrage abgesetzt, um die Spaltennamen zu ermitteln 
117.
und das Formular aufzubauen 
118.
*/ 
119.
}else
120.
 $query="select * from tabelle"
121.
 $result=mysql_query($query); 
122.
 $fields=mysql_num_fields($result); 
123.
 $i=1; 
124.
 while($i<$fields){ 
125.
  echo "<tr><td>".mysql_field_name($result,$i)."</td><td><input type="text" name=".mysql_field_name($result,$i)."></td></tr>"
126.
	$i++;  
127.
128.
129.
?> 
130.
<tr><td align="center" colspan="2"
131.
<input type="submit" name="cmd" value="Suchen" title="Datensatz suchen(Nr eingeben)"
132.
<input type="submit" name="cmd" value="Ändern" title="Datensatz ändern"
133.
<input type="submit" name="cmd" value="Speichern" title="Neuen Datensatz speichern"
134.
<input type="hidden" name="id" value=<?echo $row[id];?>> 
135.
</td></tr> 
136.
</table> 
137.
</form> 
138.
</body> 
139.
</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
Mitglied: StefanHoth
28.05.2007 um 11:04 Uhr
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- ...
Bitte warten ..
Mitglied: Guenni
28.05.2007 um 18:45 Uhr
@StefanHoth

Hi,

ich glaube, da hast du etwas mißverstanden. Das sollte keine Lösung
alá QuickForm werden.

Wenn ich eine Tabelle einer Datenbank bearbeiten will, so brauche ich
ja eine Schnittstelle, z.B. ein Formular.

Und wenn ich dieses Formular vorher mit QuickForm kreiere, dann habe ich
ja das, was ich vorher auch hatte: Ich muß für jede Tabelle ein Formular
erstellen, um eine Tabelle zu bearbeiten. Denn jede Tabelle hat ja nun mal
eine unterschiedliche Anzahl von Spalten.

Mein Skript jedoch stellt die Anzahl der Spalten einer Tabelle selber fest, ermittelt
zudem die Namen der Spalten und generiert dann eine entsprechende Anzahl
von Eingabefeldern in einem Formular.

Das Formular wird also automatisch aufgrund der Struktur der Tabelle erstellt, die ich
gerade bearbeiten will(mit Einschränkungen, s.u.). Heißt, auch wenn ich nachträglich
eine Spalte in der Tabelle einfüge / lösche, so wird sie im Formular dargestellt / nicht mehr dargestellt,
ohne dass ich im Skript etwas ändern muß.

Okay, das Tutorial war eine Blitzaktion, sprich, mein Formulargenerator
ist noch etwas "steif". Heißt:

- die erste Spalte einer Tabelle muß id heißen
- es werden nur Textfelder generiert, keine Check-, Radio- oder sonstigen Felder
- die Spaltennamen sollten einem Realwort entsprechen, keine Abkürzung wie spidfgt,
der Spaltenname wird ja im Formular ausgegeben, und da sollte ein Benutzer schon
was mit dem Namen anfangen können

Aber wie gesagt, der Beitrag ist ja ein Tutorial, und das garantiert ja keine endliche
Lösung, sondern es wird lediglich ein Einsprung in eine Materie dargestellt.

Was jemand damit macht, ist seine eigene Sache.

Trotzdem, danke für deinen Kommentar und für die Links.

Grüße
Günni
Bitte warten ..
Mitglied: StefanHoth
28.05.2007 um 18:53 Uhr
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.
Bitte warten ..
Mitglied: Guenni
28.05.2007 um 19:03 Uhr
Hi Stefan,

werd' ich mir mal ansehen, wenn ich's finde.

Danke für deine Antwort.

Grüße
Günni
Bitte warten ..
Mitglied: danix
25.04.2008 um 21:36 Uhr
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
Bitte warten ..
Mitglied: Guenni
28.04.2008 um 22:21 Uhr
@danix,

Hi,

ich hab' die Routine zum Speichern nun etwas verändert, obwohl sie ja
funktioniert, zumindest bei den Tabellen in meiner DB.

01.
<? 
02.
if($cmd=="Speichern"){ 
03.
 if($HTTP_POST_VARS){ 
04.
  //Die id der Tabelle wird auto. hochgezählt, dafür wird ein Platzhalter erstellt 
05.
	$valuestring="0,"
06.
  foreach($HTTP_POST_VARS as $wert){ 
07.
   if($wert=="Speichern"){continue;} 
08.
    $data[]=$wert
09.
10.
    //$data[0] ist das Suchfeld 
11.
    //$data[1] ist die ID 
12.
   //Beide werden natürlich nicht gespeichert, deshalb geht es mit $data[2] los 
13.
    $valuestring.="'$data[2]'"
14.
    for($i=3;$i<count($data);$i++){ 
15.
     $valuestring.=",'$data[$i]'"
16.
17.
	//Spaltennamen ermitteln und in einer Variablen speichern 
18.
	$query="select * from tabelle3"
19.
  $result=mysql_query($query); 
20.
  $fields=mysql_num_fields($result); 
21.
	$heads="id"
22.
  $i=1; 
23.
  while($i<$fields){ 
24.
	 $heads.=",".mysql_field_name($result,$i); 
25.
   $i++; 
26.
27.
	 
28.
	  $query="insert into tabelle3($heads) values($valuestring)"
29.
		echo "Folgende Spalten werden mit Werten belegt:<br>"
30.
		echo $heads."<br>"
31.
		echo "Eingetragen werden folgende Werte:<br>"
32.
    echo $valuestring
33.
    mysql_query($query) or die("Datensatz konnte nicht gespeichert werden"); 
34.
		unset($result); 
35.
36.
37.
?>

Es werden jetzt die Spaltennamen ermittelt und in einer Variablen abgelegt. Somit findet jetzt
eine Zuordnung der Werte zu den richtigen Spalten statt.

Gruß
Günni
Bitte warten ..
Mitglied: Radi1989
10.02.2010 um 10:21 Uhr
Hi Günni,
nach so einem Skript habe ich die ganze Zeit gesucht. Jedoch bin ich noch ziemlich neu hier. Wie müsste denn die session.inc.php aussehen ?

LG
Bitte warten ..
Neuester Wissensbeitrag
Internet

Unbemerkt - Telekom Netzumschaltung! - BNG - Broadband Network Gateway

(3)

Erfahrungsbericht von ashnod zum Thema Internet ...

Ähnliche Inhalte
Heiß diskutierte Inhalte
Windows Server
Outlook Verbindungsversuch mit Exchange (15)

Frage von xbast1x zum Thema Windows Server ...

Grafikkarten & Monitore
Tonprobleme bei Fernseher mit angeschlossenem Laptop über HDMI (11)

Frage von Y3shix zum Thema Grafikkarten & Monitore ...

Microsoft Office
Keine Updates für Office 2016 (11)

Frage von Motte990 zum Thema Microsoft Office ...