2013-05-04 172 views
0

我想使用HTML表單將變量傳遞給Perl CGI腳本,以便我可以處理該變量,然後在另一個HTML頁面上將其打印出來。如何將變量從HTML表單傳遞給perl cgi腳本?

這是我的HTML代碼:http://jsfiddle.net/wTVQ5/

這是我的Perl CGI腳本來鏈接HTML。這是我想要做的方式(因爲它使用較少的線條,可能更有效)。

#!/usr/bin/perl 
use warnings; use strict; 
use CGI qw(:standard); 
my $query = CGI->new; 

# Process an HTTP request 
my $user = $query->param('first_name'); 

# process $user... for example: 
my $foo = "Foo"; 
my $str = $user . $foo; 

print "Content-type:text/html\r\n\r\n"; 
print "<html>"; 
print "<head>"; 
print "<title>Hello - Second CGI Program</title>"; 
print "</head>"; 
print "<body>"; 
print "<h2>Hello $str - Second CGI Program</h2>"; 
print "</body>"; 
print "</html>"; 

1; 

這裏有一個方法,我從tutorial閱讀,使我更有意義:

#!/usr/bin/perl 
use warnings; use strict; 

my ($buffer, @pairs, $pair, $name, $value, %FORM); 
# Read in text 
$ENV{'REQUEST_METHOD'} =~ tr/a-z/A-Z/; 
if ($ENV{'REQUEST_METHOD'} eq "POST") { 
    read(STDIN, $buffer, $ENV{'CONTENT_LENGTH'}); 
}else { 
    $buffer = $ENV{'QUERY_STRING'}; 
} 
# Split information into name/value pairs 
@pairs = split(/&/, $buffer); 
foreach $pair (@pairs) { 
    ($name, $value) = split(/=/, $pair); 
    $value =~ tr/+/ /; 
    $value =~ s/%(..)/pack("C", hex($1))/eg; 
    $FORM{$name} = $value; 
} 
my $user = $FORM{first_name}; 

# process $user... for example: 
my $foo = "Foo"; 
my $str = $user . $foo; 

print "Content-type:text/html\r\n\r\n"; 
print "<html>"; 
print "<head>"; 
print "<title>Hello - Second CGI Program</title>"; 
print "</head>"; 
print "<body>"; 
print "<h2>Hello $str - Second CGI Program</h2>"; 
print "</body>"; 
print "</html>"; 

1; 

這兩種不正常BTW工作。當我點擊HTML頁面上的提交按鈕時,它只是將我鏈接到腳本,而不是傳遞變量,處理它並打印出HTML頁面。

+0

在哪個服務器上?阿帕奇? – 2013-05-04 19:47:53

+0

我正在使用Komodo Edit來編寫和查看HTML和SSH服務器以測試最終結果。不幸的是,我之前從未使用apache,也沒有安裝它。 – cooldood3490 2013-05-04 19:50:27

+2

在第二個例子中,你絕對應該*不要*使用錯誤的參數處理代碼。 CGI模塊正確執行此操作。實際發送到腳本的是什麼?例如,如果將所有參數轉儲到錯誤日誌中,會發生什麼? – friedo 2013-05-04 19:53:31

回答

1

這一行:

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

應該是:

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

或更好:

print $query->header; 

此外,確保您的Web服務器良好配置都可CGI。如果你有足夠的時間,使用現代的Web應用程序方法,有許多框架可能比CGI(Dancer,Mojolicious,OX ...)更好

+0

感謝Miguel。我按照你所說的做了改變。我剛安裝了apache。現在我要試着弄清楚如何使用apache服務器來運行和測試cgi腳本。當我確認它有效時,我會接受最佳答案。 – cooldood3490 2013-05-04 20:15:32

+0

我收到了同樣的錯誤。當我點擊HTML頁面上的提交。它將我鏈接到perl cgi腳本,而不是處理輸入並顯示HTML頁面。 http://i.imgur.com/9WEm4uP.png – cooldood3490 2013-05-04 21:15:11

1

我看到你使用CGI「標準」真的需要啓動一個CGI->新的,除非你只是想,也可以說少線,你可以做這樣的事情。

use strict; 
use warnings; 
use CGI qw(:standard); 

my $user = param('first_name') || q/foo/; 

print header, 
     start_html(-title => 'Hello'), h1('Hello ' . $user), end_html; 
+0

我收到了同樣的錯誤。當我點擊HTML頁面上的提交。它將我鏈接到perl cgi腳本,而不是處理輸入並顯示HTML頁面。 http://i.imgur.com/9WEm4uP.png – cooldood3490 2013-05-04 21:17:09

+0

你的html爲你的

數據並提交看起來像什麼? – hwnd 2013-05-04 21:42:33

+0

Name: ' – cooldood3490 2013-05-04 21:53:24

1

你需要編輯你的httpd.conf這樣的東西。

AddHandler cgi-script cgi pl 
<Directory /path/to/cgi/files> 
Options +ExecCGI 
</Directory> 

如果運行這個地方,你可以創建一個名爲的public_html在你的主目錄結構,將其設置爲運行腳本的文件夾,你只需要還配置將其映射到該位置。

+0

謝謝,我對httpd.conf文件進行了更改。我現在得到了這個:http://i.imgur.com/UDGGQHW.png,甚至在更改了chmod 0755的權限之後。當我將html更改爲完整路徑時,它不起作用;我只在name.html的同一個目錄下有name.cgi。無論如何,我越來越近了。 – cooldood3490 2013-05-04 22:39:07

+1

這裏的規則是,Apache需要對路徑中的所有文件夾執行訪問以便爲文件提供服務。沒有這個,你會得到一個HTTP 403(禁止)。它看起來像你的腳本在主文件夾中,你想把它放在你的publc_html/cgi-bin或者公共目錄的任何地方。 – hwnd 2013-05-04 22:43:41

相關問題