1

私はまだ Perl の初心者であり、困難に直面しています。

ここには、レポートを実行するためにユーザーにアクセス許可を割り当てる必要があるシステムがあります。

システムは、マシンでホストされているローカル テスト環境で完全に機能しますが、開発用に Windows Server 2008 にアップロードされると、割り当てられたレポート フォームに入力されないようです。

Javascript 関数を使用して、ユーザー ドロップダウン リストに入力し、使用可能なレポートに入力します。割り当てられたレポートに関しては、何も入力されていません。リポジトリから取得したまったく同じコードが、ローカル環境で問題なく動作します。

割り当てられたレポートは、サーバー上の Perl スクリプトではなく、ローカル マシン環境を指すように Perl スクリプトのディレクトリを変更した場合にのみ読み込まれます。

これは、サーバー ディレクトリを指しています。

function ReadUserPermission( iUserID )
{
    var xmlhttp = new ActiveXObject("Msxml2.XMLHTTP");
    var szURL;
    var iPermNumber = 0;

    szURL = "/Scripts/Security/ReadPermissions.pl";

    xmlhttp.Open("POST", szURL, false);
    xmlhttp.Send( iUserID );
    var bRetVal = PermissionTab.loadXML( xmlhttp.responseText );
    var rt = xmlhttp.responseText;

    RGCollection = PermissionTab.XMLDocument.selectNodes("//REPORTGROUP");
    for (var i=0; i< RGCollection.length; i++)
    {
        RGXML = new ActiveXObject("Msxml2.DOMDocument")
        RGXML.loadXML( RGCollection.item(i).xml );

        ReportCollection = RGXML.selectNodes( "//REPORTGROUPNAME" );
        szReportGroupName = ReportCollection.item(0).text;

        ReportCollection    = RGXML.selectNodes( "//REPORTGROUPID" );
        iReportGroupID      = ReportCollection.item(0).text;

        ReportCollection = RGXML.selectNodes( "//REPORT" );
        for( var j=0; j < ReportCollection.length; j++ )
        {
            IR = new ActiveXObject( "MSXML2.DOMDocument" );
            IR.loadXML( ReportCollection.item(j).xml );
            IRD = IR.selectNodes( "//REPORTNAME" );      szReportName    = IRD.item(0).text;
            IRD = IR.selectNodes( "//REPORTID" );        iReportID       = IRD.item(0).text;
            IRD = IR.selectNodes( "//PERMISSION" ); bPermission     = IRD.item(0).text;            

            Users[iUserID].Permissions[iPermNumber]                   = new DataClass;
            Users[iUserID].Permissions[iPermNumber].ReportGroupName   = szReportGroupName;
            Users[iUserID].Permissions[iPermNumber].ReportGroupID     = iReportGroupID;
            Users[iUserID].Permissions[iPermNumber].ReportName        = szReportName;
            Users[iUserID].Permissions[iPermNumber].ReportID          = iReportID;
            Users[iUserID].Permissions[iPermNumber].Permission        = bPermission;
            iPermNumber++;
        }
    }
}

しかし、szURL = "//028-07743/Scripts/Security/ReadPermissions.pl" の場合、問題なく実行されます。

これは私を困惑させたので、誰でも助けにアドバイスできますか。

これは、実行されていないと思われる ReadPermissions.pl スクリプトです。

use CGI qw/:standard *table start_ul :cgi-lib/;
use Win32::ODBC;
require "ServerDetails.cfg";

#Reads Details for Connection from CFG file
sub ReadCfg
{
    my $file = $_[0];

    our $err;

    {   # Put config data into a separate namespace
        package CFG;

        # Process the contents of the config file
        my $rc = do($file);

        # Check for errors
        if ($@) {
            $::err = "ERROR: Failure compiling '$file' - $@";
        } elsif (! defined($rc)) {
            $::err = "ERROR: Failure reading '$file' - $!";
        } elsif (! $rc) {
            $::err = "ERROR: Failure processing '$file'";
        }
    }

    return ($err);
}

# Get our configuration information
if (my $err = ReadCfg('ServerDetails.cfg')) {
    print(STDERR $err, "\n");
    exit(1);
}

$szDataSource = "DSN=$CFG::CFG{'server'}{'DSN'};UID=$CFG::CFG{'server'}{'UID'};PWD=$CFG::CFG{'server'}{'PWD'}";

%PARM = Vars;
$iUser = $PARM{'keywords'};

open TMP, ">dhtml.txt";
$db = OpenConnection( $szDataSource );

$szSQLStatement = "EXEC spGetUserPermissionTabData '$iUser'";

$iNumRecordsRead = ReadData( -dbconnection=>$db, -sqlstatement=>$szSQLStatement, -datahash=>\%UserData );

$szXMLString = "<Permissions>\n";
$szCurrentReportGroupName = "";
foreach $KEY ( sort{ $a <=> $b } keys %UserData )
{
    if( $szCurrentReportGroupName ne $UserData{$KEY}{AppGroupName} )
    {
        if( $szCurrentReportGroupName ne "" )   #Close any previous report groups
        {
            $szXMLString .= "\t</REPORTGROUP>\n";
        }
        $szXMLString .= "\t<REPORTGROUP>\n" .
                "\t\t<REPORTGROUPNAME>$UserData{$KEY}{AppGroupName}</REPORTGROUPNAME>\n" .
                "\t\t<REPORTGROUPID>$UserData{$KEY}{ApplicationGroupID}</REPORTGROUPID>\n";
        $szCurrentReportGroupName = $UserData{$KEY}{AppGroupName};
    }
    $szXMLString .= "\t<REPORT>\n" .
            "\t\t<REPORTNAME>$UserData{$KEY}{AppDisplayName}</REPORTNAME>\n" .
            "\t\t<REPORTID>$UserData{$KEY}{ApplicationID}</REPORTID>\n" .
            "\t\t<PERMISSION>$UserData{$KEY}{PermissionType}</PERMISSION>\n" .
            "\t</REPORT>\n";
}
$szXMLString .= "\t</REPORTGROUP>\n" .
        "</Permissions>";

print TMP "UserID = $szUser\n";
print TMP "XML = $szXMLString\n";
print TMP "Size of XML = " . length( $szXMLString ) . "\n";
close $TMP;

print "Content-Type: text/html\n\n";
print "$szXMLString";


sub OpenConnection()
{
    my( $szDSN ) = @_;
    my $db = new Win32::ODBC( $szDSN );

    if( !defined $db )
    {
        my $szLocalTime = localtime();

        $szHTMLString = header;
        $szHTMLString .= "Error creating ODBC connection\n";
        $szHTMLString .= "<BR>Time: $szLocalTime\n";
        $szHTMLString .= end_html();

        print $szHTMLString;

        return NULL;
    }
    return $db;
}

sub ReadData()
{
    my ( %fnArgs ) = @_;
    my $szSQLStatement  = $fnArgs{-sqlstatement};
    my $cDBConnection   = $fnArgs{-dbconnection};
    local( *DataHash )  = $fnArgs{-datahash};

    my $iRowID = 0;
    if ($cDBConnection->Sql($szSQLStatement))
    {
        print "SQL failed. Error: " . $cDBConnection->Error() . "\n";
        $cDBConnection->Close();
        exit;
    }
    while($cDBConnection->FetchRow())
    {
        $DataHash{$iRowID++} = {$cDBConnection->DataHash()};
    }

    return $iRowID;
}

sub XMLizer
{
    local ( *DataHash ) = @_;


    my $szXMLString = "";
    foreach $KEY ( keys %DataHash )
    {
        $szXMLString .= "\t<" . $KEY . ">" . $DataHash{$KEY} . "</" . $KEY . ">\n";
    }

    return $szXMLString;
}

Perl ファイルの SQL ステートメントを に変更する$szSQLStatement = "EXEC spGetUserPermissionTabData 464";と、そのユーザーが選択されていない (予期されていない) 場合でも、割り当てられたウィンドウに特定のユーザー レポートが表示されるようになります。Javascript が送信する iUserID を Perl ファイルが受信していないのではないかと考えています。

4

1 に答える 1

2

Javascriptはクライアント側のスクリプト言語であり、サーバー上では実行されません。

Node.jsの方が役立つはずです:http: //en.wikipedia.org/wiki/Node.js

于 2012-11-11T15:18:25.037 に答える