2012-04-18 97 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有很多边界情况和奇怪的行为,这些已经在这些模块中处理过了。

相关问题