[英]Why does my Perl script hang while trying to connect to a database using DBI?
[英]Why does my Perl script fail to connect to the database?
我有一個Perl腳本,可以從MySQL數據庫檢索數據。 這是代碼:
sub startSession{
my $self = shift;
my $dsn = "dbi:".$self{platform}.":".$self{database}.":".$self{host}.":".$self{port};
print "$dsn\n" ;
$self{dbHandle} = DBI->connect($dsn,$user,$password);
}
我已經提供了來自外部文件的所有信息。 我收到錯誤消息
DBI connect('dbname:**.**.**.**:3306','',...) failed: Access denied for user 'root'@'dbserver' (using password: NO) at line 89
Can't call method "prepare" on an undefined value at at line 97
我非常確定root可以從任何主機連接,並且密碼也是正確的。
我看到的警告的關鍵部分是“ 使用密碼:否 ”。 檢查密碼設置是否正確。
首先,您的直接問題是,如@SinanÜnür所說,您需要將$self{platform}
更改$self{platform}
$self->{platform}
等。
您的第二個直接問題是,看來您無處獲得$user
和$password
(它們沒有傳遞給函數,因此除非它們是全局變量,否則它們是未定義的),這將說明using password: NO
錯誤。 也許這些應該是$self->{user}
和$self->{password}
?
您至少應該在開發過程中考慮將其放在模塊的頂部,以自動捕獲以下錯誤:
use warnings qw(all);
use strict;
但是我也要評論一下,從設計的角度來看,您確實應該將DSN視為不透明的字符串。 每個數據庫都有其自己的DSN格式。 因此,如果您要定位其他數據庫,則需要其他DSN格式。 或者,也許某天MySQL將使用不同的格式(它已經有兩種格式)。 無論哪種方式,在配置文件中將其更改為一個位置都比跟蹤將各個部分連接在一起的每個位置要容易得多。
大概$self
是一個hashref,而不是普通的hash,並且您沒有警告 。 因此,將它們打開,然后使用$self->{platform}
等。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.