Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/wix/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ajax Php登录表单txt文件_Php_Ajax_Forms_Login_Passwords - Fatal编程技术网

Ajax Php登录表单txt文件

Ajax Php登录表单txt文件,php,ajax,forms,login,passwords,Php,Ajax,Forms,Login,Passwords,如果txt文件中存在user/passw,我将尝试使用php验证来设置ajax登录表单 表格: <form class="form login" id="log_user"> <input id="login__username" type="text" name="username" class="form__input" placeholder="Username" required> <input id="login__passwo

如果txt文件中存在user/passw,我将尝试使用php验证来设置ajax登录表单

表格:

    <form class="form login" id="log_user">

    <input id="login__username" type="text" name="username" class="form__input" placeholder="Username" required>

    <input id="login__password" type="password" name="password" class="form__input" placeholder="Password" required>

    <input type="submit" value="Log In">

</form>
PHP:

    <?php

foreach(file('passwd.txt') as $line) {

    if(empty($line)) continue;

    $lineArray = explode(':', $line);
    $username = rtrim($lineArray[0]);
    $password = rtrim($lineArray[1]);

    if( isset($_POST['username']) && isset($_POST['password']) ){

        if($_POST['username'] == $username && $_POST['password'] == $password){ 
            session_start();
            $_SESSION['user'] = $username;
            echo "Success";    
        }
        else{
            echo "Failed";
        }
    }
}

?>
每次我尝试都有一个成功者失败了,不明白为什么? 线索?

问题在于您的foreach循环。我假设您存储了多个用户名和密码?如果你输入了一个正确的un和pw,它会回显成功,但是你没有告诉它在那一点停止,所以下一个条目运行时与un和pw不匹配,所以它会回显失败

这里的解决方案是在foreach之外使用一个变量,如果找到用户名和密码,该变量将切换为truthy值(在本例中为TRUE)。在foreach之后,我们检查该变量的值,并响应相应的响应:

$success = FALSE;
foreach(file('passwd.txt') as $line) {

    if(empty($line)) continue;

    $lineArray = explode(':', $line);
    $username = rtrim($lineArray[0]);
    $password = rtrim($lineArray[1]);

    if( isset($_POST['username']) && isset($_POST['password']) ){

        if($_POST['username'] == $username && $_POST['password'] == $password){ 
            session_start();
            $_SESSION['user'] = $username;
            $success = TRUE;
            break; // stop looping through text file.
        }
    }
}
echo $success ? 'Success' : 'Failed';

旁注:为什么要使用文本文件而不是数据库,有什么特别的原因吗?前者比文本文件更容易管理,也更安全。首先,在我看来,您可能在头文件之前输出。ini_设置了什么“显示错误”,1;ini设置“显示启动错误”,1;错误报告全部;扔回去?你到底不明白什么?您正在执行foreach,因此该块中的所有内容(包括输出命令)都将针对文件中的每一行运行你知道你在这里做什么吗?这很不安全。Thanx很多Richard,我理解这个bug,但不幸的是,它不能与列表中的第一个usern/passwd一起工作?我在这里做了一个裸体:
myname:mypassw
myname2:mypassw2
$success = FALSE;
foreach(file('passwd.txt') as $line) {

    if(empty($line)) continue;

    $lineArray = explode(':', $line);
    $username = rtrim($lineArray[0]);
    $password = rtrim($lineArray[1]);

    if( isset($_POST['username']) && isset($_POST['password']) ){

        if($_POST['username'] == $username && $_POST['password'] == $password){ 
            session_start();
            $_SESSION['user'] = $username;
            $success = TRUE;
            break; // stop looping through text file.
        }
    }
}
echo $success ? 'Success' : 'Failed';