问题描述
您好,我遇到这个错误已经很长时间了。 所以基本上这里是通过代码:
function loginUser($conn,$username,$password) {
$checkExists = checkExists($conn,$username);
if ($checkExists === false) {
header("Location: ../login.PHP?error=wronglogininfo");
exit();
}
$passwordHashed = $checkExists['password'];
$checkPassword = password_verify($password,$passwordHashed);
if ($checkPassword === false) {
header("Location: ../login.PHP?error=wronglogin");
exit();
} elseif ($checkPassword === true) {
$query = "SELECT * FROM users WHERE username='$username' AND password='$checkPassword'";
$query_run = MysqLi_query($conn,$query);
$usertypes = MysqLi_fetch_array($query_run);
if ($usertypes['usertype'] == "admin") {
header('Location: ../login.PHP?admin');
} elseif ($usertypes['usertype'] == "user") {
header('Location: ../login.PHP?user');
}
}
}
function checkExists($conn,$email) {
$sql = "SELECT * FROM users WHERE username = ? OR email = ?;";
$stmt = MysqLi_stmt_init($conn);
if (!MysqLi_stmt_prepare($stmt,$sql)) {
header("Location: ../register.PHP?error=stmtFailed");
exit();
}
MysqLi_stmt_bind_param($stmt,"ss",$email);
MysqLi_stmt_execute($stmt);
$resultData = MysqLi_stmt_get_result($stmt);
if ($row = MysqLi_fetch_assoc($resultData)) {
return $row;
} else {
$result = false;
return $result;
}
MysqLi_stmt_close($stmt);
}
所以错误工作正常。 真正的问题是,每当我使用正确的凭据登录时,它都会将我发送到一个 404 页面,其中包含一个我从未放置过的目录。我希望它发送到管理面板或用户页面。有人可以帮忙吗?
解决方法
这个选择看起来像一条毁灭之路:SELECT * FROM users WHERE username='$username' AND password='$checkPassword' 如果 $checkPassword 是 password_verify() 的结果。 (还要注意可能的 SQL注入。)
我怀疑这是您的主要问题。这基本上会将您的查询转换为:
Exception: Cannot call SpreadsheetApp.getUi() from this context.
这可能会返回一个空的结果集,但您的下一个if 语句期望的是一个填充有数据的用户数组。
SELECT * FROM users WHERE username = 'tony' AND password = '1';
现在发生了什么?您不会被重定向到任何地方,当前脚本将继续处理。那你能做什么?
如果你已经有了用户行,通过 checkExists() (这可能是 命名更好?),为什么要再次调用数据库以获取 用户类型?
您已经可以访问您的用户数组,因为您在上面调用了 if ($usertypes['usertype'] == "admin") {
header('Location: ../login.php?admin');
} elseif ($usertypes['usertype'] == "user") {
header('Location: ../login.php?user');
}
并验证它不是假的。直接使用数组即可。
我只是稍微清理了您的代码并添加了一些注释。我没有以任何方式更改您的查询,也没有验证它们是否正确。
checkExists