2016-08-16 1 views
1

In dbutils.pm Datei vorbereiten rufen wirkann nicht Methode auf einen nicht definierten Wert perl

my $sth = $dbh->prepare($checkUser) or return ($::FALSE,"checkUser prepare failed "); 

in dieser Erklärung verwenden Fehler immer wie können Verfahren auf einen nicht definierten Wert gleiche Aussage nicht nennen bereiten mit in dieser Datei für viele Male, aber ich habe keinen Fehler wie folgt erhalten. prepare ($ checkUser) -> checkUser ist eine SQL-Abfrage und gibt etwas zurück. Es gibt kein Problem mit der Abfrage seiner Rückgabewerte.

Wir verwenden sub dbLogin { } Funktion. In dieser Funktion haben wir gegeben:

$dbh = DBI->connect('DBI:Or‌​acle:DBname', 'username', 'pwd') 
    or die "Couldn't connect to database: " . DBI->errstr; 

Und diese Funktion $dbh um pro Ihren Vorschlag zurückkehrt schon wir, dass $dbh Code der Leitung.

Was auch immer die $ dbh zurückgibt, dass wir in vielen Fällen & Orte in dbUtil.pm Datei verwenden.

Bitte schlagen Sie mir vor, dieses Problem zu beheben.

+0

Keiner der Details, die Sie hinzugefügt haben, hat die Situation überhaupt verändert.Das Problem ist, dass '$ dbh' nicht definiert ist, wenn Sie' prepare() 'aufrufen. Sie müssen herausfinden, warum es an diesem Punkt in Ihrem Programm nicht gesetzt ist. –

+0

Wir rufen sub dbLogin() -Funktion für jedes Mal beim Aufruf prepare() wie mein $ dbh = & dbLogin; my $ sth = $ dbh-> Vorbereitung ($ checkUser) oder return ($ :: FALSE, "checkUser Vorbereitung fehlgeschlagen") ;. –

+0

Dann gibt 'dbLogin() 'aus irgendeinem Grund einen undefinierten Wert zurück. Sie müssen herausfinden, warum das so ist. Und rufen Sie Subroutinen nicht mit '&' auf. Es ist möglicherweise verwirrend und wurde seit über zwanzig Jahren nicht mehr benötigt. –

Antwort

3

Es bedeutet $dbh ist nicht korrekt. Bitte schreiben Sie Ihre $dbh wie unten und sehen Sie, ob es keine Verbindung herstellen kann.

my $dbh = DBI->connect($data_source, $username, $auth, \%attr) 
       or die "Couldn't connect to database: " . DBI->errstr; 

Alternativ

my $dbh = DBI->connect($data_source, $username, $auth, { RaiseError => 1 }); 

Wie pro Ihre editierten Frage:

drucken dumper von $dbh nach dem dbLogin Unterprogramm aufrufen (kurz vor prepare Anweisung), um zu sehen, ob es nicht definiert ist. Wenn das der Fall ist, müssen Sie weiter debuggen, um zu sehen, was $dbh ändert.

+0

Hi Chankey, hier benutzen wir sub dbLogin {} function.in dieser Funktion haben wir $ dbh = DBI-> connect ('DBI: Oracle: DBname', 'username', 'pwd') oder die 'Konnte nicht Verbindung zur Datenbank herstellen: ". DBI-> Fehler; so und diese Funktion gibt $ dbh zurück; wir verwenden also den $ dbh Code der Zeile bereits. –

+1

Wenn Ihre 'dbLogin()' Funktion eine gültige '$ dbh' zurückgibt, aber' $ dbh' nicht definiert ist, wenn Sie sie 'prepare()' aufrufen, muss etwas den Wert überschreiben. Oder vielleicht verwenden Sie nicht die richtige '$ dbh'-Variable. Hast du 'my $ dbh' irgendwo die ursprüngliche Variable maskiert? –

+1

Wenn Sie größere Code-Fragmente haben (wie die 'dbLogin()' -Funktion, wäre es hilfreich, wenn Sie Ihre Frage bearbeiten könnten, statt sie in Kommentare zu schreiben, wo sie sehr schwer zu lesen sind. –

1

Ok, schauen wir uns diesen Fehler an.

nicht-Methode aufrufen, bereiten Sie sich auf einen nicht definierten Wert

Perl Ihnen sagt, dass Sie die Methode prepare() auf einen nicht definierten Wert sind aufgerufen wird. Was bedeutet das?

In Ihrem Code haben Sie diese Zeile:

my $sth = $dbh->prepare(...);

Hier prepare() ist eine Methode, die Sie $dbh auf das Objekt aufrufen. Wenn Perl Ihnen mitteilt, dass Sie es auf einen undefinierten Wert aufrufen, muss $dbh an diesem Punkt des Codes nicht definiert sein.

Also müssen Sie schauen, wo Sie denken, dass $dbh einen Wert gegeben wird. Dieser Code läuft irgendwie schief. Sie müssen weitere Fehlerprüfungen hinzufügen, um herauszufinden, was falsch läuft. Der Code Chankey suggests sieht wie ein ausgezeichneter Start aus.

Verwandte Themen