Perl: DBI (работа с ссылками)

Модератор: Модераторы разделов

IMB
Сообщения: 2567
ОС: Debian

Perl: DBI

Сообщение IMB »

Доброго дня!
Имеется некая форма позволяющая пользователя сменить его пароль. Для этого надо ввести текущий пароль и дважды новый. Если введеный текущий пароль соответвует хранящемуся в базе, то провярается равенство дважды введеного нового пароля и если они равны пароль меняется. Одним словом достаточно стандартный алгоритм.
Сначала правильность текущего пароля я проверял с помощью $sth->rows, но документация настроятельно не советует применять этот метод для select запросов. Я пробую переписать проверку на на использование fetchall_arrayref. Насколько я понял, и print это подтверждает, мне возвражается ссылка на массив, что собственно следует даже из названия. Но ссылка не простая, я ссылка на ссылки строк с данными.
Как то сложно получилось, привожу выдержку из документации:

Код: Выделить всё

The "fetchall_arrayref" method can be used to fetch all the data to be returned from a prepared and executed statement handle. It returns a reference to an array that contains one reference per row.

В моей текущей ситации, проверка пароля, мне достаточно узнать размер массива и если он равен единице, выбрано одно значение, то пароль верен. Но увы, у меня не получается написать этот код для my $a = $sth->fetchall_arrayref.
Начальный код, получение ссылки:

Код: Выделить всё

print $a;

ARRAY(0x92dcd08)

Попытка пройти по ссылке (разименовать ее):

Код: Выделить всё

print \$a;

REF(0xa08ed88)

Сейчас изучаю "Изучаем глубже Perl" Р.Л.Шварц и там есть примеры по работе с такими структурами, но тут проявляется одно но - я заранее не могу знать сколько строк мне вернется.
Поэтому прошу помощи в вопросе - как узнать размер массива по ссылке если сам массив представляет из себя ссылки на другие массивы.
Или есть более простой способ решения?
Спасибо.
Спасибо сказали:
IMB
Сообщения: 2567
ОС: Debian

Re: Perl: DBI

Сообщение IMB »

Путем вчитываня в "Perl Сборник рецептов" Т.Кристиансен пришел к следующему решению, вроде правильному:

Код: Выделить всё

print $#$a;

0

Я так понимаю, что массив содержит одну ссылку раз Perl считает индексы с 0.
Спасибо сказали:
pcodr
Сообщения: 283
ОС: Debian

Re: Perl: DBI

Сообщение pcodr »

Да, это у вас индекс последнего элемента. Длину же можно так получить: scalar(@$a).
Вообще помоему можно обойтись без этого. Я так понимаю запрос у вас для проверки вроде такого:

Код: Выделить всё

SELECT * FROM users WHERE login='$login' AND password='$password'


В таком случае мне кажется можно обойтись таким кодом:

Код: Выделить всё

if($db->do("SELECT * FROM users WHERE login='$login' AND password='$password'") == 1)
{
         #верный пароль
}
else
{
        #неверный пароль
}
remote system type is unix
Спасибо сказали: