2016-02-13 48 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'。我看過兩個例子,並複製了錯誤的代碼。 –