it-swarm.com.de

PHP: So prüfen Sie, ob der Benutzer bereits angemeldet ist und die Anmeldeseite anderweitig umleitet

Ich bin neu bei PHP und habe mit folgenden Problemen zu kämpfen: 

Ich habe eine Seite, auf der ich prüfen möchte, ob jemand ein registrierter Benutzer ist, bevor er den Inhalt der Website sehen kann. Mein Gedanke war also, dass ich in meiner Header-Datei (die auf allen Einzelseiten über require_once("includes/header.php"); referenziert wird) dies überprüfen und auf eine Login-Seite (login.php) umleiten können, falls sie noch nicht angemeldet sind. 

Also hier ist alles, was ich in meinem Header habe:  

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

Jetzt funktioniert das nicht und ich denke, ich vermisse wahrscheinlich ein paar Dinge, aber ich konnte keine gute Anleitung oder Richtlinie dazu finden. Ich bin mir auch nicht sicher, ob ich noch etwas tun muss, um die Sitzung zu beginnen und einzurichten. 

Kann mir jemand dabei helfen?

Hinweis:
Hier geht es nur darum zu überprüfen, ob ein Benutzer bereits angemeldet ist, da die eigentliche Benutzerregistrierung und -prüfung auf der separaten Anmeldeseite durchgeführt wird und der Code dafür bereits funktioniert. 

Update: Das Aktivieren von Fehlermeldungen gibt die folgenden Fehler zurück: 

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

Update:
Gemäß den Kommentaren habe ich nun alles, was sich aktuell in der Kopfzeile befindet, gepostet.

Vielen Dank im Voraus.

5
TaneMahuta

Update: Die Frage wurde in chat gelöst.


Ändern Sie diesen Block gemäß Ihrer Bearbeitung:

<!DOCTYPE html>
<html>
    <head>
        <?php 
            define("someUnguessableVariable", "anotherUnguessableVariable");
            session_start();
            if(!(isset($_SESSION['login']) && $_SESSION['login'] != '')){
                header ("Location: login.php");
            }

zu:

<?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
            }
  • Folgen Sie der gleichen Struktur, um die Sitzung in allen Ihren Dateien mithilfe von Sitzungen zu starten.
  • Stellen Sie sicher, dass Ihre Datei keine Byte Order Mark (BOM) hat.
  • Kein Leerzeichen vor <?php usw. Dies wurde bereits in Kommentaren festgelegt.

Verwenden Sie einen Code-Editor wie Notepad ++ https://notepad-plus-plus.org/ und speichern Sie ihn als UTF-8 ohne BOM, wodurch sichergestellt wird, dass es keine Byte-Bestellmarke gibt.

Verwenden Sie außerdem die neue Methode für die Überprüfung Ihres Sitzungsarrays.

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

Stellen Sie außerdem sicher, dass keine Ihrer eingeschlossenen/erforderlichen Dateien dieselben Probleme aufweist, einschließlich login.php.


Fußnoten:

Im Notepad ++ Dropdown-Menü werden Sie sehen

  • Codierung. Es zeigt Ihnen, worauf die Kodierung der aktuellen Datei eingestellt ist.

Wenn eine Bytereihenfolge-Marke angezeigt wird, gehen Sie folgendermaßen vor:

  1. Klicken Sie auf "Encoding".
  2. Konvertieren Sie in UTF-8 ohne Stückliste
  3. Speicher die Datei.

    • Tun Sie dies für alle Ihre Dateien.

Verweise):


Randnotiz:

Sie sollten $stmt->execute(); in ändern

if(!$stmt->execute()){
    trigger_error("there was an error....".$conn->error, E_USER_WARNING);
}
  • Es ist besser, mögliche Fehler in Ihrer Abfrage zu erkennen.
10

Du musst dich bewegen 

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

an die Spitze des Scrips und bewegen Sie ! in die Halterung.

2
petebolduc

Fügen Sie das Benutzerprofil in Session-Variablen in das Skript PHP ein, das Sie nach der Anmeldeseite aufrufen

$_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"];

Fügen Sie den folgenden Code oben auf jeder Seite ein, die Sie durch nicht gültige Benutzer schützen möchten

<?php 
include("sessionCheck.php");
?>

Das sessionCheck-Skript In diesem Fall überprüfe ich auch, ob der Benutzer berechtigt ist, die bestimmte Seite mithilfe der Profil-ID anzuzeigen, aber Sie können sie entfernen 

<?php
    session_start();
    if(!IsSet($_SESSION['user_id']) or $_SESSION['profile_id'] !=1)
    {
        header("location: http://www.yourdomain.com/login.php?message=Invalid user");
    }   
?>
1
Luca

Der folgende Abschnitt sollte vor include "system/config.php"; gehen, da es so aussieht, als würde diese Datei ausgegeben und auch, dass der folgende Code nicht von anderen Daten abhängig ist.

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

Zweite:

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

Sollte wahrscheinlich sein: if(!isset($_SESSION['login']) && $_SESSION['login'] == ''){

bedeutung == '' und nicht != ''

Für einen nicht angemeldeten Benutzer wird höchstwahrscheinlich (abhängig von Ihrem Code) kein Wert festgelegt. Der Code überprüft, ob er nicht leer ist, sodass nur angemeldete Benutzer weitergeleitet werden.

Daher:

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

Wenn keine Weiterleitung erfolgt, ist höchstwahrscheinlich $ _SESSION ['login'] gesetzt. Sie müssen Ihre Cookies für diese Domain löschen.

1
Onimusha