【问题标题】:mysqli_fetch_array($result, MYSQLI_NUM);mysqli_fetch_array($result, MYSQLI_NUM);
【发布时间】:2019-01-31 14:16:32
【问题描述】:

这个mysqli_fetch_array 没有返回值。检查它是否有 SQL 错误,没有找到。我猜是 PHP 或函数中的一些错误。请帮我改正。

$login = login($username, $password);
if ($login == false) {
    $errors[] = "That username and password     combination is incorrect";
}

// validate login
function login($username, $password){
    $user_id = id_from_username($username);
    echo $user_id;
    $password = md5($password);
    $username = sanitize($username);
    $query = "SELECT `password` FROM `user_data` WHERE `username` = '$username' ";
    $result = mysqli_query($conn,$query);
    $row = mysqli_fetch_array($result, MYSQLI_NUM);

    if ($row[0] == $password) {
        echo "Login successful";
        return $user_id;
    }
    else{
        echo "Login not successful";
        return false;
    }
}

// user id from username
function id_from_username($username){
    $username = sanitize($username);
    $query = "SELECT `user_id` FROM `user_data` WHERE      `username` = '$username'";
    $result = mysqli_query($conn,$query);
    $row = mysqli_fetch_array($result, MYSQLI_NUM);
    return $row[0];
}

【问题讨论】:

  • 您的代码极易受到 SQL 注入的攻击。看看准备好的陈述!也不要使用 MD5 散列用户密码!它不再安全了
  • 另外,您是否查找过任何 php 错误?
  • id_from_username 无法访问$conn + @Isaac 所说的内容;p
  • 看起来更多的是代码不完整。 $conn 必须在其他地方定义。请提供minimal reproducible example。这对每个人都有帮助。

标签: php mysqli login


【解决方案1】:

编辑:正如劳伦斯正确指出的那样,我错过了变量范围问题。 mysqli_query 无权访问 $conn 变量。


尝试检查$result中返回的行数:

echo $result->num_rows;

如果有的话,也可以将其打印到日志中。不确定您如何检查 mysqli_fetch_array 不返回值 - 尝试 var_dump()print_r()

一些进一步的建议:

  • 您问题中的两个查询都从同一个表中选择 - user_data - 单独执行它的效率非常低(除非 id_from_username 在其他地方常用),我会将其合并到一个查询中以一次选择它:

    选择user_id, password FROM user_data WHERE ...

  • 使用mysqli_query 并将用户输入连接到查询中通常是个坏主意。不确定你的 sanitize 函数做了什么,但我仍然会使用变量绑定,即使 mysqli 支持 mysqli_prepare,请参阅 here

  • 根据您的代码,您使用md5 在数据库中存储密码。这是一个非常糟糕的做法。自 PHP 5.5.0 起,PHP 提供了非常好的函数 password_hashpassword_verify,它们将为您处理密码哈希,并使您的应用程序更加安全。

【讨论】:

  • 错过了变量范围问题。
  • 劳伦斯所说的加 1。您提出了很好的有效观点,但是这些如何解决 OP 的问题?
  • 谢谢.. 它有效,我错过了在这些函数中连接 dB 的函数,如果有任何关于使代码安全的参考,请提出建议。
  • 哦,是的,劳伦斯,完全错过了:-$
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2010-12-13
  • 1970-01-01
  • 2014-06-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多