2017-05-26 94 views
0

嗨,我嘗試使用下面的Perl腳本連接到MySQL數據庫MySQL的:無法連接用perl DBI模塊

#!/usr/bin/perl -w 
use strict; 
use DBI; 
my $dbh = DBI->connect(   
    "dbi:mysql:dbname=MYDATABASENAME", 
    "MYUSERNAME",       
    "MYPASSWORD",       
    { RaiseError => 1 },   
) or die $DBI::errstr; 

my $sth = $dbh->prepare("SELECT * FROM classes"); 
$sth->execute(); 

my ($class_id, $class_name, $class_number) = $sth->fetchrow(); 
print "$class_id $class_name $class_number\n"; 

my $fields = $sth->{NUM_OF_FIELDS}; 
print "We have selected $fields field(s)\n"; 

my $rows = $sth->rows(); 
print "We have selected $rows row(s)\n"; 

$sth->finish(); 
$dbh->disconnect(); 

現在我剛開了一個空白頁面,我想不通爲什麼我至少沒有收到錯誤信息。我花了超過20個小時試圖弄清楚這就是爲什麼我希望有人能看到我做錯了什麼。提前致謝。

+0

你是說,當你運行它,它只是掛起,你必須按Ctrl-C來得到提示回來? – jrefior

+0

對不起,我沒有從命令行運行它。我把它保存在我的虛擬主機帳戶的cgi-bin文件夾中。運行腳本時,空白屏幕位於瀏覽器中。 –

+0

此外,這可能是一個愚蠢的問題,但我只是想確保...我有很多與php結合使用mysql的經驗,但我是新來的Perl。如果我用php腳本連接到數據庫,用戶名和密碼字段是相同的用戶名和密碼? –

回答

1

這應該工作。如果您在本地運行腳本,則port是可選的。

use strict; 
use warnings; 
use DBI; 

my $database = 'name_of_database'; 
my $DBhost  = 'localhost'; 
my $port  = 'portnumber'; 
my $username = 'user123'; 
my $password = 'password123'; 

my $dbh = DBI->connect("dbi:mysql:database=$database;host=$DBhost;port=$port",$username,$password,       
    { RaiseError  => 1, 
     PrintError  => 0, 
     AutoCommit  => 1, 
     FetchHashKeyName => 'NAME_lc'},) or die $DBI::errstr; 

my $sth = $dbh->prepare("SELECT * FROM classes"); 
    $sth->execute(); 

my ($class_id, $class_name, $class_number) = $sth->fetchrow(); 
    print "$class_id $class_name $class_number\n"; 

my $fields = $sth->{NUM_OF_FIELDS}; 
    print "We have selected $fields field(s)\n"; 

my $rows = $sth->rows(); 
    print "We have selected $rows row(s)\n"; 

    $sth->finish(); 
    $dbh->disconnect(); 
2

在評論中,您添加了應該在原始問題中確實存在的有用信息。

對不起,我沒有從命令行運行它。我把它保存在我的虛擬主機帳戶的cgi-bin文件夾中。運行腳本時,空白屏幕位於瀏覽器中。

這個程序不會像CGI程序那樣工作,因爲您沒有返回內容類型標題。嘗試將這兩行添加到程序的頂部。

use CGI 'header'; 
print header('text/plain'); 

您還應該找出Web服務器錯誤日誌的存在位置並檢查錯誤。這是一個安全功能,CGI程序不會將錯誤發送到瀏覽器(儘管我希望看到一些跡象表明存在問題)。

另外值得指出的是,在5.6版(2000年發佈)中,use warnings編譯指示被添加到Perl中,並且大多數程序員在shebang行上使用該編號代替-w

我還建議在編寫CGI版本之前,測試一個新的Perl模塊作爲命令行程序通常(可能總是)一個好主意。當你學習新東西時,CGI只會增加額外的,不必要的複雜程度。

+1

嗯,你有好的眼睛,從來沒有看過那個評論upvote。 –

+0

甚至不需要用CGI.pm來做 - 一個簡單的'print'Content-type:text/plain \ n \ n「'其他輸出將完成這項工作 –

+0

@ChrisTurner好吧,如果它是一個類似Unix的服務器,\ n \ n會發送不正確的行尾字符,所有服務器平臺的唯一方法就是使用' \ 015 \ 012 \ 015 \ 012'。隱藏這樣的模糊東西無疑是爲什麼我們使用模塊:-) –