2011-02-07 10 views
0

このコードで何か問題があります。Perl Webサービス: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: $!"; 
+0

資格情報の値を取得するには、MYSQL文にWHERE句が必要ですか? – Gruther

+0

SELECTは、 'username'と' password'という列を持つ 'users'テーブルからすべての行を返します。特定のユーザ名をテストする場合は、 'WHERE username =?'のようなものを使用し、 'execute'コールに' $ username'を追加するべきです。 – bvr

+0

@bvr @chambwez私のコードは今うまく動いていると思います:)私の最後の質問は、XMLRPCで可能なセッション処理ですか?クライアントとサーバーの間でステートフルな通信を維持するにはどうすればよいですか? – Gruther

答えて

2

これは、コードに別の問題があります。これは、提供されたユーザー名とパスワードでは何もしません。

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

しかし、あなたの例では、「ユーザー」テーブルからすべてのレコードを選択している、私は資格情報は、()は、少なくともだろうと思っているだろうことを考える:あなたは、あなたのSQL文にwhere句を追加する必要がありますいくつかの行を返す。しかし、私は過去に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)が出力されます。表示される理由は? – Gruther

+0

あなたのコメントに関してif文の問題について少し説明を追加しました。 ! – chambwez

+0

@chambez、ありがとうございました。SMS送信部である最後のセクションをまとめていますが、私たちが話しているように働くシステムがあります:Net :: SMPPを使っていますが、私は過去にSMPPを使用しましたが、PHPでは – Gruther

関連する問題