使用Perl DBI selectall_hashref时,错误“属性参数不在哈希引用中”

时间:2016-02-13 13:27:59

标签: mysql perl dbi

我正在尝试使用Perl DBI模块中的selectall_hashref让我的第一个选择工作。我已成功打开与数据库(MySQL)的连接。我执行以下操作时收到错误:

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

DBI :: st = HASH(0x1505a60) - > _prepare(...):属性参数'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

2 个答案:

答案 0 :(得分:2)

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

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

答案 1 :(得分:1)

如果要将所有内容存储为arrayref,其中每一行都是hashref(这是comment似乎指示的内容),您可以将selectall_arrayref()方法与Slice一起使用属性:

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

这有点奇怪,但是here's how it works

  

如果$ slice是哈希引用,fetchall_arrayref将每行取为   哈希引用。如果$ slice哈希为空,那么键中的键   哈希具有默认返回的任何名称。 (看到   “FetchHashKeyName”属性。)如果$ slice散列为空,   然后它用作切片以按名称选择单个列。该   hash的值应设置为1.返回的键名   哈希匹配参数哈希中名称的字母大小写,   无论“FetchHashKeyName”属性如何。

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