使用Template :: Toolkit处理数据库中的数组数据

时间:2018-09-16 15:11:22

标签: mysql perl

当我在脚本中声明数组时,我不知道为什么我的脚本可以工作,但是当我尝试从数据库中获取数组数据时,我的脚本却无法工作。

Perl

use Template;

my $template = Template->new;

if ( $info ) {

    my $select = $DBH->prepare("SELECT FOO, BAR, MOO FROM tble WHERE CONCAT(FOO, ', ', BAR, ', ', MOO) LIKE ?");
    $select->execute('%' . $info . '%');
    $names = $select->fetchall_arrayref();
    foreach $names ( @$names ) {
        ( $variable1, $variable2, $variable3 ) = @$names;
    }
}

my $templ = <<START_HTML;
<!DOCTYPE html">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1
+" />
<title>Untitled Document</title>
</head>

<body>

[% FOREACH name IN list %]
    <li>
      <div class='inforno'>
        <img src='inforno'>
      </div>
      <div class='inforno'>
        <a href='#' class='inforno'>[% name %]</a>
      </div>
      <span class='inforno'>
        <a href='#' class='inforno'>Edit user</a>
      </span>
    </li>
    [% END %]

</body>
    </html>
    START_HTML

$template->process(\$templ, { list => \@$names })
        or die $template->error;

输出

    ARRAY(0x2030674)
    ARRAY(0x2030634)
    ARRAY(0x2030618)

当我跑步时,我得到那个错误。我想从数据库中获取数组数据。

2 个答案:

答案 0 :(得分:2)

fetchall_arrayref返回对数组的引用,该数组对查询返回的每一行都有一个元素。这些元素是对每列有一个元素的数组的引用。

您缺少循环返回的行的代码。

答案 1 :(得分:1)

这很奇怪:

{ list => \@$names }

$names是对数组的引用。您将其引用(@$names),然后再引用另一个引用的数组(\@$names)。您可以通过以下方式获得完全相同的结果:

{ list => $names }

但是,这些都不能解决您的问题。您正在调用fetchall_arrayref()并返回一个数组引用,其中该数组的每个元素都是对另一个数组的引用。实际上,它是一个二维数组。外部数组用于数据库查询返回的行,内部数组用于每一行中的各个字段。

当您看到类似ARRAY(0x2030674)的值时,您应该意识到您正在显示数组引用,并且还需要再进行一级解引用。

您的模板代码需要看起来像这样:

[% FOREACH row IN LIST -%]
<p>Start of new record:</p>
<ul>
[%   FOREACH field IN row -%]
  <li>[% field %]</li>
[%   END -%]
</ul>
[% END %]

更新:您说:

  

我跑步时遇到错误。

但是那里没有错误。这甚至不是警告。只是您不太了解的数据:-)