• Das Erstellen neuer Accounts wurde ausgesetzt. Bei berechtigtem Interesse bitte Kontaktaufnahme über die üblichen Wege. Beste Grüße der Admin

array werte in HTML Tabelle (dynamisch)

lampe

New member
Hallo zusammen

Ich bin gerade am Perl lernen, und stosse da bei so einigem an.
Ich habe ein "Registrierungsformular" (nur zur Übung) erstellt, so ein HTML Formular mit Name, Vorname, Adresse etc.

Mit Perl habe ich nun gemacht, dass diese Eingaben in ein Textfile geschrieben werden. Ich habe es auch geschafft die Eingaben aus dem textfile in ein Array zu speichern und kann die einzelnen Zeilen auch ausgeben.

Nun möchte ich aber, dass es automatisch, wenn ein neuer Eintrag dazu kommt, dass er sich der Tabelle anhängt, d.h. selber eine neue Zeile erzeugt.
(bzw. die ganze Tabelle soll sich dynamisch erstellen, wenn Einträge entstehen).
Hat jemand eine Idee?

Hier meine Code schnipsel:

Code:
#!/usr/bin/perl

####################################################################################
# Name			: Registrierungsformular
# Author		: Andrea Lamparter
# Version		: 0.1
# Created		: 09.Oktober 2009
# Last modified	: 12.Oktober 2009
####################################################################################

use CGI qw(:standard);
use CGI::Carp qw(fatalsToBrowser);

print "Content-type: text/html\n\n";

print qq~
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml" lang="de" xml:lang="de">
	<head>
	<title>Registrierung</title>
	<meta http-equiv="content-type" content="text/html; charset=ISO-8859-1" />
	<link rel="stylesheet" type="text/css" media="screen" href="../style2.css" />
	
	<script type="text/javascript" src="../javascript2.js"></script>
		   
	</head>

		<body>
			<form name="indexing" action="/cgi-bin/index.pl" method="post">
			<table border="1">
				<tr>
					<td colspan ="2">
						<h2> Registrierungsformular </h2>
					</td>
				</tr>
				<tr>
					<td colspan="2" class="right">
						<p> Felder, welche mit einem * gekennzeichnet sind, sind Pflichtfelder und müssen ausgefüllt werden! </p>
						<br />
						<p id="ErrMsg0"> </p>
						<p id="ErrMsg1"> </p>
					</td>
				</tr>
				<tr>
					<td class="left">
						Name*:
					</td>
					<td class="right">
						<input type="text" name="name" />
					</td>
				</tr>
				<tr>
					<td class="left">
						Vorname*:
					</td>
					<td class="right">
						<input type="text" name="vorname" />
					</td>
				</tr>
				<tr>
					<td class="left">
						Geburtsdatum:
					</td>
					<td class="right">
						<input type="text" name="geburtsdatum" value="TT.MM.JJJJ" />
					</td>
				</tr>
				<tr>
					<td class="left">
						Adresse*:
					</td>
					<td class="right">
						<input type="text" name="adresse" />
					</td>
				</tr>
				<tr>
					<td class="left">
						PLZ/Ort*:
					</td>
					<td class="right">
						<input type="text" name="ort" />
					</td>
				</tr>
				<tr>
					<td class="left">
						E-Mail-Adresse*:
					</td>
					<td class="right">
						<input type="text" name="email" />
					</td>
				</tr>
				<tr>
					<td class="left">
						Geschlecht*:
					</td>
					<td class="right">
						<input type="radio" name="myRadio" value="maennlich" onclick="setRadioButton(this,0)" /> Männlich
						<br />
						<input type="radio" name="myRadio" value="weiblich" onclick="setRadioButton(this,0)" /> Weiblich
					</td>
				</tr>
				<tr>
					<td class="left">
						Kommentar:
					</td>
					<td class="right">
						<textarea name="kommentar" cols="16" rows="6">
						</textarea>
					</td>
				</tr>
				<tr>
					<td colspan="2">
						<input type="submit" value="Senden" onclick="return checker()" />
						<input type="button" value="Abbrechen" />
						<input type="button" value="checkEmail" onclick="checkEmail(this.form.adr)" />
					</td>
				</tr>
			</table>
			</form>
		</body>

</html>
~;

dann der Perl Code :

Code:
# Name			: Registrierung Werte speichern
# Author		: Andrea Lamparter
# Version		: 0.1
# Created		: 12.Oktober 2009
# Last modified	: 15.Oktober 2009
####################################################################################

use CGI qw(:standard);
use CGI::Carp qw(fatalsToBrowser);


print "Content-type: text/html\n\n";

my $cgi = new CGI;

$name = $cgi->param('name');
$vorname = $cgi->param('vorname');
$adresse = $cgi->param('adresse');
$ort = $cgi->param('ort');
$email = $cgi->param ('email');
$geburtsdatum = $cgi->param('geburtsdatum');
$kommentar =$cgi->param('kommentar');


open(out,">>datei.txt");
print out $name. "\n". $vorname. "\n" .$adresse . "\n" .$ort. "\n". $email ."\n" . $geburtsdatum .  "\n" . $kommentar ."\n";
close out;



my $cgi = new CGI; 
my @myRB = $cgi->param('myRB');


#foreach $key ($cgi->param()){
#	$value = param($key);
#	print "$key: $value<br />\n";
#}

print @myRB;


open(out, "datei.txt");
@lines = <out> ;
close(out);
#print @lines;

#for my $lines (@lines){
#   print "<tr>";
#   print map {"<td>$_</td>" } @$lines;
#   print "</tr>\n";
#}

     my $tag = shift; # erster Parameter
     my @lines = $lines; # Rest
     print qq(<tr>);
     foreach my $lines ( @lines ) {
     print qq(<td>$lines</td>);
     }
     print qq(</tr>);

und soll dann so eine Tabelle geben:

Code:
print qq~

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml" lang="de" xml:lang="de">

<head>
	<title> Bearbeitung </title>
	<link rel="stylesheet" type="text/css" media="screen" href="../style2.css" />
</head>
	<body>
		<h3> Ihre Registrierung war erfolgreich! </h3>
			<table border="1">
				<tr>
					<td>
					Name:
					</td>
					<td>
					Vorname:
					</td>
					<td>
					Adresse:
					</td>
					<td>
					Ort:
					</td>
					<td>
					Geburtsdatum:
					</td>
					<td>
					E-Mail:
					</td>
					<td>
					Kommentar:
					</td>
				</tr>
			</table>

	</body>

</html>


~;

Danke für die Hilfe
 
Ich bin gerade am Perl lernen, ....
Das es sowas heute noch gibt, ich bin gerührt ;)

ein paar Worte zu dem Skript.

1. Du solltest dir angewöhnen Skripte mit dem Schalter -w und mit use strict zu entwickeln. Und alle Warnungen und Meldungen zu beseitigen. Das mag am Anfang lästig erscheinen, doch das kann dich vor extrem schwer zu findenen Fehlern bewahren.

2. Dann benutzt du das Modul CGI und importierst einerseits einen Haufen Methoden und erzeugst dann unnötigerweise noch ein CGI Objekt, aber ohne die Funktionen die das Modul anbietet zu nutzen. Les dir mal die Doku durch, du kannst damit HTML erzeugen ohne deinen Perl Quellcode mit HTML zu verschmutzen. Das ist etwas, was man versucht zu vermieden, verschiedene Dinge/Aufgaben zu vermischen (wie z.b. auch bei HTML <-> CSS) (Für noch größere Projekte wird dann auch gerne HTML::Template o.ä. verwendet)

Und genau für deine Aufgabe bietet das Modul entsprechende Funktionen an. HTML Tabelllen (wobei ich mich Frage, warum du hier überhaupt eine Tabelle nutzt, es ginge einfacher ohne) und Formulare sind eine Spezialität des Moduls. Darüber hinaus lernst du mit dem Modul, die teilweise recht komplexen Datenstrukturen von Perl besser kennen (zumindest war das bei mir so).

Ansatzweise sähe das so aus:
PHP:
use CGI qw(-no_xhtml);
use CGI::Carp qw(fatalsToBrowser warningsToBrowser);
use strict;

my $cgi = new CGI();

my @table;

push @table, $cgi->Tr($cgi->td({-colspan => 2}, $cgi->h2('Registrierungsformular')));
push @table, $cgi->Tr($cgi->td(['Name:', $cgi->textfield(-name => 'name')]));
push @table, $cgi->Tr($cgi->td({-colspan => 2},$cgi->submit(-vlaue => 'Senden')));

print $cgi->header(),
$cgi->start_html(-title => 'Registrierung', -style=>{'src'=>'../style2.css'}),
$cgi->start_form(-action => $cgi->url(), -method => 'post'),
$cgi->table({-border => 1}, @table)
;
und so kannst du dem Array Table immer neue Reihen hinzufügen.
 
Erstaunlich, aber es gibt noch leute die das lernen (oder lernen wollen) :)
Ich werd mal deinen Code anschauen (mal schauen ob ich das begreifen werde) und versuchen in meinen Jungle-Code einzufügen ^^ (natürlich befolge ich zuerst deine Ratschläge, um solche Sachen bin ich natürlich auch dankbar).
Zu dem obenerwähnten Objekt, ich sags ja, ich lerne es gerade und deshalb bin ich mehr oder weniger am versuchen wie es geht, deshalb ein paar Sachen auskommentiert und ein paar nicht !
Danke für die Antwort
 
noch ne kurze Frage, werden dann die Daten direkt vom Formular ausgelesen oder dann Tatsächlich vom Array aus?
Denn es sollte die Daten dann vom Array aus auslesen.

Auf Submit schickt das Formular die Daten an ein Textfile. Die Daten werden dann in ein Array geschrieben und ausgegeben.
 
Ich hatte mir die Tabelle so vorgestellt (wenn mehrere User dazu kommen)
Name: Vorname: Adresse:
hans Fritz hasnstrasse 3
anna anna annastrasse 7
 
In Perl musst du relativ schnell lernen mit Modulen umzugehen - da gibt es manchmal eine Aversion von Anfängern dagegen (war bei mir z.T. so), weil sie denken es wäre erst wichtiger die Sprache zu lernen. Das ist aber grund falsch, da Perl von seinen Modulen lebt und wenn man sich nicht die Module genau anschaut entgeht einem oft etwas.

Das CGI Modul ist sehr sehr mächtig und hat viele sehr nützlicher Funktionen. Aber gerade als Anfänger hat man natürlich in Perl grosse Schwierigkeiten mit Datenstrukturen. Also mit Array, Hashes, Referenzen auf diese, LoL (List of Lists) usw. usf. Ich hoffe du hast dir Perl mal lokal installiert, denn dann hast du eine riesige Dokumentation auf deiner Festplatte (aber es gibt sie auch online) und solltest auf jeden Fall eine Blick da rein werfen.

Vor allem diese drei sind wichtig zu verstehen:
http://perldoc.perl.org/perlreftut.html
http://perldoc.perl.org/perldsc.html
http://perldoc.perl.org/perllol.html

auch um mein Codebeispiel zu verstehen.

[EDIT] Das war keine Antwort auf deine Frage sondern auf das erste Posting nach meinem ;)
 
Zuletzt bearbeitet:
noch ne kurze Frage, werden dann die Daten direkt vom Formular ausgelesen oder dann Tatsächlich vom Array aus?
Denn es sollte die Daten dann vom Array aus auslesen.

Auf Submit schickt das Formular die Daten an ein Textfile. Die Daten werden dann in ein Array geschrieben und ausgegeben.
Das spielt keine Rolle. Du kannst das Array befüllen um die Tabelle auszugeben, wie du willst.

Ich hab mal mit den ganzen drumherum ein kleines Beispiel gebaut. Da kommt alles drin vor Hashes, Arrays, Referenzen, LoLs

PHP:
#!/usr/bin/perl -w

use CGI qw(-no_xhtml);
use CGI::Carp qw(fatalsToBrowser warningsToBrowser);
use strict;

my $cgi = new CGI();
my $datei = 'datei.txt';

# Datei erzeugen falls sie nicht existiert
unless(-e $datei) { open FH, '>', $datei; close FH}

schreibeDaten();

my @table;

# Eingabeformular
push @table, $cgi->Tr($cgi->td({-colspan => 2}, $cgi->h2('Registrierungsformular')));
push @table, $cgi->Tr($cgi->td(['Name:', $cgi->textfield(-name => 'name')]));
push @table, $cgi->Tr($cgi->td(['Alter:', $cgi->textfield(-name => 'alter')]));
push @table, $cgi->Tr($cgi->td({-colspan => 2},$cgi->submit(-vlaue => 'Senden')));

my $daten = leseDaten();
foreach(@$daten) {
	push @table, $cgi->Tr(
	$cgi->td([ "Name: $_->[0]" , "Alter: $_->[1]" ])
	);
}


print $cgi->header(),
$cgi->start_html(-title => 'Registrierung', -style=>{'src'=>'../style2.css'}),
$cgi->start_form(-action => $cgi->url(), -method => 'post'),
$cgi->table({-border => 1}, @table),
$cgi->end_form()
;
sub schreibeDaten{
	my $name = $cgi->param('name');
	my $alter = $cgi->param('alter');
	
	open FH, '>>', $datei || die "Kann $datei nicht öffnen, weil: $!";
	print FH "$name, $alter\n";
	close FH;
}
sub leseDaten {
	my @daten;
	open FH, '<', $datei || die "Kann $datei nicht öffnen, weil: $!";
	while(<FH>) {
		chomp;
		push @daten, [ split /\,/, $_];
	}
	return \@daten;
}
 
danke viel mal, ich werd mich da mal durchkämpfen (ps: perl habe ich bereits lokal installiert :) ) (immerhin) ^^
Danke für die Tolle Hilfe, bist echt super!
 
Noch eine Frage habe ich:
Kann man das nicht irgendwie so machen also mehrere td's in einem tr...


PHP:
push @table, $cgi->Tr($cgi->td(['Name:', $cgi->textfield(-name => 'name')]))($cgi->td(['Name:',$cgi->textfield(-name => 'name')]));
 
kann man es nicht anders darstellen?
Ich möchte nicht umbedingt sehr redundante Daten...
also so wie ich gefragt hab:

Name: Vorname: Adresse: Ort:
Andrea Andrea Andrea Andrea
 
Noch eine Frage habe ich:
Kann man das nicht irgendwie so machen also mehrere td's in einem tr...
Die Frage versteh ich nicht. In einer Reihe (tr) sind immer soviele Zellen (td) wie du sie in der Arrayreferenz angibst.
PHP:
push @table, $cgi->Tr(
$cgi->td( [ # Das ist die Referenz
'Name:', # 1. Zelle
$cgi->textfield(-name => 'name'), # 2. Zelle
'Name:', # 3 Zelle
$cgi->textfield(-name => 'name') # 4. Zelle
]));
Die sind dann aber alle in einer Reihe.

Und, Ja, darstellen kann man es anders. Wie gesagt, was ich dir gezeigt habe, ist nur ein kleines Beispiel, um die Techniken zu demonstrieren. Die Logik die du willst, musst du machen.
 
Zurück
Oben