2016-08-16 67 views
1

在dbutils.pm文件中我們在此聲明得到錯誤像使用不能調用方法未定義的值的perl編寫

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

不能調用方法未定義的值使用相同的語句準備在這個文件中多次,但我沒有得到任何這樣的錯誤。 prepare($ checkUser) - > checkUser是SQL查詢並返回一些東西。查詢它的返回值沒有問題。

我們正在使用sub dbLogin { }函數。在這個函數中,我們已經給:

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

而這個功能是我們已經使用返回$dbh所以根據您的建議,即行$dbh代碼。

什麼是dbh返回的結果,我們在dbUtil.pm文件中多次使用&個地方。

請建議我解決此問題。

+0

您添加的細節完全沒有改變這種情況。問題在於,當你使用它調用'prepare()'時,$ dbh'未定義。你需要弄清楚爲什麼它沒有在你的程序中設置。 –

+0

我們調用子dbLogin()函數,每次調用prepare() like my $ dbh =&dbLogin; my $ sth = $ dbh-> prepare($ checkUser)或return($ :: FALSE,「checkUser prepare failed」);. –

+0

然後'dbLogin()'由於某種原因返回一個未定義的值。你需要弄清楚爲什麼。而且,請不要用'&'調用子程序。這可能會讓人困惑,而且二十多年來一直不被要求。 –

回答

3

這意味着$dbh是不正確的。請在下面寫下$dbh,看看它是否無法建立連接。

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

或者

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

根據你編輯的問題:

$dbh打印自卸車調用dbLogin子程序(之前prepare語句),看它是否是未定義後。如果是這種情況,那麼您需要進一步調試以查看修改$dbh的內容。

+0

嗨Chankey,我們在這裏使用sub dbLogin {}函數。我們已經給出了$ dbh = DBI-> connect('DBI:Oracle:DBname','username','pwd')或者「Could not連接到數據庫:「。 DBI-> errstr;像這樣,這個函數返回$ dbh;根據你的建議,我們已經使用$ dbh代碼行。 –

+1

如果你的'dbLogin()'函數正在返回一個有效的'$ dbh',但是'dbh'在你使用它調用'prepare()'的時候未定義,那麼一定要覆蓋這個值。或者你可能沒有使用正確的'$ dbh'變量。你有'我的$ dbh'掩蓋原始變量的地方嗎? –

+1

如果你有很大的代碼片段(比如dbLogin()函數),如果你可以編輯你的問題來包含它們,而不是把它們放在非常難以閱讀的註釋中,那將會很有幫助。 –

1

好吧,讓我們看看那個錯誤。

不能調用方法編寫一個未定義的值

Perl的告訴你,你調用一個未定義值的方法prepare()。那是什麼意思?

在你的代碼有這樣一行:

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

這裏,prepare()是您呼叫的對象$dbh上的方法。如果Perl告訴你,你在一個未定義的值上調用它,那麼你的代碼$dbh的這一點必須是未定義的。

所以你需要看看你認爲$dbh是給定的值。該代碼出錯了。你需要在那裏添加更多的錯誤檢查,以便找出發生了什麼問題。代碼Chankey suggests看起來是一個很好的開始。

相關問題