【问题标题】:DBI->connect working when executed in terminal but not when executed from browserDBI->connect 在终端执行时工作,但从浏览器执行时不工作
【发布时间】:2018-05-05 11:58:51
【问题描述】:

我正在编写一个在浏览器中打印数据库查询结果的 CGI 程序。脚本是这样的

#!/usr/bin/perl

use strict;
use warnings;

use DBI;

print "Content-type: text/html\n\n";

my $driver   = "mysql";
my $database = "DBname";
my $ip       = "127.0.0.1";
my $db       = "DBI:$driver:DBNAME:$ip:database=$database";
my $username = "user";
my $password = "pass";

print "Connecting ...";

my $connection = DBI->connect($db, $username, $password)
    or print "Couldn't connect to database: " . DBI->errstr . "\n\n";

print "Successful connection\n";

my $query = $connection->prepare("SELECT id FROM table");

$query->execute() or die $DBI::errstr;

while ( my @row = $query->fetchrow_array() ) {
    my ($id) = @row;
    print "ID = $id \n";
}

$query->finish();

好吧,我的问题是当我从终端运行它时使用

perl test.cgi

它工作正常,我得到正确的打印结果。 CGI脚本位于/Library/Webserver/CGI-Executables/,默认配置/cgi-bin/在/etc/apache2/httpd.conf

如果我通过网络浏览器执行它,我只会得到第一个打印 Connecting 而没有其他任何东西,甚至没有来自 DBI->connector print。我一直试图了解错误是什么,但我无法找到有用的解决方案。

【问题讨论】:

  • @Tanktalus 不,这不是同一个错误...我使用 Mac OS High Sierra 和 Apache2 作为服务器。还是不知道是什么问题,还是谢谢你!
  • 如果那里记录了某些内容,您是否检查过错误日志?
  • Web 服务器使用的 perl 副本是否与您在命令行中使用的相同?是否有可能没有为服务器安装DBD::mysql?我建议您将use DBD::mysql 添加到文件顶部。如果驱动程序不可用,那么您的代码将立即终止,而不是等到DBI 尝试自动加载它。
  • @Borodin 来自 Apache 的 error_log 文件显示 4 个错误,都与 DBD::mysql 有关,所以我猜这是因为我的终端中有模块但没有为 Apache 配置。正如你所说,我尝试使用 DBD::mysql,但随后出现 500 Internal Server Error 并且 error_log 显示 AH01215: Can't locate DBD/mysql.pm in @INC (you may need to install the DBD::mysql module)。不知道还能尝试什么,但感谢您的帮助!

标签: mysql perl localhost cgi dbi


【解决方案1】:

从您的最终评论来看,我怀疑是:服务器使用的 perl 根本没有安装 DBD::mysql,而您的命令行 perl 有

只需将驱动模块安装在服务器上,一切都会好起来的

请注意,不需要“为 Apache 配置”,只是 CGI 代码使用的 perl 副本没有该模块

顺便说一句,内容类型应该是text/plain,而不是text/html:你没有生成HTML

【讨论】:

  • 好的,谢谢您的回答,我现在就试试!最后一件事是,如何在 Perl 中安装驱动程序? (这是一个大学项目,我从未使用过 Perl,所以我认为用新模块更新我的 Perl 版本很容易,但请原谅我的误解......)谢谢!!!
  • 我不知道。正如我所说,您似乎在命令行和服务器上运行不同的 perl 实例。您需要到达一个默认为后者的地方,并发出cpan DBD::mysql,但我不知道这是否可能,因为我不了解您的系统结构。
猜你喜欢
  • 1970-01-01
  • 2013-02-20
  • 2012-11-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-06-12
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多