簡體   English   中英

PHP:如何檢查用戶是否已登錄,否則重定向到登錄頁面

[英]PHP: How to check if user is already logged in and otherwise redirect to login page

我是PHP新手,我正在努力解決以下問題:

我有一個頁面,我想在他們看到網站內容之前檢查某人是否是注冊用戶。 所以我的想法是在我的頭文件中(通過require_once("includes/header.php");在所有單個頁面上引用require_once("includes/header.php"); )我可以檢查它並將它們重定向到登錄頁面( login.php ),如果他們有尚未登錄

所以這是我在標題中的所有內容:

<!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>

現在這不起作用,我想我可能錯過了一些事情,但我找不到一個好的教程或指南。 此外,我不確定我是否還需要做任何其他事情來啟動和設置會話。

有人可以幫我弄這個嗎 ?

注意:
這僅僅是關於檢查用戶是否已經登錄,因為所有實際的用戶注冊和驗證都是在單獨的登錄頁面上完成的,為此我已經使用了代碼。

更新:啟用錯誤消息將返回以下錯誤:

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

更新:
根據評論,我現在發布了當前標題中的所有內容。

提前謝謝了。

更新:問題已在聊天中解決。


根據您的編輯,更改此塊:

<!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等之前沒有空格這已經在評論中建立了。

使用代碼編輯器(如Notepad ++ https://notepad-plus-plus.org/)並將其保存為不帶BOM的UTF-8,以確保沒有字節順序標記。

此外,使用新方法進行會話數組檢查。

if(!isset($_SESSION['login']) && $_SESSION['login'] != ''){

還要檢查您的所包含/所需文件是否都有相同的問題,包括login.php


腳注:

在Notepad ++的下拉菜單中,你會看到

  • 編碼。 它將顯示當前文件的編碼設置為什么。

如果它確實顯示字節順序標記,請按照下列步驟操作:

  1. 單擊“編碼”。
  2. 轉換為沒有BOM的UTF-8
  3. 保存文件。

    • 為您的所有文件執行此操作。

參照(一個或多個):


邊注:

你應該改變$stmt->execute();

if(!$stmt->execute()){
    trigger_error("there was an error....".$conn->error, E_USER_WARNING);
}
  • 最好在查詢中捕獲可能的錯誤。

你需要搬家

session_start();
if((!isset($_SESSION['login']) && $_SESSION['login'] != '')){
    header ("Location: login.php");
}

到頂部的腳本並移動! 在支架內。

將用戶配置文件放在您在登錄頁面后調用的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");
?>

sessionCheck腳本在這種情況下,我還檢查用戶是否有權使用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");
    }   
?>

以下部分應該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。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM