2016-02-13 56 views
0

我想让我的第一个选择使用来自Perl DBI模块的selectall_hashref。我已经成功打开了与数据库(MySQL)的连接。我发现了一个错误,当我执行以下命令:当使用Perl DBI时,“属性参数不在哈希引用中”错误selectall_hashref

$dbh->selectall_hashref('SELECT id FROM users WHERE login=?',undef,"myusername"); 

DBI :: ST = HASH(0x1505a60) - > _准备(...):属性参数 '名为myUsername' 不是一个哈希裁判在/usr/lib/x86_64-linux-gnu/perl5/5.20/DBD/mysql.pm线238

我的表应该是能够支持这个查询,它为每个用户id柱和login列。

我发现的selectall_hashref的示例显示?替代参数作为第三个参数传递。 DBI documentation表示第二个和第三个参数应该是%attr@bind_values,但没有提供关于它们的很多文档或显示工作示例。

是什么导致了错误,更重要的是你如何正确使用%attr@bind_values

回答

1

如果你想要的一切存储为一个数组引用,其中每行是一个hashref(这是你的comment似乎什么来表示),您可以使用selectall_arrayref()方法与Slice属性:

$dbh->selectall_arrayref('SELECT id FROM users WHERE login=?', {Slice => {}}, 'myusername'); 

这是一个有点怪异,但here's how it works

如果$切片是一个散列引用, fetchall_arrayref将每行取作为 的散列引用。如果$ slice散列为空,那么 散列中的键具有默认情况下返回的任何名称lettercase。 (请参阅 “FetchHashKeyName”属性。)如果$ slice散列为而不是为空,则 则用作切片以按名称选择单个列。散列值 应设置为1.返回的 散列的密钥名称与参数散列 中名称的字母大小写匹配,而不考虑“FetchHashKeyName”属性。

在数据库句柄上设置FetchHashKeyName属性是一个好主意,以使您的哈希键名称保持一致;我碰巧在我的应用程序中喜欢NAME_lc

2

该方法期望键列作为第二个参数,属性ref作为第三个参数传递。在结果中,它将指定的列作为关键字构建散列。你可能想,什么是selectall_arrayref

$ dbh->selectall_arrayref('SELECT id FROM users WHERE login=?',undef,"myusername"); 
+1

我希望能找回像{{“id” - > 1}'这样的hashref,这就是我选择hashref版本的原因。 hashref是否引用它所需的参数而不是返回的参数? –

+0

我明白了。恐怕你需要一排一排地使用fetchrow_hashref。 DBI在命名方面略有不一致...... –

+0

就是这样。我想'selectrow_hashref'而不是'selectall_hashref'。我看过两个例子,并复制了错误的代码。 –