【问题标题】:Perl dancer error execute method undefinedPerl dancer错误执行方法未定义
【发布时间】:2018-06-25 19:23:58
【问题描述】:

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

【问题讨论】:

  • $sth->execute()中使用之前,请仔细检查$sth的内容(从错误信息来看,是undef
  • 您应该检查您的数据库连接是否仍然打开。显然,数据库插件有一些钩子可以使用。 https://metacpan.org/pod/distribution/Dancer-Plugin-Database/lib/Dancer/Plugin/Database.pm#HOOKS

标签: sqlite perl dancer


【解决方案1】:

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

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

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

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

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 2015-02-22
      • 1970-01-01
      • 2018-12-11
      • 2014-09-11
      • 1970-01-01
      • 1970-01-01
      • 2012-08-24
      • 1970-01-01
      相关资源
      最近更新 更多