Веб-сервис Perl: Использование XML RPC

0

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

#!/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: $!";
  • 0
    Нужно ли мне выражение WHERE в операторе MYSQL для получения значения учетных данных или как?
  • 0
    SELECT возвращает все строки от users таблицы, в каждой из которых есть столбцы с именем username и password . Если вы хотите проверить определенное имя пользователя, вам, безусловно, следует использовать что-то вроде WHERE username=? и добавьте $username в вызов execute .
Показать ещё 3 комментария
Теги:
web-services
xml-rpc

1 ответ

2

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

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

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

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

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

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

Следующая работа должна выполняться.

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

  return "Invalid Credentials";
  • 0
    Спасибо за быстрый ответ. Я получаю «Войти успешно», если учетные данные верны. Вместо «Неверные учетные данные, когда данные для входа неверны, он выводит HASH (0x34bc764). Любая причина, почему это отображается?
  • 0
    Я добавил небольшое объяснение о проблеме if в отношении вашего комментария. Удачи!
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню