在你说之前:我知道密码应该加密/哈希,但我想先把它记下来:我有这个登录功能和一个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
参数
您正在混合MySQLi(mysqli_query
)和MySQL(mysql_num_rows
)-决定哪一个(最好是前者)。
如果使用MySQL,则mysql_query
的参数顺序错误。
除此之外,您未能将连接作为参数传递给login
(正如WoLfulus所提到的)。
您似乎正在学习的一些附加信息:
login
的return
语句可以简化为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) ."';";