2011-05-19 69 views
0

你好我的朋友 我是相當新的JavaScript和HTML,所以這個項目需要比我可能需要更長的時間。 這是問題所在,我想將表格的內容保存到文本文件中。我無法將HTML表格的內容保存到文本文件中。使用CGI和PERL

這裏是形式

print start_form(-action=>"",-onSubmit=>"return false;"); 
print table({-border=>1,-cellpadding=>3,-name=>"tabla",-id=>"tab"}, 
    th(["Matricula","Nombre","Apellido Paterno","Apellido   Materno","Sexo","Edad","Carrera","Email", 
    "Materias","Promedio","Borrar"])); 
print submit(-label=>'Guardar',-onClick=>'salvar();',-onSubmit=>"salvar(); return false;"); 
print hidden(-name=>'escondido',-id=>'hid', 
      -default=>['0']); 
print hidden(-name=>'escondido2',-id=>'hid2', 
      -default=>['nadiemeve2']); 
print end_form; 

行添加到它讀取使用JavaScript文件表中的代碼,所以當我想要顯示的表中的內容保存到一個文本文件,我做此:

if (param) { 
open FT, "+>>".param('escondido2') or die "No se puede abrir el archivo"; 
print FT param('celda60'); 
close FT; 
} 

在這裏,「celda60」是一個字段內的文本字段單的名稱,因爲在創建單元的名稱中給出。你可能注意到,我只是試圖保存一個單元格作爲測試,事情是,它不起作用。它並不拯救一件事。但如果我這樣做: print FT param('celda60')。「TEST」; 它在我的文件中保存的唯一的事情就是TESTESTESTEST,所以問題肯定在參數(「celda60」) 如果你想知道「salvar()」看起來像這樣

function salvar(){ 

    var table2 = document.getElementById('tab'); 

    var rowCount2 = table2.rows.length - 1; 
    document.getElementById('hid').value=rowCount2; } 

它的唯一的事情就是獲取行數,所以當我進行保存時,我可以通過執行幾個循環來保存每個單元格的每個文本字段內的內容。

任何想法,我在做什麼錯在這裏?我的意思是,除了很多基本的東西,我猜。

+0

服務器日誌說什麼嗎?另外,你應該使用open-arg版本,例如「open FT」,「>>」,param('escondido2')或者死亡$ !;「你目前的版本讓你遭受shell注入攻擊。並且使用'>>'而不是'+ >>',因爲無論如何您都不是從文件中讀取數據。 – DavidO 2011-05-19 08:40:28

+0

感謝您的建議,對不是我不擔心安全問題,但這很好。我使用了+ >>,因爲我只是從同一個項目中的另一個文件中複製它,並忘記了'+'這是沒有必要的 – Jmex 2011-05-19 13:48:32

回答

3

HTML文檔的客戶端修改是而不是通過CGI自動反映到服務器端程序的狀態。您需要額外的機制,例如AJAX。

+0

感謝您的回答,我會研究它。我唯一的疑問是,我將能夠使用AJAX修改文件嗎? – Jmex 2011-05-19 14:07:24

2

你需要閱讀寫得很好 Perl和CGI教程後,1998年的某個時候

我建議Ovid's CGI Course。這是一個古老的經典,但它寫得很好,不鼓勵壞習慣。

您至少有一個地方可以在我的CGI參數中使用shell轉義運行任意命令。這就是爲什麼諸如污染用戶數據和三個參數打開命令等做法是標準做法並且已經有很多年了。

一般建議:

  1. 確保您使用的strictwarnings
  2. 使用3個參數open與詞法句柄,或者只是使用IO :: File。 open my $fh, '>>', $pathtofile or die "Ouch $!";
  3. 您不必在Perl中使用CGI模塊來執行CGI。這是處理參數解析和HTML構建的一種便捷方式。有很多選擇。
  4. print可以處理參數列表。您的代碼中不需要有50個打印語句。
  5. 將空白添加到您的代碼。將事物分開使其更具可讀性。

在這裏的最後幾個點是一個例子:

sub print_form { 

    print 

     start_form(-action=>"", -onSubmit=>"return false;"), 

     table({-border=>1,-cellpadding=>3,-name=>"tabla",-id=>"tab"}, 
       th([ "Matricula",  "Nombre", 
        "Apellido Paterno", "Apellido Materno", 
        "Sexo",    "Edad", 
        "Carrera",   "Email", 
        "Materias",   "Promedio", 
        "Borrar", 
       ]) 
     ), 

     submit(-label => 'Guardar', 
       -onClick => 'salvar();', 
       -onSubmit => 'salvar(); return false;', 
     ), 

     hidden(-name=>'escondido', -id=>'hid', -default=>['0']), 
     hidden(-name=>'escondido2', -id=>'hid2', -default=>['nadiemeve2']), 

     end_form(); 
} 

雖然,在我的代碼我會做HTML和其傳回。我喜歡保持副作用,如印刷出來,緊密分組。

+0

我非常感謝您對我的不良做法的關注,我已經瞭解了一些關於這些方面的內容,但現在我決定忽略它們,因爲這是一個不在網絡服務器上運行的項目,並且不會在我的外部使用自己的電腦。 我會看看3參數打開命令,我不知道這件事。無論如何,你有任何解決我的問題,保存表的內容?我正在閱讀AJAX,但我想我最終會做出一個非常愚蠢的解決方案,比如使用隱藏的textarea或類似的東西。 – Jmex 2011-05-19 17:24:02

+1

@Jmex,看起來你對CGI環境下的事情感到困惑。用戶請求一個頁面,該頁面作爲靜態文檔在服務器上構建。用戶與靜態文檔進行交互。 AJAX和相關技術混合了一下。 – daotoad 2011-05-19 20:42:19

+1

@Jmex,在AJAX的情況下,你需要一組服務器端代碼來生成基本頁面,另一組代碼來處理AJAX請求。您的基本頁面將包含一些將表格數據作爲一組JSON數據發送到您的服務器的Javascript。您的服務器然後將表格數據保存到一個文件或做任何需要做的事情。在嘗試獲得AJAX的工作之前,你需要很好地掌握信息流的基本結構。 – daotoad 2011-05-19 20:46:40

2

也許你正在過分複雜的問題,這樣的事情將允許你有一個用戶輸入一個表單值的列表,然後將這些值保存到服務器上的數據文件。

use strict; 
use warnings; 
use CGI; 
use IO::File; 

my @FIELDS = qw(
     matricula  nombre 
     apellido_paterno apellido_materno 
     sexo    edad 
     carrera   email 
     materias   promedio 
     borrar 
); 

i f(param('gotstuff')) { 


    my $fh = IO::File->open('datafile.txt', '>>'); 

    my @data = param(@FIELDS); 

    $fh->print join ',', @data; 

    # Print a thank you for your data page here. 

} 
else { 

    # Do your other junk here, start some html, etc 
    # print the form and so on. 

    print_form(); 

    # Print the rest of your HTML here. 
} 

sub print_form { 

    my @fields = qw(
     matricula  nombre 
     apellido_paterno apellido_materno 
     sexo    edad 
     carrera   email 
     materias   promedio 
     borrar 
    ); 
    my @headings = map {my $w = $_; $w=~/_/ /g; uc_first $w } @fields; 



    print 

     start_form(-action => script_name(), -method => 'POST'), 

     table({-border=>1,-cellpadding=>3,-name=>"tabla",-id=>"tab"}, 
      Tr([ 
       th(\@headings), 
       td([ map textfield($_), @fields ]), 
      ]), 
     ), 

     submit(-label => 'Guardar', 
       -onClick => 'salvar();', 
       -onSubmit => 'salvar(); return false;', 
     ), 
     hidden('gotstuff', 'gotstuff'), 
     end_form(); 
} 
相關問題