首页 > 解决方案 > 如何使用数组指针从 Perl 中的 MySQL 查询中获取多条记录?

问题描述

我可以将这一切作为一个函数来完成,但是在尝试将其移植到我的函数包(库)中时,我遗漏了一些东西。

这是我想从我的主要 Perl 脚本中做的事情

my @rows;
$result = Funx::dbcdata($myConnection, 
          "SELECT * FROM Inv where name like \"%DOG%\";", \@rows);

然后在我的库包中我正在尝试这个

sub dbcdata
{
    my ($connection, $command, $array) = @_;

    my $query = $connection->prepare($command);
    my $result = $query->execute();

    my $i =0;
    while(my $row = $query->fetchrow_arrayref() )
    {
    @{$array}[$i] = $row;
    $i++;
    }
    $query->finish;
    return $result;
}

我希望找回对每一行的指针或引用(在这种情况下是 4),但不是。@rows 中的每个元素都是相同的:

阵列(0x5577a0f77ec0)阵列(0x5577a0f77ec0)阵列(0x5577a0f77ec0)阵列(0x5577a0f77ec0)

我也不知道如何将每一个变成原来的单独行。任何帮助将不胜感激,谢谢。

标签: mysqlperl

解决方案


文档fetchrow_arrayref

请注意,每次提取都会返回相同的数组引用,因此不要存储引用并在以后的提取后使用它。此外,数组的元素也会被每一行重用,所以如果你想引用一个元素,请小心。

听起来你想要fetchall_arrayref

fetchall_arrayref 方法可用于从准备和执行的语句句柄中获取要返回的所有数据。它返回对包含每行一个引用的数组的引用。

执行语句后,您可以执行以下操作

@{$array} = $query->fetchall_arrayref->@*;

而不是那个丑陋的循环。

selectall_array可能会更好。您的整个函数可以通过调用它来替换:

my @rows =
     $myConnection->selectall_array(q/SELECT * FROM Inv WHERE name LIKE '%DOG%'/);

推荐阅读