为什么我不能在Perl CGI脚本中使用DBI连接到数据库?

时间:2017-05-11 12:49:39

标签: perl cgi dbi

我正在尝试将CGI与DBI集成。 我从cgi中获取结果并将其添加到DBI中。 但是cgi脚本无法连接到DBI。 脚本如下所述。 该脚本无法与DBI连接,因为它在连接阶段失败。

use CGI qw/:standard/;
use Apache::DBI;
use DBI ;
    my $driver = "mysql"; 
           my $database = "testdb";
           my $dsn = "DBI:mysql:testdb";
           my $userid = "testuser";
           my $password = "test123";

    print
           header,
           start_html('Simple Script'),
           h1('Simple Script'),
           start_form,
           "What's your First name? ",textfield('First name'),p,
           "What's your Last name? ",textfield('Last name'),p,
           "What's your Age? ",textfield('Age'),p,
           "What's your Income? ",textfield('Income'),p,
            popup_menu(-name=>'Sex',
              -values=>['Male','Female']),p,
           submit,
           end_form,
           hr,"\n";
           if (param) {
           my $FIRST_NAME=em(param('First name')) ;
           my $LAST_NAME=em(param('Last name')) ;
           my $AGE=em(param('Age')) ;
           my $INCOME=em(param('Income')) ;
           my $SEX =em(param('Sex')) ;

           print 
           $FIRST_NAME ,p,     
           $LAST_NAME,p, 
           $SEX,p, 
           $AGE,p, 
           $dsn,p
           $INCOME ;    



            my $dbh = DBI->connect($dsn,"root","" ) or die "Can't connect: ",$DBI::errstr;

           my $stmt ;
           my $sql = "INSERT INTO TEST_TABLE (FIRST_NAME, LAST_NAME, SEX, AGE, INCOME ) values (?,?, ?, ?, ?)";

           my   $stmt = $dbh->prepare($sql);    
           $stmt->execute($FIRST_NAME,$LAST_NAME, $SEX, $AGE, $INCOME) or die $DBI::errstr;

           }       
           print end_html;

1 个答案:

答案 0 :(得分:2)

这里没有足够的信息给你答案。特别是,如果我们不知道错误是什么,我们就无法解决问题所在。你说没有错误信息。这是不太可能的,因为如果连接失败,您的代码将显式消失并显示错误消息。这给我们留下了两种可能性:

  • 您的程序已成功连接
  • 有一条错误消息,但您还没有看到它。

让我们假设它是第二种选择。也许您没有意识到CGI程序故意不向浏览器发送错误消息(这是一个安全功能,您不应该尝试更改它),并且您需要查看Web服务器错误日志。 / p>

您可以通过以下三种方式查看错误消息。

  • 查看错误日志。不,我们不知道错误日志在哪里。这取决于您的服务器的配置。如果我们知道您正在使用哪种环境,那么我们可以猜测。但事实上,你需要问一个知道如何配置服务器的人。
  • 在命令行上运行程序。是的,我知道这是一个CGI计划。但通过在命令行上运行它们来调试程序通常最容易。您需要传入一个参数,因为它会触发连接到数据库的程序。然后,如果出现错误,它将被写入STDERR(这是您的控制台)。
  • use CGI::Carp 'fatalsToBrowser';添加到您的代码中。还记得上面我说过你不应该改变CGI错误没有写入浏览器的事实吗?好吧,这就是你如何覆盖它。这是一个可怕的想法,我真的不推荐它(主要是因为你应该在将代码投入生产之前将其删除 - 并且每个人都会忘记这一点,并在他们的Web服务器中留下一个巨大的安全漏洞!)但它可以工作在极端情况下,您实际上无法找到错误日志的位置,并且您不知道如何使用命令行。

因此,其中一种方法会告诉您错误是什么。如果你编辑你的问题以添加重要的细节,那么我相信这里的某个人将能够帮助你解决问题。

其他一些提示:

  • Apache :: DBI在这里没有任何用处。只需删除它。
  • 学习格式化代码。
  • 自上个世纪以来,HTML生成函数被认为是一个糟糕的主意,现在它们已被弃用。请不要使用它们。请改用模板系统。
  • HTML中的<p>元素是容器,而不是分隔符。
  • 请阅读CGI::Alternatives,了解21世纪在Perl中编写Web应用程序的方法。