-1

私は、他のものの中でも、名前、パスワードを含むいくつかの情報を含むtxtファイルを持っています。フォームの送信から、パスワードが名前と一致するかどうかを確認する必要があります。実際にはtxtファイルを吸いますが、これは機能します。

    function checkPassword($password, $username){
        $userinfo = file_get_contents(USER_INFO); 
        $uniqueinfo = explode("-", $userinfo);
        if (in_array($password, $uniqueinfo) && in_array($username, $uniqueinfo)) {
            return true;
        } else {
            return false;
        }
    }

さて、おそらくご想像のとおり、同じアカウントに属していない場合でも、有効なユーザー名とパスワードが見つかっている限り、これはtrueを返します。したがって、別のアカウントからパスワードを入力した場合、これをtrueに戻すことができます。良くない。だから、私は試しました:

    function checkPassword($password, $username){
        $userinfo = file_get_contents(USER_INFO); 
        foreach($userinfo as $uniqueinfo) {
            $uniqueinfo = explode("-", $uniqueinfo);
            if (in_array($password, $uniqueinfo) && in_array($username, $uniqueinfo)) {
                return true;
            } else {
                return false;
            }
        }
    }

しかし、これは有効なクレデンシャルがあってもfalseを返すだけです。ここでどこが間違っているのかわからないので、助けていただければ幸いです。ありがとう。

4

3 に答える 3

1

問題は、パスワードとユーザー名がファイルの最初の項目と一致しない限り、関数がfalseを返すことです。次のようなものを試してください:

function checkPassword($password, $username){
        $userinfo = file_get_contents(USER_INFO);
        if(!$userinfo){
            echo "Failed to open file!";
            return false;
        }
        $bits = explode('-',$userInfo);
        for($x = 0; $x < count($bits);$x+=2){
            $testPass = $bits[$x];
            $testUser = $bits[$x+1];
            if ($username == $testUser && $password == $testPass) {
                return true;
            }
        }
        return false;
    }

これは、ファイル内のアイテムが一致しない場合にのみfalseを返します。

于 2012-12-11T20:21:19.153 に答える
1

A. 代わりにfile_get_contents配列を使用せずに文字列を返しますfile

  $userinfo = file_get_contents(USER_INFO); 
                      ^--------------------- string not array 

したがってforeach($userinfo as $uniqueinfo) {

B.checkPassword($username,$password)わかりやすくするためにcheckPassword($ password、$ username)ではなく使用する

C.trim検証前に空白を削除するために使用する

変更された機能

function checkPassword($username,$password) {
    $userinfo = file(USER_INFO);
    foreach ( $userinfo as $uniqueinfo ) {
        list($user, $pass) = array_map("trim",explode("-", $uniqueinfo));
        if ($username == $user && $password == $pass) {
            return true;
        }
    }
    return false;
}
于 2012-12-11T20:22:58.187 に答える
0

コードが気に入ったら、フラグを追加してそれに基づいて戻ります。

function checkPassword($password, $username){
    $userinfo = file_get_contents(USER_INFO); 
    $lines = explode("\n", $userinfo);
    foreach($lines as $uniqueinfo) {
        if (strstr($uniqueinfo, $password) && strstr($uniqueinfo, $username)) {
            return true;
        }
    }
    return false;
}
于 2012-12-11T20:23:56.203 に答える