【问题标题】:MySQL Array is returning nothing/1'sMySQL Array 不返回任何内容/1
【发布时间】:2013-08-16 17:30:46
【问题描述】:

我正在处理留言板,我刚刚开始,现在正在处理登录功能。我有一个问题。每当我尝试获取数据时,它要么什么都不返回,要么返回一个“1”。鉴于我是将 mySQL 与 PHP 集成的新手,我不知道发生了什么。如果你能帮我弄清楚我做错了什么,那就太好了。

    $query = mysql_query("
    SELECT * FROM users WHERE username='$username'
");

while ($row = mysql_fetch_assoc($query)){
    $dbID = $row['id'];
    $dbUser = $row['username'];
    $dbPass = $row['password'];
}

if ($dbUser = $username && $dbPass = $password) {
    //if user and pass match do stuff
    $_SESSION['username'] = $dbUser;
    $_SESSION['id'] = $dbID;
    $_SESSION['ip'] = $_SERVER['HTTP_USER_AGENT'];
    header("Location: messageboard.php");
}
else {
    //if user and pass dont match do stuff
    $_SESSION['loginError'] = "Your username and password do not match";
    header("Location: login.php");
}

所有这些代码都返回 - ID: 用户名:1 IP:Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/28.0.1500.95 Safari/537.36

【问题讨论】:

  • PSA: mysql_* 函数是 deprecated in PHP 5.5。不建议编写新代码,因为它会阻止您将来升级。相反,请使用 MySQLiPDObe a better PHP Developer
  • if ($dbUser = $username && $dbPass = $password) { - 您应该使用== 进行松散比较。 = 是赋值运算符。
  • 另外,您的while 循环正在遍历整个结果集,而不仅仅是您想要的一行。因此,除非用户是最后一个用户,否则他们将无法登录。
  • 我的 fetch 正在运行的查询仅在用户名等于表单确定的用户名的情况下。
  • @GeorgeColeman - 过失,就是这样。不过,这不会使 === 的问题无效

标签: php mysql


【解决方案1】:

首先,正如 andrewsi 所说:$dbUser = $username && $dbPass = $password 应该使用 == 来比较值。

第二:这样做是非常脆弱的。

首先,您似乎将密码存储在“明文”中,因此您可以使用直接比较。不要这样做。存储一个(加盐或加胡椒的)哈希,并将用户输入与该哈希进行比较!

第二:您正在使用 WHILE 循环 (while ($row = mysql_fetch_assoc($query)){) 来设置用户数据。这不是必需的,因为一个用户名应该只有一组数据。

第三:您在查询中使用$username。您的示例不包含 $username 的生成,但从我在您的源代码中看到的,它很可能看起来像 $username = $_POST["username"]

因此,在这一点上,一个人可能能够修改输入的用户名以接收有效的登录,即使它不是。 (SQL 注入)。

转义用户输入(在将其传递给 SQL 查询之前使用 MySQL_real_escape_string()

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-09-10
    • 1970-01-01
    • 2011-05-25
    • 2022-01-09
    • 2017-01-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多