PHP: 如何检查用户是否已经登录,否则重定向到登录页面
PHP: How to check if user is already logged in and otherwise redirect to login page
我是 PHP 的新手,正在努力解决以下问题:
我有一个页面,我想在让他们查看网站内容之前检查某人是否是注册用户。
所以我的想法是,在我的 header 文件中(通过 require_once("includes/header.php");
在所有单页上引用)我可以检查它并将它们重定向到登录页面 (login.php
) 如果他们有还没有登录。
所以这是我 header 中的所有内容:
<!DOCTYPE html>
<html>
<head>
<?php
define("someUnguessableVariable", "anotherUnguessableVariable");
session_start();
if(!(isset($_SESSION['login']) && $_SESSION['login'] != '')){
header ("Location: login.php");
}
include "system/config.php";
$pageURL = basename($_SERVER["REQUEST_URI"]);
$pageName = pathinfo(parse_url($pageURL, PHP_URL_PATH), PATHINFO_FILENAME);
$selectedLang = $_GET["lang"];
if(!isset($selectedLang)){
$selectedLang = "de";
}
$langURL = "?lang=" . $selectedLang;
$conn = new mysqli($dbServer, $dbUser, $dbPass, $dbName);
$conn->set_charset("utf8");
if($conn->connect_error){
die("Connection failed: " . $conn->connect_error);
}
// fetch main translations
$location = "%main%";
$stmt = $conn->prepare("SELECT tID, " . $selectedLang . " FROM TranslationsMain WHERE location LIKE ? ORDER BY tID");
$stmt->bind_param("s", $location);
$stmt->execute();
$result = $stmt->get_result();
while($arrTranslations = $result->fetch_assoc()){
$trans[] = array("ID" => $arrTranslations["tID"], "trans" => $arrTranslations[$selectedLang]);
}
$conn->close();
// get main translations by ID
function fetchTransMain($trans, $itemID){
foreach($trans as $key => $val){
if($val["ID"] == $itemID){
return $val["trans"];
}
}
}
?>
<meta charset="utf-8" />
<meta http-equiv="X-UA-Compatible" content="IE=edge" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<meta name="author" content="Some author" />
<meta name="description" content="Created: 2015-06" />
<base href="http://www.myurl.de" target="_self" />
<title>Some title</title>
<!-- CSS -->
<link rel="stylesheet" type="text/css" href="includes/styles.css" />
<!-- CSS - Font Awesome -->
<link rel="stylesheet" type="text/css" href="http://maxcdn.bootstrapcdn.com/font-awesome/4.3.0/css/font-awesome.min.css" />
<!-- include favicon -->
<link rel="shortcut icon" href="images/favicon/favicon.ico" type="image/x-icon" />
<link rel="icon" href="images/favicon/favicon.png" type="image/png" />
<link rel="icon" sizes="32x32" href="images/favicon/favicon-32.png" type="image/png" />
<link rel="icon" sizes="64x64" href="images/favicon/favicon-64.png" type="image/png" />
<link rel="icon" sizes="96x96" href="images/favicon/favicon-96.png" type="image/png" />
<link rel="icon" sizes="196x196" href="images/favicon/favicon-196.png" type="image/png" />
<link rel="apple-touch-icon" sizes="152x152" href="images/favicon/apple-touch-icon.png" />
<link rel="apple-touch-icon" sizes="60x60" href="images/favicon/apple-touch-icon-60x60.png" />
<link rel="apple-touch-icon" sizes="76x76" href="images/favicon/apple-touch-icon-76x76.png" />
<link rel="apple-touch-icon" sizes="114x114" href="images/favicon/apple-touch-icon-114x114.png" />
<link rel="apple-touch-icon" sizes="120x120" href="images/favicon/apple-touch-icon-120x120.png" />
<link rel="apple-touch-icon" sizes="144x144" href="images/favicon/apple-touch-icon-144x144.png" />
<meta name="msapplication-TileImage" content="favicon-144.png" />
<meta name="msapplication-TileColor" content="#ffffff" />
<script>
var baseURL = '<?php echo $baseURL; ?>';
var pageURL = '<?php echo $pageURL; ?>';
var pageName = '<?php echo $pageName; ?>';
var selectedLang = '<?php echo $selectedLang; ?>';
</script>
</head>
<body>
现在这行不通了,我想我可能遗漏了一些东西,但我找不到好的教程或指南。
此外,我不确定是否还需要做任何其他事情才能启动和设置 session。
有人可以帮我解决这个问题吗?
注:
这只是关于检查用户是否已经登录,因为所有实际的用户注册和验证都是在单独的登录页面上完成的,为此我已经有了代码。
更新:
启用错误消息 returns 以下错误:
Warning: session_start(): Cannot send session cookie - headers already sent by (output started at /homepages/21/d580042014/htdocs/index.php:2) in /homepages/21/d580042014/htdocs/includes/header.php on line 9
Warning: session_start(): Cannot send session cache limiter - headers already sent (output started at /homepages/21/d580042014/htdocs/index.php:2) in /homepages/21/d580042014/htdocs/includes/header.php on line 9
array(0) { }
Warning: Cannot modify header information - headers already sent by (output started at /homepages/21/d580042014/htdocs/index.php:2) in /homepages/21/d580042014/htdocs/includes/header.php on line 12
Notice: Undefined index: lang in /homepages/21/d580042014/htdocs/includes/header.php on line 18
更新:
根据评论,我现在发布了 header.
中的所有内容
非常感谢。
将用户配置文件放入您在登录页面后调用的 PHP 脚本中的会话变量中
$_SESSION['user_id'] = $row["user_id"];
$_SESSION['profile_id'] = $row["profile_id"];
$_SESSION['name'] = $row["name"];
$_SESSION['surname'] = $row["surname"];
$_SESSION['application_auth'] = $row["application_auth"];
将以下代码放在您要保护的无效用户的每个页面的顶部
<?php
include("sessionCheck.php");
?>
会话检查脚本
在这种情况下,我还会检查用户是否有权使用 profile_id 查看特定页面,但您可以将其删除
<?php
session_start();
if(!IsSet($_SESSION['user_id']) or $_SESSION['profile_id'] !=1)
{
header("location: http://www.yourdomain.com/login.php?message=Invalid user");
}
?>
你需要移动
session_start();
if((!isset($_SESSION['login']) && $_SESSION['login'] != '')){
header ("Location: login.php");
}
到纸条的顶部并将 !
移到括号内。
下面的部分应该放在 include "system/config.php";
之前,因为看起来这个文件正在输出,而且下面的代码不依赖于任何其他数据。
session_start();
if(!(isset($_SESSION['login']) && $_SESSION['login'] != '')){
header ("Location: login.php");
}
第二个:
if(!(isset($_SESSION['login']) && $_SESSION['login'] != '')){
大概应该是:if(!isset($_SESSION['login']) && $_SESSION['login'] == ''){
意思是== ''
而不是!= ''
未登录的用户很可能(取决于您的代码)没有设置值,因此您的代码将检查它是否不为空,因此只有登录的用户才会被转发。
因此:
<?php
define("someUnguessableValue", "anotherUnguessableValue");
session_start();
if(!isset($_SESSION['login']) && $_SESSION['login'] == ''){
header("location:login.php");
}
include "system/config.php";
//.... the rest
?>
<!DOCTYPE html>
<html>
<head>
如果不是转发,则很可能设置了 $_SESSION['login'],您需要清除该域的 cookie。
更新:问题已在chat中解决。
根据您的编辑,更改此块:
<!DOCTYPE html>
<html>
<head>
<?php
define("someUnguessableVariable", "anotherUnguessableVariable");
session_start();
if(!(isset($_SESSION['login']) && $_SESSION['login'] != '')){
header ("Location: login.php");
}
至:
<?php
session_start();
?>
<!DOCTYPE html>
<html>
<head>
<?php
define("someUnguessableVariable", "anotherUnguessableVariable");
if(!isset($_SESSION['login']) && $_SESSION['login'] != ''){
header ("Location: login.php");
exit; // stop further executing, very important
}
- 按照相同的结构在所有使用会话的文件中启动会话。
- 确保您的文件没有字节顺序标记 (BOM)。
- 在
<?php
之前没有space等。这已经在评论中建立了。
使用Notepad++等代码编辑器https://notepad-plus-plus.org/保存为无BOM的UTF-8格式,保证没有字节序标记。
此外,使用新方法进行会话数组检查。
if(!isset($_SESSION['login']) && $_SESSION['login'] != ''){
同时检查 none 个 included/required 文件是否存在相同问题,包括 login.php
.
脚注:
在Notepad++的下拉菜单中,你会看到
- 编码。它会告诉你当前文件的编码设置是什么。
如果确实显示字节顺序标记,请执行以下步骤:
- 点击“编码”。
- 转换为无 BOM 的 UTF-8
- 保存文件。
- 对所有文件执行此操作。
参考文献:
- How to fix "Headers already sent" error in PHP
旁注:
您应该将 $stmt->execute();
更改为
if(!$stmt->execute()){
trigger_error("there was an error....".$conn->error, E_USER_WARNING);
}
- 最好在查询中发现可能的错误。
我是 PHP 的新手,正在努力解决以下问题:
我有一个页面,我想在让他们查看网站内容之前检查某人是否是注册用户。
所以我的想法是,在我的 header 文件中(通过 require_once("includes/header.php");
在所有单页上引用)我可以检查它并将它们重定向到登录页面 (login.php
) 如果他们有还没有登录。
所以这是我 header 中的所有内容:
<!DOCTYPE html>
<html>
<head>
<?php
define("someUnguessableVariable", "anotherUnguessableVariable");
session_start();
if(!(isset($_SESSION['login']) && $_SESSION['login'] != '')){
header ("Location: login.php");
}
include "system/config.php";
$pageURL = basename($_SERVER["REQUEST_URI"]);
$pageName = pathinfo(parse_url($pageURL, PHP_URL_PATH), PATHINFO_FILENAME);
$selectedLang = $_GET["lang"];
if(!isset($selectedLang)){
$selectedLang = "de";
}
$langURL = "?lang=" . $selectedLang;
$conn = new mysqli($dbServer, $dbUser, $dbPass, $dbName);
$conn->set_charset("utf8");
if($conn->connect_error){
die("Connection failed: " . $conn->connect_error);
}
// fetch main translations
$location = "%main%";
$stmt = $conn->prepare("SELECT tID, " . $selectedLang . " FROM TranslationsMain WHERE location LIKE ? ORDER BY tID");
$stmt->bind_param("s", $location);
$stmt->execute();
$result = $stmt->get_result();
while($arrTranslations = $result->fetch_assoc()){
$trans[] = array("ID" => $arrTranslations["tID"], "trans" => $arrTranslations[$selectedLang]);
}
$conn->close();
// get main translations by ID
function fetchTransMain($trans, $itemID){
foreach($trans as $key => $val){
if($val["ID"] == $itemID){
return $val["trans"];
}
}
}
?>
<meta charset="utf-8" />
<meta http-equiv="X-UA-Compatible" content="IE=edge" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<meta name="author" content="Some author" />
<meta name="description" content="Created: 2015-06" />
<base href="http://www.myurl.de" target="_self" />
<title>Some title</title>
<!-- CSS -->
<link rel="stylesheet" type="text/css" href="includes/styles.css" />
<!-- CSS - Font Awesome -->
<link rel="stylesheet" type="text/css" href="http://maxcdn.bootstrapcdn.com/font-awesome/4.3.0/css/font-awesome.min.css" />
<!-- include favicon -->
<link rel="shortcut icon" href="images/favicon/favicon.ico" type="image/x-icon" />
<link rel="icon" href="images/favicon/favicon.png" type="image/png" />
<link rel="icon" sizes="32x32" href="images/favicon/favicon-32.png" type="image/png" />
<link rel="icon" sizes="64x64" href="images/favicon/favicon-64.png" type="image/png" />
<link rel="icon" sizes="96x96" href="images/favicon/favicon-96.png" type="image/png" />
<link rel="icon" sizes="196x196" href="images/favicon/favicon-196.png" type="image/png" />
<link rel="apple-touch-icon" sizes="152x152" href="images/favicon/apple-touch-icon.png" />
<link rel="apple-touch-icon" sizes="60x60" href="images/favicon/apple-touch-icon-60x60.png" />
<link rel="apple-touch-icon" sizes="76x76" href="images/favicon/apple-touch-icon-76x76.png" />
<link rel="apple-touch-icon" sizes="114x114" href="images/favicon/apple-touch-icon-114x114.png" />
<link rel="apple-touch-icon" sizes="120x120" href="images/favicon/apple-touch-icon-120x120.png" />
<link rel="apple-touch-icon" sizes="144x144" href="images/favicon/apple-touch-icon-144x144.png" />
<meta name="msapplication-TileImage" content="favicon-144.png" />
<meta name="msapplication-TileColor" content="#ffffff" />
<script>
var baseURL = '<?php echo $baseURL; ?>';
var pageURL = '<?php echo $pageURL; ?>';
var pageName = '<?php echo $pageName; ?>';
var selectedLang = '<?php echo $selectedLang; ?>';
</script>
</head>
<body>
现在这行不通了,我想我可能遗漏了一些东西,但我找不到好的教程或指南。 此外,我不确定是否还需要做任何其他事情才能启动和设置 session。
有人可以帮我解决这个问题吗?
注:
这只是关于检查用户是否已经登录,因为所有实际的用户注册和验证都是在单独的登录页面上完成的,为此我已经有了代码。
更新: 启用错误消息 returns 以下错误:
Warning: session_start(): Cannot send session cookie - headers already sent by (output started at /homepages/21/d580042014/htdocs/index.php:2) in /homepages/21/d580042014/htdocs/includes/header.php on line 9
Warning: session_start(): Cannot send session cache limiter - headers already sent (output started at /homepages/21/d580042014/htdocs/index.php:2) in /homepages/21/d580042014/htdocs/includes/header.php on line 9
array(0) { }
Warning: Cannot modify header information - headers already sent by (output started at /homepages/21/d580042014/htdocs/index.php:2) in /homepages/21/d580042014/htdocs/includes/header.php on line 12
Notice: Undefined index: lang in /homepages/21/d580042014/htdocs/includes/header.php on line 18
更新:
根据评论,我现在发布了 header.
非常感谢。
将用户配置文件放入您在登录页面后调用的 PHP 脚本中的会话变量中
$_SESSION['user_id'] = $row["user_id"];
$_SESSION['profile_id'] = $row["profile_id"];
$_SESSION['name'] = $row["name"];
$_SESSION['surname'] = $row["surname"];
$_SESSION['application_auth'] = $row["application_auth"];
将以下代码放在您要保护的无效用户的每个页面的顶部
<?php
include("sessionCheck.php");
?>
会话检查脚本 在这种情况下,我还会检查用户是否有权使用 profile_id 查看特定页面,但您可以将其删除
<?php
session_start();
if(!IsSet($_SESSION['user_id']) or $_SESSION['profile_id'] !=1)
{
header("location: http://www.yourdomain.com/login.php?message=Invalid user");
}
?>
你需要移动
session_start();
if((!isset($_SESSION['login']) && $_SESSION['login'] != '')){
header ("Location: login.php");
}
到纸条的顶部并将 !
移到括号内。
下面的部分应该放在 include "system/config.php";
之前,因为看起来这个文件正在输出,而且下面的代码不依赖于任何其他数据。
session_start();
if(!(isset($_SESSION['login']) && $_SESSION['login'] != '')){
header ("Location: login.php");
}
第二个:
if(!(isset($_SESSION['login']) && $_SESSION['login'] != '')){
大概应该是:if(!isset($_SESSION['login']) && $_SESSION['login'] == ''){
意思是== ''
而不是!= ''
未登录的用户很可能(取决于您的代码)没有设置值,因此您的代码将检查它是否不为空,因此只有登录的用户才会被转发。
因此:
<?php
define("someUnguessableValue", "anotherUnguessableValue");
session_start();
if(!isset($_SESSION['login']) && $_SESSION['login'] == ''){
header("location:login.php");
}
include "system/config.php";
//.... the rest
?>
<!DOCTYPE html>
<html>
<head>
如果不是转发,则很可能设置了 $_SESSION['login'],您需要清除该域的 cookie。
更新:问题已在chat中解决。
根据您的编辑,更改此块:
<!DOCTYPE html>
<html>
<head>
<?php
define("someUnguessableVariable", "anotherUnguessableVariable");
session_start();
if(!(isset($_SESSION['login']) && $_SESSION['login'] != '')){
header ("Location: login.php");
}
至:
<?php
session_start();
?>
<!DOCTYPE html>
<html>
<head>
<?php
define("someUnguessableVariable", "anotherUnguessableVariable");
if(!isset($_SESSION['login']) && $_SESSION['login'] != ''){
header ("Location: login.php");
exit; // stop further executing, very important
}
- 按照相同的结构在所有使用会话的文件中启动会话。
- 确保您的文件没有字节顺序标记 (BOM)。
- 在
<?php
之前没有space等。这已经在评论中建立了。
使用Notepad++等代码编辑器https://notepad-plus-plus.org/保存为无BOM的UTF-8格式,保证没有字节序标记。
此外,使用新方法进行会话数组检查。
if(!isset($_SESSION['login']) && $_SESSION['login'] != ''){
同时检查 none 个 included/required 文件是否存在相同问题,包括 login.php
.
脚注:
在Notepad++的下拉菜单中,你会看到
- 编码。它会告诉你当前文件的编码设置是什么。
如果确实显示字节顺序标记,请执行以下步骤:
- 点击“编码”。
- 转换为无 BOM 的 UTF-8
- 保存文件。
- 对所有文件执行此操作。
参考文献:
- How to fix "Headers already sent" error in PHP
旁注:
您应该将 $stmt->execute();
更改为
if(!$stmt->execute()){
trigger_error("there was an error....".$conn->error, E_USER_WARNING);
}
- 最好在查询中发现可能的错误。