【问题标题】:Unable to connect to mysql using perl DBI module无法使用 perl DBI 模块连接到 mysql
【发布时间】:2017-10-26 19:24:17
【问题描述】:

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

【问题讨论】:

  • 您是说,当您运行它时,它只是挂起,您必须按 Ctrl-C 才能恢复提示?
  • 对不起,我没有从命令行运行它。我将它保存在我的虚拟主机帐户的 cgi-bin 文件夹中。当我运行脚本时,空白屏幕在浏览器中。
  • 另外,这可能是一个愚蠢的问题,但我只是想确保...我有很多将 mysql 与 php 结合使用的经验,但我是 perl 新手。如果我使用 php 脚本连接到数据库,用户名和密码字段与我将使用的用户名和密码相同吗?
  • 您没有指定主机。 my $dbh = DBI->connect("dbi:mysql:database=$database;host=$DBhost;port=$port",$username,$password, 其中$DBhost 可能是远程的或localhost

标签: mysql perl dbi


【解决方案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();

【讨论】:

    【解决方案2】:

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

    对不起,我没有从命令行运行它。我将它保存在我的虚拟主机帐户的 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.pm 来做 - 一个简单的 print "Content-type: text/plain\n\n" 在任何其他输出都可以完成工作之前。
    • @ChrisTurner 好吧,学究式地,如果它是一个类 Unix 服务器,\n\n 将发送不正确的行尾字符。确保跨所有服务器平台的唯一方法是使用\015\012\015\012。隐藏这样晦涩难懂的东西肯定是我们使用模块的原因:-)
    • @DaveCross 从来没有遇到过这个问题(Apache 非常聪明),但这是一个公平的观点。使用像 CGI 这样重的东西来打印标题似乎还是有点过分了
    • @ChrisTurner:嗯,当然,Postel's Law 意味着它不应该是一个问题。但这也表明我们应该尽一切努力做正确的事:-)
    猜你喜欢
    • 1970-01-01
    • 2011-03-26
    • 2019-06-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-15
    相关资源
    最近更新 更多