Perl Web服务:使用XML RPC

时间:2011-02-07 08:53:18

标签: mysql web-services perl xml-rpc

此代码有问题。

#!/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 个答案:

答案 0 :(得分:2)

这是您的代码的另一个问题 - 您没有使用提供的用户名和密码做任何事情。您需要在SQL语句中添加where子句,所以:

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";