Schrift
[thread]715[/thread]

Textdatei aufrufen über CGI

Leser: 2


<< >> 8 Einträge, 1 Seite
lolipop 999
 2006-04-24 17:53
#7437 #7437
User since
2006-04-07
150 Artikel
BenutzerIn
[default_avatar]
Hallo

Ich habe bereits mit Perl gearbeitet aber nie mit CGI

So meine Frage:

Ich möchte eine DB ausgeben lassen.
Tabelle 1 beinhaltet Kundennummer, Name, Telefon usw.
Tabelle 2 Kundennummer und Rechnungsbetrag

Tabelle 1 und Tabelle 2 stehen mit einer 1:1 Beziehung über die Kundennummer zusammen.

Das Script soll über ein Suchfeld mit den Schlüsselwert (Kundennummer) durchsucht werden. Wenn Ergebnis dann ausgeben und es soll sich eine Textdatei öffnen, wo die Daten aus Tabelle1 und 2 stehen.

Ich hoffe ich habe das jetzt so halbwegs gut ausgedrückt .

Freue mich auch über Codeschnipseln oder andere Links wo ich mir alles zusammenlernen oder suchen kann

mfg

lolipop 999
renee
 2006-04-24 18:26
#7438 #7438
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
Bist Du Dir wirklich sicher mit der 1:1 Beziehung? Du lässt pro Kunde wirklich nur einen Rechnungsbetrag zu??

Aber zum Thema: Willst Du quasi einen Download machen??

Für die Zusammenarbeit mit Datenbanken empfehle ich CPAN:DBI. Hier besonders auf die ?-Schreibweise achten (siehe auch Wiki:hier). Wie man Datenbanken ausliest kannst Du hier nachlesen.

Wenn Du es einfach als HTML-Ausgabe im Browser haben willst, solltest Du Dir mal CPAN:CGI anschauen. Das Modul ist auch sehr hilfreich, wenn Du Formulareingaben auslesen willst. Wie Du auch Wiki:hier und hier nachlesen kannst.
OTRS-Erweiterungen (http://feature-addons.de/)
Frankfurt Perlmongers (http://frankfurt.pm/)
--

Unterlagen OTRS-Workshop 2012: http://otrs.perl-services.de/workshop.html
Perl-Entwicklung: http://perl-services.de/
GwenDragon
 2006-04-24 18:29
#7439 #7439
User since
2005-01-17
14748 Artikel
Admin1
[Homepage]
user image
Das SQL wäre wohl:
[sql]SELECT Tabelle1.Kundennummer, Tabelle1.Name, Tabelle1.Telefon, Tabelle2.Rechnungsbetrag  FROM Tabelle2 JOIN Tabelle1 WHERE Tabelle2.Kundennummer = Tabelle1.Kundennummer[/sql]

Dann solltest du noch CPAN:CGI und CPAN:DBI.

Welche Datenbank benutzt du denn?\n\n

<!--EDIT|GwenDragon|1145889558-->
nepos
 2006-04-25 14:58
#7440 #7440
User since
2005-08-17
1420 Artikel
BenutzerIn
[Homepage] [default_avatar]
Beim JOIN fehlt glaub ich noch das USING bzw. ON, damit die DB weiss, ueber welche Felder sie joinen soll. Wobei dann die WHERE-Klausel ueberfluessig ist.
Nur mit der WHERE-Klausel sollts auch passe, dann muss aber der JOIN Tabelle1 raus mein ich.

Wenn das ganze via Browser aufgerufen werden soll, aber keine HTML sondern ne Text-Datei zurueckgeliefert werden soll, solltest du vielleicht den Header entsprechend auf "text/plain" setzen:
Code (perl): (dl )
print header(-type=>'text/plain');

Dann kann der Browser das gleich korrekt verarbeiten.
lolipop 999
 2006-04-29 11:33
#7441 #7441
User since
2006-04-07
150 Artikel
BenutzerIn
[default_avatar]
Hallo

Habe jetzt ein script zusammengestellt. Vielleicht könnt ihr mir jetzt besser weiterhelfen mit meinem Problem.

Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
#!d:/Programme/Perl/bin/perl -w

use strict;

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

my $DBH;
my $STH;
my $CGI;
my $antwort;

$CGI = new CGI();




### Suche oder Eintrag ###

if ($CGI->param("suchanfrage")){
suche($CGI, $DBH, $STH);
}
elsif($CGI->param("eintrag")){
eintragen($CGI, $DBH, $STH);
}


### Start Subroutine Suche ###

sub suche{

my $nachname = param("nachname");
my $abteilung = param("abt");

$DBH = DBI->connect("DBI:CSV:Kunden.mdb=c:/Programme/ApacheGroup/Apache/cgi-bin")
               or die "Konnte keine Verbindung zur Datenbank herstellen:$!";
$STH = $DBH->prepare("SELECT Tabelle1.Kundennummer, Tabelle1.Name, Tabelle1.Telefon, Tabelle2.Rechnungsbetrag  FROM Tabelle2 JOIN Tabelle1 WHERE Tabelle2.Kundennummer = Tabelle1.Kundennummer ")
               or die "Konnte SQL-Statement nicht bereitstellen:$!";


$STH->execute()
           or die "Ausfuehren nicht moeglich:$!";


### Treffer ###

if ($STH->rows != 0){

print <<HERE_TEXT1;
Content-type:text/html

<HTML>
<HEAD>
<TITLE> Antwort </TITLE>
</HEAD>

<BODY>
<CENTER>
<H1>Suchergebnis:</H1>
<HR>
<TABLE BORDER>
<TR>
<TD WIDTH="200"><B>Kundennummer:</B></TD>
<TD WIDTH="200"><B>Adresse:</B></TD>
<TD WIDTH="200"><B>Name:</B></TD>
<TD WIDTH="200"><B>Telefonnummer:</B></TD>
<TD WIDTH="200"><B>Rechnungsbetrag:</B></TD>
</TR>

HERE_TEXT1

my @data;

while (@data = $STH->fetchrow_array()) {
my $kundennummer = $data[0];
my $adresse = $data[1];
my $name = $data[2];
my $telefonnummer = $data[3];
my $rechnungsbetrag = $data[3];


print qq§<TR>\n<TD><B>$kundennummer</B></TD>\n<TD>$adrese</TD>\n<TD>$name</TD>\n<TD>$telefonnummer</TD>\n</TR>\n§;

</BODY>
</HEAD>



$DBH->disconnect;

}


irgendwie funktioniert das mit dem code einfügen bei mir nicht

mfg


lolipop



Edit Dubu: Code-Tags spendiert. (Wenn du es über die Buttons machst: Erst auf "Code" klicken, dann Code eingeben, dann nochmal auf "Code*" klicken.)\n\n

<!--EDIT|Dubu|1146304419-->
Dubu
 2006-04-29 14:12
#7442 #7442
User since
2003-08-04
2145 Artikel
ModeratorIn + EditorIn

user image
Der Ansatz sieht gut aus, aber der Code ist noch nicht syntaktisch korrekt.
- Wo ist das Ende der while-Schleife? Das Ende des if bzw. der sub?
- Da steht einmal eine Variable $adresen statt $adressen.
- Du übergibst die Variablen $CGI, $DBH, $STH an die Funktion suche(), aber greifst sie in der Funktion nicht wieder auf, sondern benutzt die "globalen" Variablen. Warum legst du $DBH und $STH überhaupt im Scope des Programms an, wenn du nur (jeweils) in der Sub brauchst? Deklariere sie lieber lokal in der Sub.
- Da fehlt noch die Funktion eintragen().
- Und rein auf das HTML bezogen: Das "</table>" fehlt, das "</HEAD>" am Ende soll wohl ein "</HTML>" sein, und die Spaltenüberschiften sollten für ein korrektes Markup <th> sein und nicht <td>.
Strat
 2006-04-29 18:03
#7443 #7443
User since
2003-08-04
5246 Artikel
ModeratorIn
[Homepage] [default_avatar]
ich wuerde das in etwa folgendermaszen schreiben:
1. funktionen wie verbinden zur DB und Abfeuern eines SQL-Statements in subroutinen auslagern
2. HTML-Statements klein (ist fuer xhtml auch zwingend voraussetzung, und komprimiert nebenbei auch meist besser)
3. fuer standard-html-output funktionen von CGI verwenden
4. gueltigkeitsbereich von variablen immer nur so klein wie noetig halten

es koennte eventuell sinn machen, das ConnectToDB schon vor der verzweigung auszufuehren, naemlich dann, wenn die DB-Verbindung auf jedem fall benoetigt wird.
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
#! d:/Programme/Perl/bin/perl
use strict;
use warnings;

use CGI ();
use CGI::Carp qw(fatalsToBrowser warningsToBrowser);
use DBI;

use vars qw($CsvPath);
$CsvPath = 'c:/Programme/ApacheGroup/Apache/cgi-bin';

# oder besser, wenn Readonly vorhanden ist:
# use Readonly $CsvPath => 'c:/Programme/ApacheGroup/Apache/cgi-bin';

my $cgi = CGI->new();
my %params = $cgi->Vars();

print $cgi->header();

if ( exists $params{suchanfrage} ) { &Suche ($cgi, \%params) }
elsif( exists $params{eintrag} ) { &Eintragen($cgi, \%params) }

else { &Startseite($cgi, '...') }

print $cgi->end_html();

# ------------------------------------------------------------
sub Suche {
my ($cgi, $params) = @_;

my $dbh = &ConnectToDB();

$cgi->start_html('Antwort');

my $sqlStatement = qq~SELECT Tabelle1.Kundennummer, Tabelle1.Name,
Tabelle1.Telefon, Tabelle2.Rechnungsbetrag
FROM Tabelle2 JOIN Tabelle1
WHERE Tabelle2.Kundennummer = Tabelle1.Kundennummer~;

my $sth = &FireSql($dbh, $sqlStatement);

if ($sth->rows < 1) {
print $cgi->p("Keine Daten gefunden");
return;
} # if

print qq~
<center>
<h1>Suchergebnis:</h1>
<hr />
<table border="2">
<tr>
<td width="200"><b>Kundennummer:</b></td>
<td width="200"><b>Adresse:</b></td>
<td width="200"><b>Name:</b></td>
<td width="200"><b>Telefonnummer:</b></td>
<td width="200"><b>Rechnungsbetrag:</b></td>
</tr>\n~;

while( my @data = $sth->fetchrow() ) {
printf qq~
<tr>
<td><b>%s</b></td>
<td><b>%s</b></td>
<td><b>%s</b></td>
<td><b>%s</b></td>
</tr>\n~,
@data[0, 1, 2, 3];

} # while

$sth->finish();
$dbh->disconnect();
} # Suche
# ------------------------------------------------------------
sub Eintragen {


} # Eintragen
# ------------------------------------------------------------
sub ConnectToDB {

my $dsn = "DBI:CSV:Kunden.mdb=$CsvPath";
my $dbh = DBI->connect($dsn)
or die "Error: couldn't connect to '$dsn': $DBI::errstr\n";

return $dbh;
} # ConnectToDb
# ------------------------------------------------------------
sub FireSql {
my ($dbh, $sqlStatement, @values) = @_;

my $sth = $dbh->prepare($sqlStatement)
or die "Error: couldn't prepare sql: $DBI::errstr\n$sqlStatement\n";

$sth->execute(@values)
or die "Error: couldn't execute sql: $DBI::errstr\n$sqlStatement\n";

return ($sth);
} # FireSql

# ------------------------------------------------------------

oder so aehnlich (nicht getestet)
perl -le "s::*erlco'unaty.'.dk':e,y;*kn:ai;penmic;;print"
http://www.fabiani.net/
lolipop 999
 2006-05-06 10:47
#7444 #7444
User since
2006-04-07
150 Artikel
BenutzerIn
[default_avatar]
Danke für deine Hilfe hat super funktioniert

mfg

lolipop 999
<< >> 8 Einträge, 1 Seite



View all threads created 2006-04-24 17:53.