这是我的代码。我收到内部服务器错误。子程序是书中的克隆。所以去吧。在我查看网站时,我无法将这些表格显示在屏幕上。你们有什么看到我做错了吗?
#!/usr/bin/perl -T
use 5.010;
use DBI; #this is for database connections.
use CGI qw/:standard/;
use CGI::Carp qw(fatalsToBrowser);
#my $driver = "mysql";
my $database = "myown";
my $hostname = "whereitis";
my $dsn = "longblabla";
my $userid = "memyselfandI";
my $password = "onlymetoknow";
my $page1 = "Tables in the database: " . $database;
my $dbh = DBI->connect( $dsn, $userid, $password ) or die $DBI::errstr;
print
header,
start_html(
-title => $page1,
-meta => {
'viewport' => 'width=device-width, initial-scale=1',
'copyright' => 'copyright 2015 Noel Villaman'
},
-style => [
{ -src => 'bootstrap.min.css' },
{ -src => 'cgicssjs/style1.css' }
]
),
h1( $page1 ),
div( table_names( $dbh->table_info() ) ),
hr,
"\n";
# Disconnect from the database.
$dbh->disconnect();
print end_html;
sub table_names {
my $names = $_[0];
### Create a new statement handle to fetch table information
my $tabsth = $names; #$dbh->table_info();
### Print the header
print "<h1>Table Name</h1>";
print "<h3>===============</h3>";
### Iterate through all the tables...
while ( my ( $qual, $owner, $name, $type, $remarks ) = $tabsth->fetchrow_array() ) {
### Tidy up NULL fields
foreach ( $qual, $owner, $name, $type, $remarks ) {
$_ = "N/A" unless defined $_;
}
### Print out the table metadata...
print "<h3>$name</h3>";
}
exit;
}
答案 0 :(得分:2)
在评论中,您说您不认为可以看到Web服务器错误日志。尝试在不访问服务器错误日志的情况下开发CGI程序是荒谬的。作为紧急事项,你应该尝试解决这个问题。
但与此同时,您可以通过在代码顶部附近添加以下内容来解决此限制。
use CGI::Carp 'fatalsToBrowser';
这会将错误日志消息复制到您的浏览器,以便您可以看到它们。但请记住在代码投入生产之前删除或注释掉该行(并不是说这段代码会以任何有意义的方式投入生产 - 我意识到它的作业)。
在您编辑代码的这一部分时,还要添加:
use strict;
use warnings;
您应该将这些行添加到您编写的每个Perl程序中,并修复它们为您提供的所有错误和警告。
那么这段代码的问题是什么?我怀疑从浏览器运行它,你会得到一个关于没有CGI标题行的错误。这是因为您exit()
子程序结束时table_names()
程序。因此,程序永远不会从调用table_names()
子例程返回,并且您的主print()
语句永远不会被执行 - 并且包括header()
。
此外,在主print()
语句中,您可以打印从table_names()
返回的值。但是table_names()
并没有返回任何内容。您需要更改table_names()
中的逻辑,以便它返回它创建的HTML而不是直接打印它。直接打印它会将它放在输出流中的错误位置。
另外一点,我不希望你在任何方面做任何事情...... CGI几乎是一项死机技术。这门课程教你十五年前有用的东西。也许你可以指着你的老师CGI::Alternatives并询问他或她是否会考虑教授与今天的网络开发方式更相关的内容。
更新:最简单的解决方法可能是拆分您的print
语句,以便按正确顺序执行操作。
# Print all the start page stuff
print
header,
start_html(
-title => $page1,
-meta => {
'viewport' => 'width=device-width, initial-scale=1',
'copyright' => 'copyright 2015 Noel Villaman'
},
-style => [
{ -src => 'bootstrap.min.css' },
{ -src => 'cgicssjs/style1.css' }
]
),
h1( $page1 );
# No need to call print here as table_names
# does its own printing
table_names( $dbh->table_info() );
# Print all the end of page stuff.
print
hr,
"\n";
您仍然需要从exit()
的末尾删除table_names
,否则程序将永远不会从该子例程返回。
此外,通过这样做,你会失去一个&lt; div&gt;围绕table_names
的输出。修复这是留给读者的练习。