需要有关PHP/SQL登录函数的帮助


Need help regarding a PHP/SQL login function

在你说之前:我知道密码应该加密/哈希,但我想先把它记下来:我有这个登录功能和一个SQL数据库。然而,登录功能似乎不起作用,我也不知道为什么。我可能错过了一些愚蠢的东西,但我已经为此挣扎了一段时间。任何帮助都将不胜感激!

注意:文件db_connect.php实际上只是与数据库的基本连接,没有任何问题

FUNCTION.PHP:

<?
function login($username, $password, $con) 
{       
    $myQuery = "SELECT * FROM Members WHERE Username = '$username' and Password = '$password';";
    $result = mysqli_query($con, $myQuery);
    if (mysql_num_rows($result) == 0)
    {
        return false;
    } 
    else
    {
return true;
    }
}
?>

PROCESS-LOGIN.hp:

<?php
include 'db_connect.php';
include 'functions.php';
if (isset($_POST['username'], $_POST['pword'])) {
    $username = $_POST['username'];
    $password = $_POST['pword']; // The hashed password.
    if (login($username, $password) == true) {
        // Login success 
        header('Location: welcome.html');
    } 
    else 
    {
        // Login failed 
        header('Location: index.html');
    }
} 
else {
    // The correct POST variables were not sent to this page. 
    echo 'Invalid Request';
}
?>

您没有为登录函数提供$con参数。

function login($username, $password, $con)

你称之为

login($username, $password)

请尝试提供连接参数,看看它是否有效。

还要注意金克鲁的回答。您正在使用来自不同库的函数。

我注意到

  • 你在表格中使用method="POST"
  • 您的SQL查询容易受到SQL注入的攻击
  • 您将mysql*与mysqli*函数混合使用
  • 登录功能缺少$con参数

您正在混合MySQLimysqli_query)和MySQL(mysql_num_rows)-决定哪一个(最好是前者)。

如果使用MySQL,则mysql_query的参数顺序错误。

除此之外,您未能将连接作为参数传递给login(正如WoLfulus所提到的)。


您似乎正在学习的一些附加信息:

  • loginreturn语句可以简化为return mysql_num_rows($result) == 1;。如果找到一条记录,它将返回TRUE,否则返回FALSE——这里不需要if/else语句,您已经拥有了所需的逻辑
  • 现在,任何人都可以访问welcome.html,而无需登录,只需在浏览器中键入地址即可。这可以通过使用会话来避免
  • 由于您没有正确地转义用户输入(这是永远不应该信任的!),您很容易受到SQL注入的攻击。mysql_real_escape_string是一个开始,但不是100%的解决方案。另一方面,如果你使用了事先准备好的陈述,你就不需要担心了

我之所以回答,是因为我没有足够的声誉来评论你的问题。。但是您应该将变量放在引号之外,并添加mysql_real_eescape_string()以防止mysql注入。。

$myQuery = "SELECT * FROM Members WHERE Username = '$username' and Password = '$password';";

应为:

$myQuery = "SELECT * FROM Members WHERE Username = '". mysql_real_escape_string($username) ."' and Password = '". mysql_real_escape_string($password) ."';";