Hallo Leute,
vielleicht könnt ihr mir bei folgendem Problem helfen.
Über Perl/DBI greife ich auf eine MySQl Datenbank zu. Das Script, welches die Datenbankanfragen entgegennimmt ist Query.pl, alles klappt soweit. Nun möchte ich, dass die Anmeldung bei der DB, also die Eingabe von MySQL Account und Passwort durch ein separates HTML-Formular (Anmeldung.html) und zugehöriges Perlscript (Anmeldung.pl) erfolgt. Ist die Anmeldung erfolgreich,
so werden die User durch Anmeldung.pl auf die Anfrageseite Query.html umgeleitet.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
#Das Script ANMELDUNG.PL
use CGI;
use CGI::Carp qw(fatalsToBrowser);
use DBI;
$port = "3306";
read (STDIN, $query_string, $ENV{'CONTENT_LENGTH'});
@Query_keys_values = split(/&/, $query_string);
foreach $key(@Query_keys_values){
chomp ($key);
($Query_key, $Query_value) = split(/=/, $key);
$DB{$Query_key} = $Query_value;
}
$dbh = DBI->connect("DBI:mysql:database=$DB{'DB_name'};host=$DB{'DB_host'}:$port", "$DB{'DB_user'}", "$DB{'DB_password'}");
if (defined ($DBI::err)){
print "Location: Fehlermeldung_Passwort.html","\n\n";
} else {
print "Location: Query.html","\n\n";
}
In dem Code von Anmeldung.pl, seht ihr, dass ich weder die Methode "disconnect" oder das obligatorische "exit" am Ende des Scripts aufrufe - Sinn des Ganzen: die einmal hergestellte DB-Verbindung soll aufrecht erhalten bleiben (für die darauf folgenden Anfragen durch Query.html), und genau das kriege ich trotdem nicht hin. Ich muss mich durch Account und Passwort bei der DB erneut anmelden, d.h. auch Query.pl führt dasselbe $dbh = DBI->connect(...) durch und erst dann erfolgt ein $sth = dbh->do(...) ohne die Fehlermeldung
"Can't call method "do" on an undefined value at Query.pl line ...".
Wenn ich einfach die Zeile mit $dbh = DBI->connect(...) in Query.pl auskommentiere kommt eben diese Fehlermeldung, d.h. das Objekt $dbh von Anmeldung.pl steht für Query.pl nicht mehr zur Verfügung.
Meine Frage also: Wie schaffe ich's, dass die bei der Anmeldung hergestelle DB-Verbindung nicht abbricht und für andere Perl-Scripte ohne Neuanmeldung zur Verfügung steht?
Die Möglichkeit, Account und Passwort, die bei der Anmeldung
eingegeben werden in einer Datei abzuspeichern, und so allen Scripten zur Verfügung zu stellen, möchte ich umgehen. Muss ich vielleicht beim Apache oder bei der MySQL DB irgendwelche Konfigurationen vornehmen? Habe mal ein wenig rumgelesen und denke, dass das Problem folgende Ursache hat: Nachdem ein Perlscript ausgeführt wurde bzw. wenn man die DB-Verbindung nicht explizit durch ein "disconnect" wieder trennt, macht sich der
"Perl Garbage Collector" über nicht mehr benötigte Objekte, bei mir also $dbh her. Im Falle eines DB-Handles wird die "Destroy"-Methode aufgerufen, die wiederum durch den Aufruf von "disconnect" die DB-Verbindung "ohne mein Einverständnis" trennt.
Kann man das verhindern?
2 Tage Suche in diversen Diskussionsgruppen, googlen und seitenweises Lesen haben nichts brauchbares zur Problemlösung gebracht und lassen verzweifeln ;) .
Vielen Dank für eure Hilfe im Voraus.
Dieter