Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/299.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
Php 用foreach检查登录数据?_Php_Login_Foreach - Fatal编程技术网

Php 用foreach检查登录数据?

Php 用foreach检查登录数据?,php,login,foreach,Php,Login,Foreach,我正忙于提高我的PHP技能和制作一个简单的登录脚本。我用foreach循环检查$accounts数组,但认为我做错了什么,因为没有中断,脚本会为每个错误的帐户登录给出错误。我只是不知道我需要用什么来代替foreach。有人能帮我吗 简单HTML表单: <form method="post"> <label>E-mail:</label> <input name="email" type="text" /> <lab

我正忙于提高我的PHP技能和制作一个简单的登录脚本。我用foreach循环检查$accounts数组,但认为我做错了什么,因为没有中断,脚本会为每个错误的帐户登录给出错误。我只是不知道我需要用什么来代替foreach。有人能帮我吗

简单HTML表单:

<form method="post">

    <label>E-mail:</label>
    <input name="email" type="text" />

    <label>Password:</label>
    <input name="password" type="password" />

    <input name="login" type="submit" value="Login" />

</form>

电邮:
密码:
PHP:


说我想以用户2身份登录(杰克·约翰森)。但是,foreach将从user1(Matt Kent)开始,因为
$account['email']!=$_POST['email']
我将获得
四个电子邮件地址
错误,并且foreach将
中断

你可以像下面这样做

$emailFound = FALSE;
foreach ($accounts as $account) {
    if ($account['email'] == $_POST['email']) {
        if ($account['password'] == $_POST['password']) {
            echo 'successful login!';
        } else {
            echo 'wrong password';
        }
        $emailFound = TRUE;
        break;
    }
}
if ($emailFound === FALSE) {
    echo 'wrong email';
}
  • 您有一个标志
    $emailFound
    ,可以让您知道电子邮件是否在定义的数组中
  • 它只会在电子邮件匹配的情况下检查密码,因此不会将Jake的密码与Matt的密码进行对比(如上所述)
这假设一封电子邮件不能由两个用户持有,因此一旦找到正确的电子邮件,您可以
中断循环,因为以下用户不再感兴趣


案例1:我想用不正确的密码作为user2登录。foreach将是这样的

  • 迭代:
    如果($account['email']=$\u POST['email'])
    返回false,则无需进一步检查
  • 迭代:
    如果($account['email']=$\u POST['email'])
    返回true,那么进入内部
    • 如果($account['password']=$\u POST['password'])
      返回false,那么进入else
    • 完成后显示错误和
      break

  • 正如你所看到的,它是有效的。这是因为在您当前的脚本中,不会有第二次迭代,因为您总是
    break
    (其中一个
    elseif
    s很可能是正确的)。

    不需要中断。这不是开关箱。那么,为什么要将数据放在数组中?如果它来自db,那么您可以检入查询本身。foreach将在数组中循环,不管它是否正确。所以当你有两个数组时,一个总是会是假的。此外,使用密码数组也不是很好的做法。特别是对于没有被散列(使用salt)的密码,它看起来非常不安全。您是否不能使用带有prepared语句的PDO扩展或带有prepared语句的MySQLi来使用数据库statements@kumar_v好的,但我使用了break,因为否则脚本会为每个帐户都给出一个错误,错误的登录组合,我很好奇。为什么使用foreach的
    foreach
    方法允许多个帐户登录?这不就足够了吗@谢谢你的回答!那么foreach是做这项工作的正确选择吗?我不会称之为“正确的选择”。是的,你可以这样做,如果你的用户总是不到几个,你就不会遇到那么严重的问题。但是,您不使用数据库进行此操作有什么具体原因吗?它们完全是为这样的工作而设计的,查询数据库将比编写自己的脚本来做同样的事情更加高效和简单(一旦你知道如何)。是的,我想使用数据库,但因为这是我使用数组进行登录的一次快速尝试,但现在我要看一些sql教程。好的,玩得开心-一旦你对它了解一点,它应该很容易-而且我认为每个方法都有一些好的片段。帮你自己一个忙,不要开始使用
    mysql.*
    函数,而是
    mysqli.
    PDO
    !谢谢你的帮助!他们之间有什么区别?
    $emailFound = FALSE;
    foreach ($accounts as $account) {
        if ($account['email'] == $_POST['email']) {
            if ($account['password'] == $_POST['password']) {
                echo 'successful login!';
            } else {
                echo 'wrong password';
            }
            $emailFound = TRUE;
            break;
        }
    }
    if ($emailFound === FALSE) {
        echo 'wrong email';
    }