在Perl中使用MySQL选择多行

问题描述 投票:0回答:2

从MySQL中选择3行

但我只得到第一个 - 名字。我只得到名字

$get = $dbh->prepare("select name, age, country from tble where me = ?");
$get->execute('john');
while(my @row = $get->fetchrow_array){
     $results = $row[0],$row[1],$row[3];
  }   

我的名字只是没有其他行

perl dbi
2个回答
2
投票

MySQL在这里是一个红鲱鱼。您正确使用DBI,但一旦从数据库中提取数据就会出错。

你的问题在于这一行:

$results = $row[0],$row[1],$row[3];

这与运行此代码非常相似:

$x = 100, 200, 300;

如果你然后打印$x你会看到它包含“100”。在赋值运算符的右侧有三个项目,左侧​​只有一个变量,因此只有一个值(第一个)最终分配给变量。

我在这里补充说,如果你在你的代码中启用了use warnings(并且所有优秀的Perl程序员总是打开use strictuse warnings)那么你会得到一个关于“在无效环境中无用地使用常量”的警告表示出现了问题。

您可以采取几种方法来解决这个问题。你选择哪一个取决于你想要做什么。显而易见的解决方案是将$results更改为数组:

@results = ($row[0], $row[1], $row[2]);

请注意,我还在您的值列表中添加了括号。这些都需要告诉Perl这是一个列表赋值。当然,这只是一种复杂的写作方式:

@results = @row;

另一种选择是获取三个值并将它们转换为单个字符串。如果您要在代码中的其他位置单独使用这些值,这不是一个好的选择,但如果您只是想要打印出来的东西,您可以编写如下内容:

$results = "$row[0],$row[1],$row[2]";

再一次,有一种更简单的方法来写这个:

$results = join ',', @row;

1
投票

Nameagecountry不是行 - 它们是列。

您可以使用selectcol_arrayref仅获取一列:

$name_ref = $dbh->selectcol_arrayref(
    q{
        SELECT name
        FROM tble
        WHERE me = ?
    },
    {},
    'john'
);

但是如果你想获得三列,你应该使用selectall_arrayref

my $rows = $dbh->selectall_arrayref(
    q{
        SELECT name, age, country
        FROM FROM tble
        WHERE me = ?
    },
    { Slice => {} },
    'john'
);

foreach my $row ( @$rows ) {
    print "$row->{'name'} aged $row->{'age'} from $row->{'country'}\n";
}
© www.soinside.com 2019 - 2024. All rights reserved.