Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
我能';t将html格式的表格内容保存到文本文件中。使用CGI和PERL_Html_Perl_Cgi_Text Files - Fatal编程技术网

我能';t将html格式的表格内容保存到文本文件中。使用CGI和PERL

我能';t将html格式的表格内容保存到文本文件中。使用CGI和PERL,html,perl,cgi,text-files,Html,Perl,Cgi,Text Files,你好,我的朋友们 我在javascript和html方面也是相当新的,所以这个项目花费的时间比我可能需要的要长得多。 问题是,我想将表的内容保存到文本文件中 这是表格中的代码 print start_form(-action=>"",-onSubmit=>"return false;"); print table({-border=>1,-cellpadding=>3,-name=>"tabla",-id=>"tab"}, th(["Matricula

你好,我的朋友们 我在javascript和html方面也是相当新的,所以这个项目花费的时间比我可能需要的要长得多。 问题是,我想将表的内容保存到文本文件中

这是表格中的代码

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”是字段中单个文本字段的名称,该名称在创建单元格时给出。 你可能会注意到,我只是想保存一个单元格作为测试,问题是,它不起作用。它救不了任何东西。但如果我这样做: 打印FT参数(“celda60”)“测试”; 它保存在我的文件中的唯一内容是testestest,所以问题一定是param('celda60') 如果你想知道“salvar()”是这样的

   function salvar(){

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

   var rowCount2 = table2.rows.length - 1;
   document.getElementById('hid').value=rowCount2; }
它所做的唯一一件事就是获取行的数量,这样当我开始保存时,我可以通过做几个循环来保存每个单元格中每个文本字段中的内容


你知道我做错了什么吗?我的意思是,除了许多基本的东西之外,我猜。

客户端对HTML文档的修改不会通过CGI自动反映到服务器端程序的状态。您需要一个额外的机制,例如AJAX。

您需要在1998年之后的某个时候阅读一本编写良好的Perl和CGI教程

我推荐。这是一部古老的经典,但它写得很好,不鼓励不良做法

至少有一个地方我可以在CGI参数中使用shell转义来运行任意命令。这就是为什么像污染用户数据和3参数打开命令这样的做法是标准做法,并且已经存在多年了

一般忠告:

  • 确保您使用的是
    严格
    警告
  • 使用带词法句柄的3参数
    open
    ,或者只使用IO::File<代码>打开我的$fh,“>>”,$pathtofile或“哎哟!”
  • 您不必在Perl中使用CGI模块来进行CGI。这是处理参数解析和HTML构建的一种方便方法。有很多选择
  • print
    可以处理参数列表。代码中不需要有50条打印语句
  • 在代码中添加空白。将内容隔开使其更具可读性
  • 关于最后几点,这里有一个例子:

    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并将其传回。我喜欢将副作用(如打印内容)紧密地分组。

    也许您的问题过于复杂,这样您就可以让用户在表单中输入值列表,然后将这些值保存到服务器上的数据文件中

    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();
    }
    

    服务器日志有什么说明吗?此外,您应该使用open的三个arg版本,如“open FT,>>”、param('escondido2')或die$!;“您当前的版本使您面临shell注入攻击。使用“>>”而不是“+>>”,因为你没有从文件中读取。谢谢你的建议,不是吗?我一点也不担心安全性,但很高兴知道这一点。我使用了+>>,因为我只是从同一个项目中的另一个文件中复制了它,而忘记了“+”它不是必需的谢谢你的回答,我会研究它。我唯一的疑问是,我能用AJAX修改一个文件吗?我很感激你对我的坏习惯的关注,我已经知道了一些关于这些坏习惯的事情,但我决定暂时忽略它们,因为这是一个不在web服务器上运行的项目,并且不被认为在我自己的计算机之外的任何地方使用。我将研究3参数open命令,我对此一无所知。不管怎样,你有什么办法解决我保存表格内容的问题吗?我正在读关于AJAX的书,但我想我最终会做一个非常愚蠢的解决方案,比如使用隐藏的文本区域或类似的东西。@Jmex,看起来你对CGI环境中的事情是如何发生的感到困惑。用户请求一个页面,该页面作为静态文档构建在服务器上。用户与静态文档交互。AJAX和相关技术将这一点混合起来。@Jmex,在AJAX情况下,您将有一组服务器端代码来生成基本页面,另一组用于处理AJAX请求。您的基本页面将包含一些Javascript,这些Javascript将表数据作为一个JSON数据块发送到您的服务器。然后,服务器会将表数据保存到文件中或执行任何需要执行的操作。在尝试使用AJAX之前,您确实需要很好地掌握信息流的基本结构。