-1

Perl CGIを使用して、db接続でログインページを作成しようとしています。IDEEclipseを使用しています。それを実行している間、私はエラーを受け取ります:

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;
4

2 に答える 2

-1

サブルーチンsql_connectは出力を生成します (print "...")正しい HTTP ヘッダーが送信される前に。
デバッグ メッセージをログファイルに出力するか、最初に HTTP ヘッダーを出力してから他のコンテンツを生成します。

于 2012-04-18T13:01:04.103 に答える
-2

HTTP 応答を送信する場合 (例: ブラウザーに出力する場合)、アプリケーションは本文だけでなく、応答ヘッダーを送信する必要があります。HTML を送信するとき、 STDOUTに最初に出力するのは、少なくとも次の内容を含むヘッダーである必要があります。

 Content-type: text/html

ヘッダーの後には空白行が続きます。

したがって、スクリプトの最初の出力は次のようになります。

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

(生成するヘッダーがさらにある場合は、最後のヘッダーまで、それぞれの後に \n を 1 つだけ出力します。)

もちろん、代わりにCGIまたはCGI::Simpleモジュールを使用すると、作業がずっと楽になります。CGI には、これらのモジュールで既に対処されている多くのエッジ ケースと奇妙な動作があります。

于 2012-04-18T13:21:55.710 に答える