Mysql PerlWeb服务:使用XMLRPC

Mysql PerlWeb服务:使用XMLRPC,mysql,web-services,perl,xml-rpc,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->con

此代码有问题

#!/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: $!";

这是代码的另一个问题-您没有使用提供的用户名和密码执行任何操作。您需要将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\u响应尚未声明。因此,请确保您在正确的位置使用了“我的”——正如我上面的示例所示

要解决您提到的返回正确字符串的问题,if语句中的逻辑不太正确。成功登录时返回字符串'Login Successful',找不到用户时返回hashref{Login=>$Login\u response}

我认为这种混乱是由支架的布局引起的。我必须强调,您应该尝试正确地缩进代码,这将使您自己和其他开发人员在将来调试和维护代码时更易于阅读

以下逻辑应该可以完成这项工作

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

  return "Invalid Credentials";

我需要在MYSQL语句中使用WHERE子句来获取凭据的值还是什么?SELECT you have返回表
users
中的所有行,每个行都有名为
username
password
的列。如果您想测试特定的用户名,您当然应该使用类似于
WHERE username=?
的东西,并将
$username
添加到
execute
调用中。@bvr@chambwez我认为我的代码现在运行良好:)我的最后一个问题是,在XMLRPC中是否可以进行会话处理?如何维护客户端和服务器之间的有状态传输?在以前的经验中,由于它相当简单,我们总是通过在每次调用中传递API密钥来实现这一点。例如:some.method(api_键、参数)。另一种选择是使用基本HTTP身份验证,并将其应用于每个调用。虽然如果呼叫将来自第三方网络,则应特别考虑-在这种情况下,您可能希望允许通过SSL进行呼叫,只是为了保护以明文形式传递的任何凭据或数据。@chambez,我也在考虑传递密钥,但不确定这是否是最好的途径。请阅读我在上一篇博文中的评论谢谢你的及时回复。如果凭据正确,我将收到“登录成功”。当登录详细信息错误时,它将输出哈希值(0x34bc764),而不是“无效凭据”。显示的原因是什么?我已经对您的评论中的if语句问题添加了一点解释。祝您好运!@chambez,感谢您的观察。我有一个工作系统,正如我们所说:-),尽管我正在整理最后一部分,即SMS发送部分。我正在使用Net::SMPP,但似乎有问题我过去使用过SMPP,但在PHP中使用过