1

我正在尝试以表格格式在网页上打印数据库表的所有值。我正在使用具有 .cgi 扩展名的 perl 文件。每当我尝试运行代码时,我都会收到错误“全局符号需要显式包名称”。数据库表的行应该显示 onLoad 但它没有发生..

我已经尝试了很多,但无法理解代码有什么问题..

请帮忙..

people.cgi 文件的代码..

#!/usr/bin/perl
use CGI;
use DBI;
use strict;
use warnings;
print "Content-type:text/html\r\n\r\n";
#$q = CGI->new;
#print  $q->header;
my $dsn = "DBI:mysql:Demo:localhost";   # Data source name
my $username = "mint";                  # User name
my $password = "MINT123";               # Password
my $dbh;
my $sth;                                # Database and statement handles
$dbh = DBI->connect($dsn, $username, $password);

$sth = $dbh->prepare("SELECT * from people");

$sth->execute();

print "<h1>ganesh</h1>";
print "<table >
<tr>
<th>ID</th>
<th>Name of People Involved</th>
<th>Position</th>
<th>Roles(A user can have multiple roles)</th>
<th>Notes</th>
</tr>";
while( $href = $sth->fetchrow_hashref ) {
    print "<tr>";
    print "<td>$$href{'id'}</td>";
    print "<td>$$href{'name'}</td>";
    print "<td>$$href{'pos'}</td>";
    print "<td>$$href{'role'} </td>";
    print "<td>$$href{'notes'}</td>";
    #print "<td><input type='text' value=\"$$href{'display_name'}\" id =\"dis-$$href{'windows_id'}\" readonly> </td>";
    #print "<td><input type='text' value=\"$$href{'email_id'}\" readonly> </td>";
    print "</tr>";
}
print "</table>";

$sth->finish();
$dbh->disconnect();

错误信息..

 Global symbol "$href" requires explicit package name at people.cgi line 31.
 Global symbol "$href" requires explicit package name at people.cgi line 34.
 Global symbol "$href" requires explicit package name at people.cgi line 35.
 Global symbol "$href" requires explicit package name at people.cgi line 36.
 Global symbol "$href" requires explicit package name at people.cgi line 37.
 Global symbol "$href" requires explicit package name at people.cgi line 38.
 Execution of people.cgi aborted due to compilation errors.

我的 MYSQL 表的结构..它有 14 列...里面没有数据...

在此处输入图像描述

4

2 回答 2

3

$href应该定义(通常使用my本地/词法变量),在这种特殊情况下将其范围放在 while 循环中。

while (my $href = $sth->fetchrow_hashref ) { .. }
于 2013-05-21T11:36:45.860 回答
2

每当您收到您不理解的 Perl 警告或错误时,您应该添加use diagnostics到您的代码中,Perl 将为您提供有关该问题的更多详细信息。在这种情况下,它会说:

您说过“use strict”或“use strict vars”,这表明所有变量必须是词法范围的(使用“my”或“state”),事先使用“our”声明,或者明确限定说明哪个包全局变量在(使用“::”)

更新:在下面的评论中回答进一步问题的一些补充。

如果该列可以包含 NULL,并且您将要打印这些列,那么您将收到“未定义值”警告,除非您对此进行处理。

最简单的解决方法可能是在获得哈希后立即清理它。我会在循环块的顶部使用类似这样的东西用空字符串替换未定义的值:

$href->{$_} // '' for keys %$href;

我还注意到您使用的是丑陋的$$hash_ref{key}语法。不知道你是从哪里捡来的,但人们普遍认为它$hash_ref->{key}看起来更干净。

于 2013-05-21T12:42:44.633 回答