Что-то не так с этим кодом.
#!/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", я бы подумал, что учетные данные() будут, по крайней мере, возвращать некоторые строки. Тем не менее, я боюсь, что в прошлом я не использовал Frontier:: Daemon, поэтому я не могу помочь на этом фронте.
Я также не вижу, как этот код будет работать, учитывая, что вы используете стриктуры. $dbh, $sql, $sth и $login_response не были объявлены. Поэтому убедитесь, что вы используете "мой" в правильных местах - согласно моему примеру выше.
Чтобы устранить проблемы, о которых вы говорили, вернув правильную строку - логика в вашем случае if не совсем правильная. Вы возвращаете строку "Login Successful", когда есть успешный логин и hashref {login = > $login_response}, когда пользователь не может быть найден.
Я думаю, что путаница возникла из макета фигурных скобок. Я должен подчеркнуть, что вы пытаетесь правильно откорректировать код, что сделает его более читаемым для себя и других разработчиков при отладке и сохранении кода в будущем.
Следующая работа должна выполняться.
if($sth->rows > 0){
return "Login Successful";
}
return "Invalid Credentials";
users
таблицы, в каждой из которых есть столбцы с именемusername
иpassword
. Если вы хотите проверить определенное имя пользователя, вам, безусловно, следует использовать что-то вродеWHERE username=?
и добавьте$username
в вызовexecute
.