Perl dancer 错误执行方法未定义



我试图使用perl dancer制作一个网站,下面是我的代码。这似乎是正确的,但页面不断加载并且从未在数据库中输入值。当我取消页面时,我收到一个错误,指出"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::P lugin::D atabase(如果你能在你的问题中包含这样的信息,那会很有用(。

该错误指出您正在对未定义的值调用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(,并且您正在使用 Dancer 应用程序中 CGI.pm(...不要这样做,我很惊讶它会起作用 - 查看 Dancer 文档了解如何访问您的应用程序发送的参数(,还可以查看 Dancer::P lugin::D atabase/Dancer2::P lugin::D atabase 提供的quick_insert方便的方法,这样您就不必编写该 SQL INSERT 语句。

最新更新