Php 用foreach检查登录数据?
我正忙于提高我的PHP技能和制作一个简单的登录脚本。我用foreach循环检查$accounts数组,但认为我做错了什么,因为没有中断,脚本会为每个错误的帐户登录给出错误。我只是不知道我需要用什么来代替foreach。有人能帮我吗 简单HTML表单: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
<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';
}