我只想从我的数据库中打印表名

时间:2015-07-25 06:32:27

标签: mysql perl

这是我的代码。我收到内部服务器错误。子程序是书中的克隆。所以去吧。在我查看网站时,我无法将这些表格显示在屏幕上。你们有什么看到我做错了吗?

#!/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;
}

1 个答案:

答案 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的输出。修复这是留给读者的练习。