-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 回答