【问题标题】:Getting a result from a query and returning a value? PHP & MySQLi从查询中获取结果并返回值? PHP & MySQLi
【发布时间】:2015-10-22 22:53:56
【问题描述】:

当我点击提交时,输入验证有效,但即使我正确输入了存储在数据库中的用户名和密码,考虑到哈希值,但我得到的只是错误消息告诉我组合不正确。

这是我的登录脚本:

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

if (isset($_POST['submit']) === true) {

$login = login($username, $password);

if (empty($username) === true || empty($password) === true) {
    $errors[] = "Please fill in all fields";
} elseif ($login === false) {
    $errors[] = "That username and password combination is incorrect";
} else {
    $_SESSION['login'] = $login;
    echo 'Logged in';
}
}

下面是函数:

function login($username, $password) {
    global $conn;
    $query = "SELECT userId FROM users where userName = '$username' AND userPass = '$password'";
    $result = mysqli_query($conn, $query);
    $row_count = mysqli_num_rows($result);
    if ($row_count >= 1) {
        return $query['userId'];
    } else {
        return false;
    }
}

enter image description here

【问题讨论】:

  • 是的还是不行:/
  • 你为什么还有getUserId函数?您根本没有使用该信息。我的意思是你是,但你稍后再打电话。只需返回 $query['userId']
  • 不应该是$user_id = $get_user_id['user_id'];$user_id = $get_user_id['userId'];
  • @AndrewWilson 不会返回该值,因此当我设置会话时,该值是供以后使用的用户 ID
  • @SamLane 是的,但您不是在验证过程中要求提供相同的信息吗?

标签: php database mysqli associative-array


【解决方案1】:

我建议您尝试的第一件事是手动将 md5 散列密码与表中显示的密码进行比较。如果您绝对确定它们相等,请使用来自 toad 或 phpmyadmin 的值运行手动查询,看看是否得到结果。如果不是,问题可能出在查询中。如果您得到结果,请检查您的 mysqli_num_rows 函数,而不是在您的测试环境中回显用户 ID。

您还做了哪些调试工作?

【讨论】:

  • 查询在 PhpMyAdmin 中有效,并尝试在不搜索 userId 的情况下返回 true,但问题仍然相同
  • 在这种情况下调试 mysqli_num_rows 语句回显它并查看它返回的内容
  • 我刚试了一下,没有返回任何东西,这是否意味着它不起作用,如果它是 0 行,它会显示 0 吗?
  • 从 mysqli_num_rows 函数中移除连接变量。您只需要将结果参数提供给它
  • 通过回显查询字符串和mysqli_error来调试结果
【解决方案2】:

我猜你的代码需要一些修复,因为你在查询数据库后检查参数是否为空,在检查他的密码是否正确之前获取用户 ID.. 等等..

但首先,在行之后

    $query = "SELECT userId FROM users where userName = '$username' AND      userPass = '$password'";

你为什么不放

die($query);

运行页面,复制结果,粘贴到phpMyAdmin查询框中,看看结果是否符合你的需要。

【讨论】:

    【解决方案3】:

    您可以将其简化为这一点,但是我不建议在没有 XSS 清理的情况下接受用户输入。尤其是login这样的表。

    function login($username, $password) {
        global $conn;
        $password = md5($password);
        $query = "SELECT userId FROM users where userName = '$username' AND userPass = '$password' LIMIT 1";
        $result = mysqli_query($conn, $query);
        $row_count = mysqli_num_rows($result);
        if ($row_count >= 1) {
            return $query['userId'];
        } else {
            return false;
        }
    }
    

    【讨论】:

    • 这很有意义,谢谢,但它仍然是同样的问题,我完全删除了获取用户 ID 功能并使用了您的代码,但问题仍然相同,查询在 phpmyadmin 中手动运行,到使它更容易我现在也将其存储为纯文本密码。也没有消毒,因为我认为先让它工作然后添加它。我现在更新代码
    • 你能把 var_dump($result) 放在这里吗?您还在验证您的 md5($password) 是否与您的数据库的值相同?
    猜你喜欢
    • 1970-01-01
    • 2015-06-18
    • 2023-04-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-21
    相关资源
    最近更新 更多