我试图使用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 '/';
};
答案 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语句。