Frage zu 'Sessions' Skript

userjules

Mitglied
Hallo liebe Leute,

ich hab für einen geschützten Bereich auf meiner Seite ein Login Skript gebastelt. Die Zugriffsberechtigung wird auf den geschützten Seiten über folgende checkuser.php kontrolliert, welche dann per 'include' auf den seiten integriert ist.

checkuser.php
PHP:
<?php 
session_start (); 
if (!isset ($_SESSION["user_id"])) 
{ 
  header ("Location: ../content/anmeldefehler.php"); 
} 
?>

funktioniert einwandfrei. Allerdings natürlich nur auf den Seiten, die eben dieses Skript ausführen. Bis hierhin alles klar !

Wenn nun ein user der bereits eingeloggt ist, auf eine Seite zugreift die nicht geschützt ist, fliegt er wieder raus (zumindest wir sein Loginstatus nicht mehr angezeigt, sondern wieder das Formular).
Meine vorhandene checkuser.php (s.o.) "schickt" user die nicht eingeloggt sind auf die anmeldefehler.php. Das macht Sinn für den geschützten Bereich, aber nicht für den ungeschützten. Sie sollen ja die Seiten auch sehen können, nur eben einige geschützte nicht. Cookies möchte ich vermeiden, da user die die seite verlassen, auch nicht eingeloggt bleiben müssen.
Das geht doch auch bestimmt mit ner einfachen session !?

PHP:
<?php 
session_start (); 
if (!isset ($_SESSION["user_id"])) 
{ 
  // Meine Frage
  Was muss hierhin ?
  // Ende meine Frage
} 
?>

Ist ja bis auf "Was muss hierhin ?" sicher ein ganz guter Ansatz.
Kann mir jemand helfen ?

Vielen Dank im Voraus
 
Wenn ich das richtig verstanden habe, ist die Lösung ganz einfach!

Geschütze Seiten schütz du mit:
PHP:
<?php 
session_start (); 
if (!isset ($_SESSION["user_id"])) 
{ 
  header ("Location: ../content/anmeldefehler.php"); 
} 
?>

Und ungeschütze Seiten, also Seiten auf die ein eingeloggter User aber auch ein nicht eingeloggter User zugreifen kann lässt du ganz normal, also ohne Abfrage!
 
Nee, nicht ganz verstanden ! Mag an meiner Formulierung liegen ;-)

User die bereits angemeldet sind sollen auch ungeschützte seiten aufrufen können ohne abgemeldet zu werden. Dazu muss ja auf jeder Seite eine Abfrage stattfinden.

Also, angemeldete user haben Zugriff auf alle Bereiche. Nicht angemeldete user bekommen beim aufruf geschützter seiten eine fehlermeldung in form der 'anmeldefehler.php'.
Der Knackpunkt ist:
Ruft ein angemeldeter user eine ungeschützte seite auf wird sein Login-Status nicht mehr angezeigt, da ja keine abfrage stattfindet.
 
Zuletzt bearbeitet:
Wie sehen den deine ungeschützten Seiten aus? Eigentlich sollte kein User einfach ausgeloggt werden, vllt liegt es daran das du in deinen ungeschützten Seiten kein session_start() verwendest?

Achja:
Ruft ein angemeldeter user eine ungeschützte seite auf wird sein Login-Status nicht mehr angezeigt, da ja keine abfrage stattfindet.

Dann mach doch eine Abfrage rein, wenn er angemeldet ist soll er das und das angezeigt bekommen!
 
Du magst rechthaben. Ich muss also in jede Seite quasi einen Session Start einbauen ?
Die Seite sieht z. Bsp. so aus:

HTML:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Die Redaktion</title>
<meta http-equiv="imagetoolbar" content="no" />
<meta name="description" content="content" />
<meta name="keywords" content="content" />
<link rel="shortcut icon" href="../favicon.ico" />
<script src="../SpryAssets/SpryMenuBar.js" type="text/javascript"></script>
<link href="../css/style.css" rel="stylesheet" type="text/css" media="screen" />
<style type="text/css">
<!--

-->
</style></head>

<body>

<!-- Wrapper Anfang -->
<div id="wrapper">
  
  <div class="Stil1" id="header">
  <img src="../images/logo.jpg" style="float:left" alt="logo" width="370" height="122" class="logo" />
  <div align="right" id="login">
<?php 
if (isset ($_REQUEST["fehler"])) 
{ 
  echo "Die Zugangsdaten waren ung&uuml;ltig."; 
} 
?> 
<form action="../login.php" method="post"> 
    <span class="Stil2">Name:</span> 
    <input type="text" name="name" size="20"><br> 
  <span class="Stil2">Kennwort:</span> 
  <input type="password" name="pwd" size="20"><br> 
  <input type="submit" value="Login"> 
</form>  
</div>
  </div>
  
  <!-- Menu Anfang -->
  <div id="menudiv">
  
  <ul id="MenuBar1" class="MenuBarHorizontal">
  <li><a href="../../index.php" class="MenuBarItemSubmenu">Startseite</a>  </li>
  
  <li><a href="../../content/ueber.php" class="MenuBarItemSubmenu">&Uuml;ber uns</a>
      <ul>
        <li><a href="../../content/unternehmen.php">Das Unternehmen</a></li>
        <li><a href="../../content/redaktion.php">Die Redaktion</a></li>
        <li><a href="../../content/kontakt.php">Kontakt</a></li>
        <li><a href="../../content/impressum.php">Impressum</a></li>
        <li><a href="../../content/agb.php">AGB</a></li>
        <li><a href="../../content/datenschutz.php">Datenschutz</a></li>
      </ul>
  </li>
  
  <li><a href="#" class="MenuBarItemSubmenu">Service</a>
      <ul>
        <li><a href="../../content/newsundmarkt.php">News und <br />Marktberichte</a></li>
        <li><a href="../../content/partner.php">Partner-Links</a></li>
        <li><a href="../../content/finanzlinks.php">Finanzlinks</a></li>
        <li><a href="../../content/empfehlung.php">Weiterempfehlung</a></li>
        <li><a href="../../content/lexikon.php">B&ouml;rsenlexikon</a></li>
        <li><a href="../../content/goldenes.php">Goldene Regeln</a></li>
      </ul>
  </li>
  
  <li><a href="../../../briefe/bb.php" class="MenuBarItemSubmenu"></a>
      <ul>
        <li><a href="../../briefe/bb_silver.php"></a></li>
        <li><a href="../../briefe/bb_gold.php"></a></li>
        <li><a href="../../briefe/bb_platin.php"></a></li>
      </ul>
  </li>
  
  <li><a href="../../content/kontakt.php" class="MenuBarItemSubmenu">Kontakt</a>  </li>
</ul>

<script type="text/javascript">
<!--
var MenuBar1 = new Spry.Widget.MenuBar("MenuBar1", {imgDown:"", imgRight:""});
//-->
</script>
</div>
<!-- Menu Ende -->
  
  <!-- Prevent Anfang -->
  <div id="prevent">
  
  <!-- Left Anfang -->
  <div class="left">
    <a href="testzugang.php"><img class="banner_left" src="../images/Banner_1.jpg" alt="strat" /></a>  </div>
  <!-- Left Ende -->
  
  <div id="contentimage"><img src="../images/redaktion.jpg" /></div>
  
  <!-- Content Anfang -->
  <div id="content" align="center">
  
  <br />
    <h2>Die Redaktion</h2>
    <p>Die Redaktion von x  ist ein kleines Team von Spezialisten, welche 
      über viele Jahre an Erfahrung verfügen. Die Redaktion ist stets bemüht unseren 
      Kunden, Informationen derart darzustellen, das auch der Laie in die Lage versetzt 
      wird unseren Empfehlungen zu folgen.<br />
      <br />
      Für Fragen steht Ihnen unsere Reaktion während der  zur Verfügung.<br />
      Nutzen Sie einfach unser <a href="../content/kontakt.php">Kontaktformular</a> um mit uns in Kontakt zu treten, oder schreiben sie eine Email an <a href="mailto:redaktion@">redaktion@</a>      </p>
  
  <!-- Footer Anfang -->
  <div align="center" class="footer">Copyright &copy; <br />
    <a href="../../content/agb.php">AGB</a> <a href="../../content/impressum.php">Impressum</a>
  </div>
  <!-- Footer Ende -->
  
  </div>
  <!-- Content Ende -->
  
  </div>
  <!-- Prevent Ende -->
  
  </div>
  <!-- Wrapper Ende -->
  
</body>
</html>

...ausserdem
Achja:
Zitat:
Ruft ein angemeldeter user eine ungeschützte seite auf wird sein Login-Status nicht mehr angezeigt, da ja keine abfrage stattfindet.
Dann mach doch eine Abfrage rein, wenn er angemeldet ist soll er das und das angezeigt bekommen!

Das ist ja meine Frage !
PHP:
<?php 
session_start (); 
if (!isset ($_SESSION["user_id"])) 
{ 
     // Meine Frage ?
     Was muss hierhin ?
    // Ende meine Frage
} 
?>

...wenn der user eingeloggt ist, bekommt er das angezeigt. Wenn er's aber nicht ist und er befindet sich auf einer öffentlichen seite, soll er ja trotzdem den login status angezeigt bekommen bzw. soll er nicht abgemeldet werden.
 
Lies hier mal nach!

In jeder Seite, wo du auf Session Daten zugreifst, also per $_SESSION musst du auch session_start() aufrufen!

Auf öffentlichen Seiten machst du dann grad:

PHP:
session_start (); 
if (isset ($_SESSION["user_id"])) // ACHTUNG habe hier das ! weggelassen
{ 
     // Das hier wird nur angezeigt wenn der user eingeloggt ist
     // Hier zeigst du Navi etc was nur die User sehen sollen wo angzeigt ist
     // Ausserdem Login Status eingeloggt anzeigen!
}  else {
    // User ist nicht eingeloggt!
    // Anzeigen das User nicht eingeloggt ist 
    // Login Status nicht eingeloggt!
}
 
puuh ! raff ich noch nicht so ganz. ich glaube wir reden immer noch aneinander vorbei.
Ich probiers jetzt mal aus und melde mich dann gleich wieder.

Danke Dir für die Hilfe !


## EDIT1 ##

OK, ich habs jetzt so probiert:
PHP:
<?php
session_start ();
?>

...HTML...und dann das Loginformular...

PHP:
<?php  
if (!isset ($_SESSION["user_id"])) 
{ 
    ?><?php echo $_SESSION["user_vorname"]; ?> <?php echo $_SESSION["user_nachname"]; ?><br><br> 
  
     <a href="http://www.tutorials.de/forum/users/logout.php">Abmelden</a></span>
     <?php
}  else {
    if (isset ($_REQUEST["fehler"])) 
{ 
  echo "Die Zugangsdaten waren ung&uuml;ltig."; 
}
}
?>

Ist aber noch nicht richtig. Ich bekomme jetzt sowohl die Möglichkeit mich abzumelden, als auch das Login-Formular. Es soll aber nur das Login-Formular angezeigt werden fall der user nicht eingeloggt ist. Wenn er eingeloggt st soll er nur den Logout Button sehen.


## EDIT 2 ##

... und Vorname und Nachname zeigt mir die Seite auch nicht an. Kann aber am nicht vorhandenen platz liegen. Vielleicht stehts oberhalb !?
 
Ich werde mal versuchen zu helfen. zer0 hat das in seinen letzten Beitrag schon reingeschrieben. Der Code

Code:
session_start (); 
if (isset ($_SESSION["user_id"])) // ACHTUNG habe hier das ! weggelassen
{ 
     // Das hier wird nur angezeigt wenn der user eingeloggt ist
     // Hier zeigst du Navi etc was nur die User sehen sollen wo angzeigt ist
     // Ausserdem Login Status eingeloggt anzeigen!
}  else {
    // User ist nicht eingeloggt!
    // Anzeigen das User nicht eingeloggt ist 
    // Login Status nicht eingeloggt!
}

kommt also ganz oben auf jede login- und nonlogin-Seite. Ich nenne mal "login-Seiten" jene Seiten, bei denen User eingeloggt sein muss. "nonlogin-Seiten" bedeutet jene Seiten, die für alle frei zugänglich sind.

Also: der Unterschied ist, dass Du den User bei login-Seiten im else-Teil des hier genannten Codes zum Login-Script (wo sie sich einloggen können) schickst, mit header(). Auf nonlogin-Seiten aber schreibst Du in den else-Teil entweder nur rein "Du bist nicht eingeloggt", oder oder Du renderst ein kleines Login-Formular da rein, wo die sich gleich einloggen können. Oder Du kannst den else-Teil einfach weglassen.

Jeder weiterer Code (der eigentliche Inhalt der Seite) kommt dann unter diese if-else-Abfrage, nicht in den else-Teil.

Falls das Dein Problem auch nicht trifft, könntest Du vielleicht Deinen vollständigen aktuellen Code posten? Du sagst
Ist aber noch nicht richtig. Ich bekomme jetzt sowohl die Möglichkeit mich abzumelden, als auch das Login-Formular. Es soll aber nur das Login-Formular angezeigt werden fall der user nicht eingeloggt ist. Wenn er eingeloggt st soll er nur den Logout Button sehen.

aber ich kann in dem Script nirgendwo sehen, wo das Login-Formular referenziert wird.
 
Dein PHP Code ist falsch!

PHP:
<?php  
if (!isset ($_SESSION["user_id"]))  // Hier sollte der Fehler liegen
{ 
    ?><?php echo $_SESSION["user_vorname"]; ?> <?php echo $_SESSION["user_nachname"]; ?><br><br> 
  
     <a href="http://www.tutorials.de/forum/users/logout.php">Abmelden</a></span>
     <?php
}  else {
    if (isset ($_REQUEST["fehler"])) 
{ 
  echo "Die Zugangsdaten waren ung&uuml;ltig."; 
}
}
?>

Du fragst in deiner if-Abfrage ab, wenn $_SESSION["user_id"] nicht gesetzt ist, gibst du $_SESSION["user_vorname"] und $_SESSION["user_nachname"] aus!

Du musst die inventierung (glaub so hieß das, wenn man ein ! davor stellt) weg machen:

So:

PHP:
<?php  
session_start();
if ( isset ($_SESSION["user_id"]) )  // Achte hierdrauf, ich habe das ! gemacht, es wird jetzt geprüft ob $_SESSION["user_id"] existiert, wenn ja zeigt er dir die Variablen an
{ 
    echo $_SESSION["user_vorname"]; 
    echo $_SESSION["user_nachname"]; 
    echo "<br><br>";
  
    echo '<a href="http://www.tutorials.de/forum/users/logout.php">Abmelden</a>';
}  elseif( isset ($_REQUEST["fehler"]) ) // würde statt $_REQUEST lieber $_GET oder jenachdem wie du es aufgebaut hast, verwenden
{ 
  echo "Die Zugangsdaten waren ung&uuml;ltig."; 
}

// Und hier, nach deiner if-Abfrage, kommt der Teil der immer angezeigt wird, egal ob eingeloggt oder nicht!
?>

Und über Datei, wo du Session verwendest, musst du session_start() aufrufen!
 
Zuletzt bearbeitet:
Super ! Vielen Dank ! Läuft nu, aber ich hab immer noch ein kleines Problem.

Wieso ändert sich die Position der Verknüpfung wenn jemand angemeldet bzw. abgemeldet ist ?
Gibts da nen CSS Trick ?
 
Zurück