从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];
}
我的名字只是没有其他行
MySQL在这里是一个红鲱鱼。您正确使用DBI,但一旦从数据库中提取数据就会出错。
你的问题在于这一行:
$results = $row[0],$row[1],$row[3];
这与运行此代码非常相似:
$x = 100, 200, 300;
如果你然后打印$x
你会看到它包含“100”。在赋值运算符的右侧有三个项目,左侧只有一个变量,因此只有一个值(第一个)最终分配给变量。
我在这里补充说,如果你在你的代码中启用了use warnings
(并且所有优秀的Perl程序员总是打开use strict
和use warnings
)那么你会得到一个关于“在无效环境中无用地使用常量”的警告表示出现了问题。
您可以采取几种方法来解决这个问题。你选择哪一个取决于你想要做什么。显而易见的解决方案是将$results
更改为数组:
@results = ($row[0], $row[1], $row[2]);
请注意,我还在您的值列表中添加了括号。这些都需要告诉Perl这是一个列表赋值。当然,这只是一种复杂的写作方式:
@results = @row;
另一种选择是获取三个值并将它们转换为单个字符串。如果您要在代码中的其他位置单独使用这些值,这不是一个好的选择,但如果您只是想要打印出来的东西,您可以编写如下内容:
$results = "$row[0],$row[1],$row[2]";
再一次,有一种更简单的方法来写这个:
$results = join ',', @row;
Name
,age
和country
不是行 - 它们是列。
您可以使用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";
}