Веб-сервис Perl: Использование XML RPC - PullRequest
0 голосов
/ 07 февраля 2011

Что-то не так с этим кодом.

#!/use/bin/perl
use strict;
use warnings;
use Frontier::Daemon;
use DBI;

sub credentials {
    my ($username, $password) = @_;

    my $tablename = "users";
    my $user      = "db_user";
    my $pw        = "db_pass";

    $dbh = DBI->connect('DBI:mysql:database;host=localhost', $user, $pw, {RaiseError => 1});
    $sql = "SELECT username, password FROM $tablename";
    $sth = $dbh->prepare($sql);
    $sth->execute or die "SQL Error: $DBI::errstr\n";

    if ($sth->rows > 0) {
        $login_response = "Login Successful";
    } else {
        $login_response = "Invalid Credentials";
        return {'login' => $login_response};
        die();
    }
}

$methods = {'login.credentials' => \&credentials,};
Frontier::Daemon->new(LocalPort => 8080, methods => $methods)
  or die "Couldn't start HTTP server: $!";

1 Ответ

2 голосов
/ 07 февраля 2011

Это еще одна проблема с вашим кодом - вы ничего не делаете с предоставленными именем пользователя и паролем.Вам нужно добавить предложение where в ваш оператор SQL, так:

my $sql = 'SELECT * FROM users WHERE username = ? AND password = ? ';
my $sth = $dbh->prepare($sql);
$sth->execute($username, $password);

Однако, учитывая, что в вашем примере выбираются все записи из таблицы 'users', я бы подумал, что credentials ()по крайней мере, возвращать несколько строк.Тем не менее, я боюсь, что я не использовал Frontier :: Daemon в прошлом, поэтому я не могу помочь на этом фронте.

Я также не вижу, как этот код будет работать, если вы используете ограничения.$ dbh, $ sql, $ sth и $ login_response не были объявлены.Поэтому убедитесь, что вы используете «мой» в нужных местах - как в моем примере выше.

Чтобы исправить проблемы, о которых вы упоминали, возвращая правильную строку - логика в вашем выражении if не совсем верна.Вы возвращаете строку «Вход успешен», если есть успешный вход в систему, и хэш-адрес {login => $ login_response}, когда ни один пользователь не может быть найден.

Я думаю, что путаница возникла из-за расположения фигурных скобок.Я должен подчеркнуть, что вы пытаетесь правильно сделать отступ в своем коде, что сделает его более читабельным для вас и других разработчиков при отладке и обслуживании кода в будущем.

Следующая логика должна делать эту работу.

  if($sth->rows > 0){
       return "Login Successful";
  }

  return "Invalid Credentials";
...