在Perl中使用MySQL选择多个行

时间:2019-03-30 20:00:08

标签: perl dbi

从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];
  }   

我只是得到名字而没有其他行

2 个答案:

答案 0 :(得分: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 :(得分: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";
}