无法使用perl DBI模块连接到mysql

时间:2017-05-26 01:59:22

标签: mysql perl dbi

您好我正在尝试使用以下perl脚本连接到mysql数据库:

 #!/usr/bin/perl -w
 use strict;
 use DBI;
 my $dbh = DBI->connect(          
     "dbi:mysql:dbname=MYDATABASENAME", 
     "MYUSERNAME",                          
     "MYPASSWORD",                          
     { RaiseError => 1 },         
 ) or die $DBI::errstr;

 my $sth = $dbh->prepare( "SELECT * FROM classes" );  
 $sth->execute();

 my ($class_id, $class_name, $class_number) = $sth->fetchrow();
 print "$class_id $class_name $class_number\n";

 my $fields = $sth->{NUM_OF_FIELDS};
 print "We have selected $fields field(s)\n";

 my $rows = $sth->rows();
 print "We have selected $rows row(s)\n";

 $sth->finish();
 $dbh->disconnect();

现在我只是得到一个空白的屏幕,我无法弄清楚为什么我至少没有收到错误消息。我花了20多个小时试图解决这个问题,这就是为什么我希望有人能看到我做错了什么。提前谢谢。

2 个答案:

答案 0 :(得分:2)

在评论中,您添加了原始问题中应该存在的有用信息。

  

抱歉,我没有从命令行运行它。我把它保存在我的网络托管帐户的cgi-bin文件夹中。运行脚本时,空白屏幕在浏览器中。

由于您没有返回内容类型标题,因此该程序无法作为CGI程序运行。尝试将这两行添加到程序的顶部。

html

您还应该找到Web服务器错误日志所在的位置,并检查是否存在错误。它是一项安全功能,CGI程序不会将错误发送到浏览器(尽管我希望看到一些迹象表明存在问题)。

还值得指出的是use CGI 'header'; print header('text/plain'); 编译指示在5.6版本(2000年发布)中被添加到Perl中,并且大多数程序员在shebang行上使用它来代替use warnings

我还建议在编写CGI版本之前,经常(可能总是)将新的Perl模块作为命令行程序进行测试。当你学习新东西时,CGI只会增加额外的,不必要的复杂程度。

答案 1 :(得分:1)

这应该有效。如果您在本地运行脚本,port是可选的。

 use strict;
 use warnings;
 use DBI;

 my $database   = 'name_of_database';
 my $DBhost     = 'localhost';
 my $port       = 'portnumber';
 my $username   = 'user123';
 my $password   = 'password123';

 my $dbh = DBI->connect("dbi:mysql:database=$database;host=$DBhost;port=$port",$username,$password,                          
     {  RaiseError       => 1,
        PrintError       => 0,
        AutoCommit       => 1,
        FetchHashKeyName => 'NAME_lc'}, ) or die $DBI::errstr;

 my $sth = $dbh->prepare( "SELECT * FROM classes" );  
    $sth->execute();

 my ($class_id, $class_name, $class_number) = $sth->fetchrow();
    print "$class_id $class_name $class_number\n";

 my $fields = $sth->{NUM_OF_FIELDS};
    print "We have selected $fields field(s)\n";

 my $rows = $sth->rows();
    print "We have selected $rows row(s)\n";

    $sth->finish();
    $dbh->disconnect();