此代码有问题。
#!/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 :(得分: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";