Hallo Freunde,
arbeite mich gerade in das Buch von DataBecker Perl CGI ein
dabei teste ich die erste DB-Verbindung
Fehlermeldungen bekomme ich keine nur einen weissen Bildschirm ohne Ausgabe
Vorraussetzung erfüllt (Db angelegt, Tabelle angelegt, Daten eingefügt
script (dbi4.pl)
gibt es es eine Möglichkeit zu testen ob Verbindung hergestellt wird?
bei den tests:
verfügbare Treiber anzeigen: Leere Seite (dbi2.pl)
vorhandene Datenquellen: Leere Seite 7dbi3.pl)
Meine scripte: ich nutze XP-Prof (habe es auch mit: #!C.\Perl\bin\perl.exe -w) versucht
dbi2.pl
#!/usr/bin/perl -w
# dbi2.pl vorhandene Datenbanktreiber
use DBI;
print "Content-type: text/html\n\n";
@drivers = DBI->available_drivers;
print "vorhandene Treiber:<br>";
foreach (@driver){
print "$_<br>";
}
dbi3.pl
#!/usr/bin/perl -w
# dbi3.pl vorhandene Datenquellen
use DBI;
print "Content-type: text/html\n\n";
$driver = "mysql";
@sources = DBI->data_sources($driver);
print "vorhandene Datenquellen:<br>";
foreach (@sources){
print "$_<br>";
}
Verbindung und auslesen aus Db-Tabelle dbi4.pl
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#!/usr/bin/perl -w
# dbi4.pl Anweisungs-Handles
use DBI;
print "Content-type: text/html\n\n";
my $db = "adressen";
my $SQL_Driver = "mysql";
my $SQL_User="root";
my $SQL_Passw="Felix31.07";
my $dbh = DBI ->connect("DBI:SQL_Driver:$db", $SQL_User, $SQL_Passw)
or die "Verbindung konnte nicht hergestellt werden: $DBI::errstr\n";
my $sth= $dbh ->prepare("SELECT * FROM adressen") or die "Die
SQL-Anweisung konnte nicht vorbereitet werden: $DBI::errstr\n";
$sth->execute();
while (@ary = $sth->fetchrow_array)
{
foreach (@ary)
{
print "$_ ";
}
$sth->finish;
$dbh->disconnect;
}
User since
2003-08-04
12208
Artikel
Admin1
verstehe ich das richtig, dass du bei allen 3 skripten eine leere seite bekommst?
zumindest bei den ersten beiden sollte ja etwas ausgegeben werden.
wenn ja, dann such im errorlog nach fehlern. ausserdem lohnt eslich immer, CGI-skripte
auch mal auf der kommandozeile aufzurufen, um sicherzustellen, wo der fehler liegt.
User since
2003-08-04
14371
Artikel
ModeratorIn
zu db2.pl: Einmal benutzt Du "@driver" und einmal "@driver
s". Deshalb ein Tipp: Benutze immer
strict
zu db4.pl: Im Aufbau der Verbindung zur Datenbank hast Du "SQL_Driver" stehen - als String und nicht als Variable.
Du solltest überall eine ausführliche Fehlerbehandlung machen!
User since
2009-01-14
23
Artikel
BenutzerIn
Danke erst mal,
also zu dbi2.pl bekomme ich jetzt auf der Konsole eine Ausgabe, jedoch nicht im Browser (Die Seite versucht ewig lange zu laden)
zu bdi4.pl: habe die Zeile geändert:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#!/usr/bin/perl -w
# dbi4.pl Anweisungs-Handles
use DBI;
print "Content-type: text/html\n\n";
my $db = "adressen";
my $SQL_Driver = "mysql";
my $SQL_User="root";
my $SQL_Passw="";
my $dbh = DBI->connect("DBI:$SQL_Driver:$db", $SQL_User, $SQL_Passw)
or die "Verbindung konnte nicht hergestellt werden: $DBI::errstr\n";
my $sth= $dbh->prepare("SELECT * FROM adressen") or die "Die
SQL-Anweisung konnte nicht vorbereitet werden: $DBI::errstr\n";
$sth->execute();
while (@ary = $sth->fetchrow_array) {
foreach (@ary) {
print "$_";
}
print "<br>";
}
$sth->finish;
$dbh->disconnect;
<STDIN>; # damit das Konsolenfenster sich nicht sofort schliesst
trotzdem bekomme ich weder auf der Konsole noch im Browser eine Ausgabe und die Konsole blinkt nur kurz auf.
User since
2006-02-17
628
Artikel
BenutzerIn
Schreib die Zeile mit dem Header mal in einen BEGIN Block und lenk die Fehlerausgabe in den Browser:
BEGIN {
print "Content-type: text/html\n\n";
use CGI::Carp qw/fatalsToBrowser/
}
was passiert dann?
User since
2003-08-07
2921
Artikel
BenutzerIn
Hallo!
Setze mal den Pfad zu deinem Interpreter korrekt. Wenn du Perl unter C.\Perl installiert hast, dann muss der Shebang lauten: #/Perl/bin/perl
use strict; und use warnings; weisen dich dann auf die restlichen Fehler hin (auch, wenn da so selten in einem Buch steht).
Grüße, pktm
User since
2009-01-14
23
Artikel
BenutzerIn
@struppi
hab das mal bei dbi2.pl versucht
folgende Browserausgabe:
Software error:
Can't call method "Begin" without a package or object reference at c:\inetpub\wwwroot\cgi-bin\dbi2.pl line 4.
For help, please send mail to this site's webmaster, giving this error message and the time and date of the error.
User since
2003-08-04
14371
Artikel
ModeratorIn
@Struppe: braucht man nicht unbedingt machen. CGI::Carp sendet selbst einen Header wenn ein Fehler passiert...
@deletemast: Mach auch mal bei dem
execute ein "or die $DBI::errstr"!
User since
2003-08-04
14371
Artikel
ModeratorIn
BEGIN wird komplett groß geschrieben!
User since
2009-01-14
23
Artikel
BenutzerIn
@pktm
Hab den Shebang geändert und die Datei um die Zeilen von Struppi erweitert
Ausgabe:
Software error:
install_driver(mysql) failed: Can't locate DBD/mysql.pm in @INC (@INC contains: C:/Perl/site/lib C:/Perl/lib .) at (eval 5) line 3.
Perhaps the DBD::mysql perl module hasn't been fully installed,
or perhaps the capitalisation of 'mysql' isn't right.
Available drivers: CSV, DBM, ExampleP, File, Gofer, ODBC, Oracle, Proxy, SQLite, Sponge.
at c:\inetpub\wwwroot\cgi-bin\dbi4.pl line 12
For help, please send mail to this site's webmaster, giving this error message and the time and date of the error.
Also es fehlt wohl der mysql-Treiber
auf der Konsole werden folgende Treiber aufgeführt:
CSV, DBM, ExampleP, File, Gofer, ODBC, Oracle, Proxy, SQLite, Sponge
Allerdings bekomme ich diese Ausgabe nur in der Konsole