【问题标题】:Using Template::Toolkit with array data from database将 Template::Toolkit 与数据库中的数组数据一起使用
【发布时间】:2019-02-20 15:41:35
【问题描述】:

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

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)

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

【问题讨论】:

  • 为什么不使用这些变量就分配( $variable1, $variable2, $variable3 ) = @$names

标签: mysql perl


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

    这很奇怪:

    { 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 %]
    

    更新:你说:

    当我运行时,我得到了那个错误。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-12-26
      • 2014-12-18
      • 1970-01-01
      • 1970-01-01
      • 2016-11-13
      • 2013-10-22
      • 1970-01-01
      • 2011-05-14
      相关资源
      最近更新 更多