我有一个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。不知道我在哪里错了所以任何帮助将不胜感激。感谢。
答案 0 :(得分: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。
答案 1 :(得分: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;
}
答案 2 :(得分: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;
}