2016-02-13 5 views
0

Я пытаюсь получить свой первый выбор для работы с использованием selectall_hashref из модуля Perl DBI. Я успешно открыл соединение с базой данных (MySQL). Я получаю сообщение об ошибке, когда я выполнить следующее:Ошибка «атрибут параметр не в хэш-ref» при использовании Perl DBI selectall_hashref

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

DBI :: й = 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 пуст, то ключи в хэшах по умолчанию имеют любое имя. (См. «Атрибут« FetchHashKeyName ». Если хэш $ slice равен , а не пустой, , то он используется как срез для выбора отдельных столбцов по имени. Значения хеша должны быть установлены в 1. Названия ключей возвращенных хэш-символов соответствуют буквенному регистру имен в хэш-параметре, , независимо от атрибута «FetchHashKeyName».

Это хорошая идея установить атрибут FetchHashKeyName в дескрипторе базы данных, чтобы ваши имена хеш-ключей были согласованы; Мне нравится NAME_lc в моих приложениях.

2

Методы рассчитывают, что ключевой столбец является вторым параметром, а атрибуты ref передаются как третий. В результате он создает хэш с указанным столбцом в качестве ключа. То, что вы, вероятно, хотите, это selectall_arrayref:

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

Я надеялся вернуть hashref как '{" id "-> 1}', поэтому я выбрал версию hashref. Использует ли hashref параметры, которые он принимает, а не то, что он возвращает? –

+0

Я вижу. Боюсь, вам нужно идти по строкам и использовать fetchrow_hashref для этого. DBI немного непоследователен в отношении именования ... –

+0

Вот и все. Я хотел 'selectrow_hashref' не' selectall_hashref'. Я видел примеры для обоих и скопировал неправильный код. –