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

无法使用perl DBI模块连接到mysql,mysql,perl,dbi,Mysql,Perl,Dbi,您好,我正在尝试使用以下perl脚本连接到mysql数据库: #!/usr/bin/perl -w use strict; use DBI; my $dbh = DBI->connect( "dbi:mysql:dbname=MYDATABASENAME", "MYUSERNAME", "MYPASSWORD", {

您好,我正在尝试使用以下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多个小时试图弄明白这一点,这就是为什么我希望有人能看到我做错了什么。提前谢谢。

这应该行得通。如果在本地运行脚本,
端口是可选的

 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();

这应该行得通。如果在本地运行脚本,
端口是可选的

 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();

在评论中,您添加了这些本应包含在原始问题中的有用信息


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

此程序不会作为CGI程序工作,因为您不会返回内容类型标题。尝试将这两行添加到程序顶部

use CGI 'header';
print header('text/plain');
您还应该找出web服务器错误日志所在的位置,并检查是否存在错误。这是一个安全特性,CGI程序不会将错误发送到浏览器(尽管我希望看到有问题的迹象)

还值得指出的是,
use warnings
pragma是在5.6版(2000年发布)的Perl中添加的,大多数程序员使用它来代替shebang行中的
-w


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

在评论中,你添加了这些本应出现在原始问题中的有用信息


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

此程序不会作为CGI程序工作,因为您不会返回内容类型标题。尝试将这两行添加到程序顶部

use CGI 'header';
print header('text/plain');
您还应该找出web服务器错误日志所在的位置,并检查是否存在错误。这是一个安全特性,CGI程序不会将错误发送到浏览器(尽管我希望看到有问题的迹象)

还值得指出的是,
use warnings
pragma是在5.6版(2000年发布)的Perl中添加的,大多数程序员使用它来代替shebang行中的
-w



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

你是说,当你运行它时,它只是挂起,你必须按Ctrl-C键才能返回提示?很抱歉,我不是从命令行运行它。我把它保存在我的网络托管帐户的cgi bin文件夹中。当我运行脚本时,空白屏幕在浏览器中。而且,这可能是一个愚蠢的问题,但我只是想确定……我有很多使用MySQL与PHP结合的经验,但是我对Perl是新的。用户名和密码字段与使用php脚本连接数据库时使用的用户名和密码相同,对吗?您不指定主机<代码>我的$dbh=DBI->connect(“DBI:mysql:database=$database;host=$DBhost;port=$port”“代码> $$dBuths/CODE >可能是远程的或<代码>本地主机您是说,当您运行它时,它只是挂起,您必须用CTRL C来获取提示吗?抱歉,我没有从命令行运行它。我把它保存在我的Web托管帐户中的CGI bin文件夹中。取消脚本。此外,这可能是一个愚蠢的问题,但我只是想确保…我有很多将mysql与php结合使用的经验,但我对perl是新手。用户名和密码字段与我使用php脚本连接数据库时使用的用户名和密码相同,对吗?您不指定主机。
my$dbh=DBI->connect(“dbi:mysql:database=$database;host=$DBhost;port=$port”、$username、$password,
其中,
$DBhost
可能是远程的或
localhost
嗯,你的眼光很好,从来没有看到过那条评论。upvote。甚至不需要用CGI.pm做它-一个简单的
打印“内容类型:text/plain\n\n”
在任何其他输出完成此工作之前。@ChrisTurner很好,学究式地说,如果它是一个类似Unix的服务器,
\n\n
将发送不正确的行尾字符。确保跨所有服务器平台的唯一方法是使用
\015\012\015\012
。隐藏不清楚的东西肯定是我们使用模块的原因:-)@DaveCross从来没有遇到过这个问题(Apache是超级智能的),但这是一个公平的观点。使用CGI这样沉重的东西来打印页眉似乎还是有点过头了tho@ChrisTurner:嗯,当然,这意味着这不应该是一个问题。但它也建议我们应该尽一切努力做正确的事情:-)嗯,你的眼光很好,我从来没有看到过这样的评论。upvote。甚至不需要使用CGI.pm进行此操作-在任何其他输出之前,只需简单的
打印“内容类型:text/plain\n\n”
。@ChrisTurner嗯,学究地说,如果它是类Unix服务器,
\n\n
将发送不正确的行尾字符。确保跨所有服务器平台的唯一方法是使用
\015\012\015\012
。隐藏像这样晦涩难懂的东西肯定是我们使用模块的原因:-@DaveCross从来没有这个问题(Apache是超级智能的),但这是一个公平的观点。使用像CGI这样重的东西来打印页眉似乎还是有点过头了tho@ChrisTurner:当然,这意味着这不应该是个问题。但它也表明,我们应该尽一切努力消除贫困