Использование Template :: Toolkit с массивом данных из базы данных - PullRequest
0 голосов
/ 16 сентября 2018

Я не знаю, почему мой скрипт работает, когда я объявляю массивы в моем скрипте, но не работает, когда я пытаюсь получить данные массива из базы данных.

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;

output

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

Когда я запускаю, я получаю эту ошибку.Я хочу получить данные массива из базы данных.

Ответы [ 2 ]

0 голосов
/ 17 сентября 2018

Это странно:

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

Обновление: Вы говорите:

Когда я запускаю, я получаю эту ошибку.

Но там нет ошибок.Это даже не предупреждение.Это просто данные, которые вы не совсем поняли: -)

0 голосов
/ 16 сентября 2018

fetchall_arrayref возвращает ссылку на массив, в котором есть элемент для каждой строки, возвращаемой запросом. Эти элементы являются ссылками на массивы с элементом в каждом столбце.

Вам не хватает кода для зацикливания возвращаемых строк.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...