我需要存储MySQL数据库中提取的数据。所以我使用了这段代码。
while (@row = $statement->fetchrow_array)
{
print "@row.\n"; # ------printing data
}
foreach $key(@row)
{
print $key."\n"; # ------empty data
}
在foreach循环中,@ row数据为空。如何解决这个问题
更新:实际上应该是这样的:
while (my @row = $statement->fetchrow_array) {
# print "@row.\n";
foreach my $key(@row) {
$query= "ALTER TABLE tablename DROP FOREIGN KEY $key;";
$statement = $connection->prepare($query);
$statement->execute()
or die "SQL Error: $DBI::errstr\n";
}
}
答案 0 :(得分:1)
嗯, 应该是这样的:
while (my @row = $statement->fetchrow_array) {
foreach my $key (@row) {
print $key."\n";
}
}
否则所有结果集都将在第一个循环中消耗。
作为旁注,fetchrow_array
将行集作为字段值的数组返回,而不是键。要获得密钥,您应该使用fetchrow_hashref
:
while (my $row = $statement->fetchrow_hashref) {
while (my ($key, $value) = each %$row) {
print "$key => $value\n";
}
}
您的评论中的更新:看起来您确实需要一系列列名。有一种方法可以做到:
my $row = $statement->fetchrow_hashref;
$statement->finish;
foreach my $key (keys %$row) {
# ... dropping $key from db as in your original example
}
但实际上,有更方便的方法可以做你想做的事。首先,有一种方法可用于准备和提取单行:selectrow_hashref
。其次,如果你想获得外键信息,为什么不使用特定的DBI方法 - foreign_key_info
?例如:
my $sth = $dbh->foreign_key_info( undef, undef, undef,
undef, undef, $table_name);
my $rows = $sth->fetchall_hashref;
while (my ($k, $v) = each %$rows) {
# process $k/$v
}