我正在尝试以表格格式在网页上打印数据库表的所有值。我正在使用扩展名为.cgi的perl文件。每当我尝试运行代码时,我都会收到错误“全局符号需要显式包名称“。数据库表的行应该显示在载荷上,但它没有发生..
我已经尝试了很多,但无法理解代码的错误。
请帮助..
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个颜色......里面没有数据...
答案 0 :(得分:3)
$href
(对于本地/词法变量,通常使用my
),在这种特殊情况下将其范围置于while循环中。
while (my $href = $sth->fetchrow_hashref ) { .. }
答案 1 :(得分:2)
每当您收到您不理解的Perl警告或错误时,您应该在代码中添加use diagnostics
,Perl会为您提供有关该问题的更多详细信息。在这种情况下,它会说:
你说“使用严格”或“使用严格的变量”,这表明 所有变量必须是词法范围的(使用“my”或“state”), 事先用“我们的”声明,或明确说明哪个 包全局变量在(使用“::”)
更新:在下面的评论中回答更进一步的问题。
如果列可以包含NULL,并且您打算打印这些列,那么除非您对此进行操作,否则您将收到“未定义值”警告。
最简单的修复方法可能是在获得哈希后立即清理哈希。我会在循环块的顶部用空字符串替换未定义的值:
$href->{$_} // '' for keys %$href;
我还注意到你正在使用丑陋的$$hash_ref{key}
语法。不知道你选择了哪一个,但人们普遍认为$hash_ref->{key}
看起来更干净。