"or die" - Meldung wird im HTML nicht angezeigt
Pits
- perl
Hi folks,
Führe mit folgenden Statements ein MySQL-Zugriff durch (DB ist bereits connected):
$sql = "SELECT wert_01, wert_02, wert_03 FROM text WHERE untermenu = '$untermenu_akt' ORDER BY wert_01 DESC";
$sth = $dbh->prepare($sql);
$sth->execute() or die "$dbh->errstr";
Momentan gibt's die Tabelle text so nicht, also sollte doch eine Fehlermeldung geprintet werden ($dbh->errstr). Bei mir erscheint gar nix, der Screen bleibt weiss...
Any ideas?
Danke!
die($dbh->errstr);
die ist auch nichts anderes als eine Funktion. Wenn du die nicht als solche aufrufst passiert natürlich nichts.
die($dbh->errstr);
die ist auch nichts anderes als eine Funktion. Wenn du die nicht als solche aufrufst passiert natürlich nichts.
... klappt so bei mir auch nicht:
$sth->execute() or die($dbh->errstr);
Bin ein Perl-Neuling, darum die wohl etwas unqualifizierte Anfrage...
Hallo!
Any ideas?
Jo, wäre es möglich, dass er sich schon bei
$sth = $dbh->prepare($sql);
verweigert? In dem Fall kommt er nämlich gar nicht bis zu deiner Fehlerausgabe.
Grüße, Skrilax
hier mal alle mysql-relevanten statements:
#---------------------------------------------------------------------------#
# Connect zu MySQL #
#---------------------------------------------------------------------------#
$dbh = DBI->connect("DBI:mysql:$db:$hostname", "$username", "$password") or
die("Kann keine Verbindung zum MySQL-Server aufbauen: $DBI::errstr\n");
#---------------------------------------------------------------------------#
# SQL-Statement für Hauptmenu vorbereiten und absetzen #
#---------------------------------------------------------------------------#
$sql = "SELECT bezeichnung FROM hauptmenu ORDER BY position1";
$sth = $dbh->prepare($sql) or die("$dbh::errstr\n");
$sth->execute() or die("$sth::errstr\n");
die column position1 gibts nicht, also sollte doch irgendwo ein fehler ausgegeben werden. wie gesagt, bei mir bleibt der bildschirm weiss...
Momentan gibt's die Tabelle text so nicht, also sollte doch eine Fehlermeldung geprintet werden ($dbh->errstr). Bei mir erscheint gar nix, der Screen bleibt weiss...
Ist bei dir die Konsole (oder ODS Fenster) weiß? Normalerweise ist die schwarz. Aber das keine Meldungen ausgegeben werden glaub ich nicht.
Ich glaube auch eher das du von einem CGI Perlskript sprichst, dann ist die Frage ob das Skript mit einen gültigen HTTP Header Antowrtet und was steht im Errorlog?
Struppi.
Momentan gibt's die Tabelle text so nicht, also sollte doch eine Fehlermeldung geprintet werden ($dbh->errstr). Bei mir erscheint gar nix, der Screen bleibt weiss...
Ist bei dir die Konsole (oder ODS Fenster) weiß? Normalerweise ist die schwarz. Aber das keine Meldungen ausgegeben werden glaub ich nicht.
Ich glaube auch eher das du von einem CGI Perlskript sprichst,
sorry, es handelt sich um ein CGI-Perlscript...
dann ist die Frage ob das Skript mit einen gültigen HTTP Header
Antowrtet und was steht im Errorlog?
ich setzte vorgängig folgenden http-header:
print "Content-Type: text/html\n\n";
auszug errorlog:
[Sun Mar 18 12:26:39 2007] [error] [client 127.0.0.1] Name "dbh::errstr" used only once: possible typo at D:/web/fust-buetschwil/public_html/cgi-bin/allgemein.pl line 124., referer: http://localhost/
[Sun Mar 18 12:26:39 2007] [error] [client 127.0.0.1] Name "sth::errstr" used only once: possible typo at D:/web/fust-buetschwil/public_html/cgi-bin/allgemein.pl line 125., referer: http://localhost/
[Sun Mar 18 12:26:39 2007] [error] [client 127.0.0.1] DBD::mysql::st execute failed: Unknown column 'position1' in 'order clause' at D:/web/fust-buetschwil/public_html/cgi-bin/allgemein.pl line 125., referer: http://localhost/
[Sun Mar 18 12:26:39 2007] [error] [client 127.0.0.1] Use of uninitialized value in concatenation (.) or string at D:/web/fust-buetschwil/public_html/cgi-bin/allgemein.pl line 125., referer: http://localhost/
[Sun Mar 18 12:26:39 2007] [error] [client 127.0.0.1] , referer: http://localhost/
aber diese meldung von wegen unknown column sollte doch auf den bildschirm geprintet werden, nicht?
ich setzte vorgängig folgenden http-header:
print "Content-Type: text/html\n\n";
use CGI;
auszug errorlog:
Du solltest deine Skript immer mit use strict und eingeschalteten Warnungen entwickeln, alles andere ist Zeitverschwendung.
Für CGI Programme bitet sich noch das Modul CGI::Carp, damit kannst du die Fehler als HTML Ausgabe an den Browser schicken.
aber diese meldung von wegen unknown column sollte doch auf den bildschirm geprintet werden, nicht?
Nur wegen der Wortwahl. Es wird nichts auf dem Bildschirm "geprintet" ein CGI Skript gibt lediglich den Code (i.d.R. HTML) aus, den der Browser anzeigt. Eine Ausgabe auf dem Bildschirm macht also das Skript niemals, nur wenn du es in der schon erwähnten Konsole aufrufst wird etwas auf dem Bildschirm "geprinted"
Struppi.
zum Error Handling:
Der folgende Block schreibt Warnings in ein File im gleichen directory wie dein Script. Das ist praktisch. Dann musst du nicht die relevanten Errors erst aussortieren aus der allgemeinen error.log
BEGIN {
use CGI::Carp qw(carpout);
open(LOG, ">>error.txt") or die "Unable to append to error.txt: $!\n";
carpout(*LOG);
}
$sth->execute() or die "$dbh->errstr";
Momentan gibt's die Tabelle text so nicht, also sollte doch eine Fehlermeldung geprintet werden ($dbh->errstr). Bei mir erscheint gar nix, der Screen bleibt weiss...
Wie bereits herausgearbeitet, wird selbstverständlich etwas "geprintet", nur nicht dorthin, wo du es erwartest. Allerdings ist dein Vorgehen im Produktiveinsatz alles andere als empfehlenswert: Du lässt nicht nur das Script sterben, sondern auch den User im Regen stehen. Alles, was er zu sehen bekommt, ist die Standardseite, welche die Serversoftware bei Statuscode 500 sendet. Für diesen Fall halte ich eine eigene Fehlerbehandlung für unerlässlich, die zu entscheiden hat, wie auf den Fehler zu reagieren ist. Damit behältst du die Kontrolle über das, was passiert (evtl. soll ja das Script ja trotzdem weiterlaufen und der User soll gar nichts von den Fehlern mitbekommen o.ä. Szenarien).
Aber das nur am Rande :)
Siechfred