【问题标题】:If statment in foreach only checking the last valueforeach 中的 if 语句仅检查最后一个值
【发布时间】:2020-04-21 08:46:15
【问题描述】:

我正在尝试使用 php 创建一个登录系统,用于检查数据库中的用户名和密码。但问题是我在 foreach 中的 if 语句只检查数据库中的最后一个值。例如,如果我的数据库中有 5 个用户名和密码,我的 foreach 中的 if 语句只检查我是否输入了最后一个用户的用户名和密码,但是如果我给它一个用户名和密码,比如说第二个用户,它不会接受它。

html代码:

<!DOCTYPE html>

<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <meta http-equiv="X-UA-Compatible" content="ie=edge">
  <title>Login</title>
</head>

<body>
  <div class="top">
    <div class="box">
      <h2>Login</h2>
      <form action="findAccount.php" method="post">
        <div class="inputBox">
          <input type="text" name="username">
          <label>Username</label>
        </div>

        <div class="inputBox">
          <input type="password" name="password">
          <label>Password</label>
        </div>

        <input type="submit" name="submit" value="Submit">
      </form>
    </div>
  </div>
</body>

</html>

php代码:

<?php
$dbh = new PDO('mysql:host=localhost;dbname=database_name', 'root', '');

$username = $_POST['username'];
$password = $_POST['password'];

$sql = $dbh->prepare("SELECT * FROM tabel_name");
$sql->execute();
$result = $sql->fetchAll();

foreach ($result as $r) {
  if ($username == $r['username'] && $password == $r['password']) {
    header('Location: mainPage.php');
  } else {
    header('Location: login.php');
  }
}

【问题讨论】:

  • 你想用你的代码实现什么?您正在从tabel 检索所有记录。当然,您最好将WHERE 子句添加到您的SELECT 语句中,而不是将整个表加载到您的PHP 代码中?
  • 为什么不编辑查询以仅提取您需要的值。而不是从该表中选择所有,只提取与给定用户名匹配的记录。
  • @Martin 我的表只包含用户名和密码。此外,它只是一个用于测试的小型数据库,所以如果我加载整个表也没关系。
  • @squidward 我什至找不到精力去反驳你刚才所说的问题。祝你好运

标签: php mysql if-statement authentication foreach


【解决方案1】:

header('Location: ...'); 就像一个终结者:它将浏览器重定向到另一个页面。在您的循环的第一次运行中,您以两种可能的方式之一使用它。你想要的是:

foreach ($result as $r) {
  if ($username == $r['username'] && $password == $r['password']) {
    header('Location: mainPage.php');
    die();
  }
}
header('Location: login.php');

顺便说一句,如果只获取您的用户的用户记录并检查 0 或 1 个结果,则可以对此进行优化。

非常重要

您将明文密码存储在数据库中。不要这样做。在某些州,这是法律禁止的!

【讨论】:

  • 非常感谢@Wiimm 它有效!顺便说一句,别担心,我正在对密码进行哈希处理,我只是在发布问题时将其删除。