我遇到了重定向用户的问题。我想在我指定的页面上登陆用户。
我试过
header("Location: http://www.website.com");
但它不起作用。
当我使用正确的密码和电子邮件以测试用户身份登录时,login.php
页面保持不变。我希望用户改为index.php
。
我的第二个问题是,如果用户未登录并尝试输入index.php,我该如何将用户重定向到登录页面(login.php)
这是我的登录代码(login.php) 注意:(所有php代码都在html行之上)
<?php
session_start();
$message = "";
if (count($_POST) > 0) {
$conn = mysql_connect("localhost", "user name", "password") or die(mysql_error());
mysql_select_db("db_name", $conn);
$result = mysql_query("SELECT * FROM users WHERE user_name='" . $_POST["user_name"] . "' and password = '" . $_POST["password"] . "'");
$row = mysql_fetch_array($result);
if (is_array($row)) {
$_SESSION["user_id"] = $row[user_id];
$_SESSION["user_name"] = $row[user_name];
} else {
$message = "Invalid Username or Password!";
}
}
if (isset($_SESSION["user_id"])) {
header("Location: login.php");
}
?>
我想重定向用户,如果没有登录,则想登陆login.php上的用户
答案 0 :(得分:2)
你在这里遇到一些问题:Sql注入,密码存储为纯文本,你使用已从PHP 7中删除的已弃用的mysql_*
函数。
除此之外,你的逻辑错误:
if (isset($_SESSION["user_id"])) {
header("Location: login.php");
}
应该是:
if (!isset($_SESSION["user_id"])) {
// ^ redirect to login if the variable is NOT set
header("Location: login.php");
}
有关sql注入/准备语句和密码哈希的详细信息,请参阅以下链接:
答案 1 :(得分:0)
检查login.php中起始<?php
标记上方是否有空行。
你的查询中也有mysql注入。如果输入' or 'a'='a
作为密码,则查询将为
"SELECT * FROM users WHERE user_name='' and password = '' or 'a'='a'"
所以它会忽略任何用户名或密码保护。您需要转义传递给查询的变量。最简单的方法是
"SELECT * FROM users WHERE user_name='" . addslashes($_POST["user_name"]) . "' and password = '". addslashes($_POST["password"]) ."'"
How can I prevent SQL injection in PHP?
您的代码还存在其他一些问题:
mysql_fetch_array
返回表单array(0 => 'field value 1', 1 => 'field value 2')
的数组,依此类推。对于关联数组(字段名称为数组键),您需要mysql_fetch_assoc
。
$row[user_id]
这里的user_id是一个常量,但是如果没有设置它会返回一个字符串user_id
,但你应该避免这种用法并以正确的方式进行$row['user_id']
$row = mysql_fetch_assoc($result);
if (is_array($row)) {
$_SESSION["user_id"] = $row['user_id'];
$_SESSION["user_name"] = $row['user_name'];
} else {
$message = "Invalid Username or Password!";
}
由于您没有触发重定向,唯一的可能是没有找到用户或您有mysql错误。您可以使用echo mysql_error();
答案 2 :(得分:0)
1
正如Jeroen正确指出的那样,您需要使用MySQL_
停止,因为它已被弃用。无论您的托管服务提供商拥有什么版本的PHP,您都应该努力升级并更新至MySQLi_
至少,如果没有(有更多时间和学习),您可以使用MySQLi Prepared Statements或PDO Prepared Statements。
<强> 2 强>
如果您无法理解PHP脚本正在输出的行为 - 您希望它能够正常工作,那么解决方案几乎总是在PHP错误日志中。请阅读how to output PHP errors。如果您的问题,这将为您提供简明扼要的信息。
3 (这是重要的一点,也是我回答的动力)
虽然Jeroens的回答似乎是正确的,但有一个非常重要的警告已经被遗漏了,那就是一旦你写了重定向标题以将用户带到目标页面,你 必须 使用die
或exit
命令执行此操作,否则脚本将继续运行,但只会将用户带到“*最后遇到的标题位置”。
一个例子:
if($login === false){
header("Location: login.php");
}
header("Location: welcome.php");
每次运行时,用户都将被带到welcome.php
,因为即使他们没有登录,脚本也会执行两个标题,但只会跟随最近的标题,最后一个标题。
因此,请始终在标头后立即添加exit
语句 ,以确保它们按预期重定向。
if($login === false){
header("Location: login.php");
exit;
}
header("Location: welcome.php");
exit;
4
在成为习惯之前,请尽量避免不良习惯,正如Jeroen所提到的那样, 不应将密码存储为纯文本 ,至少要研究{{ 3}}
同时引用您的数组键,以便$row[user_id];
变为$row['user_id'];
从不 信任用户提供的数据,例如$_POST
或$_GET
或$_COOKIE
数据,它可以很容易地被篡改和被用户或任何various hashing methods滥用。尝试并习惯使用MITM以及完全转义和清除所有用户提供的数据。
答案 3 :(得分:0)
下面的if语句应在session_start()函数之后;
if (isset($_SESSION["user_id"])) {
header("Location: login.php");
}