Perl舞者错误执行方法未定义

时间:2018-06-25 19:23:59

标签: sqlite perl dancer

我试图使用Perl舞者制作一个网站,下面是我的代码。看来是正确的,但是页面会继续加载,并且永远不会在数据库中输入值。取消页面时,出现错误,提示“ request to POST /appform crashed: Can't call method "execute" on an undefined value”。我无法弄清楚代码中有什么问题。如果您还有其他代码,请提及。 我正在使用SQLite的数据库。 有一个数据库campus.db,我正在将值插入student表中。

post '/appform' => sub {

        my $q = CGI ->new;
        my $name = $q->param ("firstname");
        my $password = $q->param("password");
        my $mobile_no = $q->param("mobile");
        my $gender = $q->param("gender");
        my $email = $q->param("email");
        my $address = $q->param("address");
        my $sslc = $q->param("SSLC");
        my $hsc = $q->param("HSC");
        my $cgpa = $q->param("cgpa");
        my $languages = $q->param("lang");
        my $internships = $q->param("intern");
        my $preferred_loc = $q->param("country");
        my $sql = "insert into student(name,mobile_no,gender,email,address,sslc,hsc,cgpa,languages,internships,preferred_loc,password,applied_job,company_applied) values ('?','?','?','?','?','?','?','?','?','?','?','?','?','?');";
        my $sth = database->prepare($sql); 
        $sth->execute($name,$mobile_no,$gender,$email,$address,$sslc,$hsc,$cgpa,$languages,$internships,$preferred_loc,$password) or die $sth->errstr;
        #$sth->execute();   
        $sth-> finish;
        set_flash('New entry posted!');
            redirect '/';
    };

2 个答案:

答案 0 :(得分:1)

您正在使用database关键字来获取数据库句柄。我猜想这是由Dancer2::Plugin::Database引起的(如果您可以在问题中加入这样的信息,将会很有用。)

该错误表明您正在使用未定义的值调用execute()。您正在变量execute()上调用$sth。因此$sth是未定义的。通过在$sth返回的数据库句柄上调用prepare()来获得database()。因此,看来prepare()调用失败了。您应该检查该调用的返回值,如果失败则抛出错误。

prepare()失败的最常见原因是您正在尝试编译包含错误的SQL语句。我在您的SQL中看不到任何明显的错误,但是值得通过在您的数据库上手动运行它来进行检查。

我看到您在SQL语句中使用绑定参数。这是个好主意,但是请注意,您不需要在SQL中引用问号-数据库驱动程序将为您处理。我不认为这是造成您问题的原因。

我还看到您在Dancer应用程序中使用CGI.pm来获取请求参数。老实说,我对此感到有些惊讶-但这是一个糟糕的主意。舞者有其自己的关键字,它将为您提供此信息。在Dancer documentation中查看query_parameters()body_parameters()route_parameters()

答案 1 :(得分:1)

除了已经指出的要点之外,您的DBI prepare()调用可能还失败了(添加错误检查以查看原因,例如my $sth = database->prepare('...') or die "DB error: " . database->errstr),并且您正在Dancer应用程序中使用CGI.pm。 (...不要这样做,我很惊讶它完全可以正常工作-请查看Dancer文档以了解如何访问应用程序发送的参数),还请查看{{ 1}}由Dancer :: Plugin :: Database / Dancer2 :: Plugin :: Database提供的便捷方法,因此您根本不必编写该SQL INSERT语句。