2012-04-18 37 views
-1

使用Perl的CGI,我想創建一個DB連接的登錄頁面。我正在使用IDE eclipse。雖然運行它,我得到的錯誤:我是perl-cgi的新手。我試圖連接數據庫與CGI腳本我得到這個錯誤

Server Error 
while trying to obtain /sssss/login.cgi 
Missing header from cgi output 

這裏是我的代碼:

#!/usr/bin/perl 
use strict; 
use CGI qw(:standard); 
use CGI::Pretty qw(:all); 
use CGI::Carp qw(warningsToBrowser fatalsToBrowser); 
use DBI; 
use DBD::mysql; 
use DBI qw(:sql_types); 
use DBD::ODBC; 
use CGI qw/:standard/; 
use CGI; 


my $cgi = CGI->new(); 

my $user='root'; 
my $pass='123'; 
my $dsn = 'DBI:mysql:delve:server'; 
my $dbh = &sql_connect; 
$dbh-> {'LongTruncOk'} = 1; 
$dbh-> {'LongReadLen'} = 90000; 
print "Content-type: text/html\n\n"; 
print "<html><h1>OTT Login</h1></html>\n"; 
print '<body bgcolor="gray">'; 


#start a form---------------- 

print '<form method=POST>'; 


print '<p>'; 
print 'Employee Name: <p><INPUT type="text" name="User" size=25 maxlength=25></p>'; 
print '</p>'; 

# Create a text box for Password:--------------- 

print '<p>'; 
print 'Password:<p><INPUT TYPE=PASSWORD NAME="mypassword" id = "Password" size = "15" maxlength = "15" tabindex = "1"/></p>'; 
print '</p>'; 

#Create submit & reset button:------------------- 

#print '<p><input type=" button" name="submitit"value="submit"onclick="formvalidation(myform)"/></p>'; 
print '<form name="input" method="post">'; 
print '<p><input type="submit" value="Submit" /><INPUT TYPE="reset" name = "Reset" value = "Reset"></p>'; 

#Create Change Password & Reset Password link:------------ 
print '<p><a href="changepwd.cgi">Change Password</a></p>'; 
print '<p><a href="userlogin.cgi">Reset Password</a></p>'; 
print '</form>'; 

#logic for submit button functionality :----------------- 


if (param('User') and param('mypassword')) 
{ 
my $usr=ucfirst(lc(param('User'))); 
my $pwd=ucfirst(lc(param('mypassword'))); 

my $query="select username from login where username='$usr'"; 
my $data=$dbh->prepare($query) or die $dbh->errstr; 
$data->execute()    or die $data->errstr; 
my ($x,$y); 
my $query1="select password from login where password='$pwd'"; 
my $data1=$dbh->prepare($query1) or die $dbh->errstr; 
$data1->execute()    or die $data->errstr; 


if ($x=$data->fetchrow()) 
       { 
       if ($y=$data1->fetchrow()) 
       { 

       print "Correct Password"; 
       print $cgi->redirect("samp.html"); 
       } 
        else 
        { 
        print "Incorrect Password"; 
         } 
     } 
     else 
     { 

      print "Invalid username"; 
     } 
$dbh->disconnect || die "$DBI::errstr\n"; 



} 
sub sql_connect 
{ 
    Reconnect: 
    my $dbh = DBI->connect($dsn, $user, $pass,{AutoCommit => 1}) or warn "$DBI::errstr\a\a\n"; 

    if(defined $dbh) 
    { 
     print "Data base Connected successfully\n"; 
    } 
    else 
    { 
     print "Please Check Ur Database\n"; ### To handle Database Failure 
     sleep(10); 
     goto Reconnect; 
    } 
    return $dbh; 
} 


1; 
+3

從[堆棧溢出Perl常見問題](http://stackoverflow.com/questions/tagged/perl?sort=faq):[我如何解決我的Perl CGI腳本?](http://stackoverflow.com/questions/2165022/how-can-i-troubleshoot-my-perl-cgi-script) - 你需要學習如何進行基本的調試。安裝所需的模塊。減少程序,直到問題不再發生,找到讓Eclipse認爲沒有頭輸出的部分。該程序從命令行運行,即打印必要的HTTP頭和一些錯誤消息。 – daxim 2012-04-18 12:27:39

+1

如果你從Perl開始,儘可能避免CGI。學習一個現代的網絡框架,如[舞者](http://perldancer.org)或[Mojolicious](http://mojolicious.org/)。這個任務對你來說更容易(少寫代碼),結果可能會更安全。 – dolmen 2012-04-18 12:53:18

+0

您使用'CGI'三次,'DBI'兩次。你應該清理你的代碼。也不建議直接使用任何'DBD :: *'模塊。 – dgw 2012-04-18 12:54:18

回答

-1

你的子程序sql_connect產生正確的HTTP頭之前輸出(print "...")發送
無論是打印調試消息到日誌文件或首先打印HTTP標頭,然後生成其他內容

+0

Downvoting without comment ... – dgw 2012-04-18 16:30:50

-2

當您發送HTTP響應(例如打印到瀏覽器)時,您的應用程序必須發送迴應標題,而不只是身體。當你要發送HTML,打印到標準輸出第一件事應該是包含至少這樣的標題:

Content-type: text/html 

頭之後是一個空行。

所以在腳本中的第一個打印應該是:

print 'Content-type: text/html',"\n\n"; 

(如果你有更多的頭文件來生成,然後打印只有一個\ n各自直到最後一個人後)

當然,如果您使用CGICGI::Simple模塊,您將使您的生活變得更加輕鬆。 CGI有很多邊界情況和奇怪的行爲,這些已經在這些模塊中處理過了。

相關問題