繁体   English   中英

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

[英]Perl dancer error execute method undefined

我试图使用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 '/';
    };

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

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

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM