SESSION Verwaltung auf index.php

mkoeni1

Erfahrenes Mitglied
Hallo,

ich bin am verzweifeln. Entweder bin ich so dumm oder ich kapier es nicht. Ich möchte gerne auf einer PHP Seite index.php verschiedene Linkbereiche unterscheiden und aufrufen um dann entweder eingeloggt oder nicht eingeloggt zu unterscheiden. (auf allen Seiten)

Beispiel:
PHP:
<a href="index.php?status=start">Start</a>
<a href="index.php?status=anleitung">Anleitung</a>
<a href="index.php?status=steuer">Steuerung</a>
<a href="index.php?status=faq">FAQ</a>
<a href="index.php?status=applet">Applet</a>
Auf der Seite habe ich im Bereich if($status == start){ ... } ein Login-Formular definiert:
PHP:
if($status == start){
...
<form action="index.php?status=login" method="POST">
<!-- hier folgen die Formularelemente -->
<table border="0" cellpadding="0" cellspacing="4">
   <tr>
     <th colspan="2">Melden Sie sich hier bitte an.</th>
   </tr>
   <tr>
      <td align="right">User</td>
      <td><input name="user" type="text" size="30" maxlength="30" value="User"></td>
    </tr>
    <tr>
      <td align="right">Password:</td>
      <td><input name="passwd" type="password" size="30" maxlength="40" value="Password"></td>
    </tr>
        <tr>
            <td><input type="submit" value=" Absenden "></td>
      <td><input type="reset" value=" Abbrechen"></td>
    </tr>
     <tr>
    <td colspan="2" class="passwd">* Passwort <a href="index.php?status=forgot">vergessen</a>?</td>
     <tr>
  </table>
</form>
...
}
Auf der Startseite kann man sich einloggen. Jetzt möchte ich gerne erreichen dass wenn sich jmd. eingeloggt hat, dieser über alle Bereiche eingeloggt bleibt. Welche Zusatzvariablen muss ich dafür verwenden?

Zu diesem Zweck habe ich inter index.php?status=login eine Abfrage und den Start der SESSION (session_start();
PHP:
if($status == login){
?>
<div id="content">
<b>PHP-INFO</b>:<br />
<script type="text/javascript" src="js/tree.js"></script>
</div><!-- div content -->

<?php
$data = mysql_query("SELECT * FROM user"); 
if (!$data) { 
    die(mysql_error()); 
} 
    $row = mysql_fetch_array($data); 
    $uservalue = $row['username']; 
    $passvalue = $row['password']; 

 if($_SESSION['BenutzerID'] == $uservalue && $_SESSION['PasswordID'] == $passvalue) {
 session_start(); 
 echo $_SESSION['benutzer'] . 'leer'; 
?>
<div id="content">
 angemeldet !! 
</div>

<?php
}
else  
{ 
    echo '<div id="login">Access denied !'; 
    echo '<br /><br /><br /><br />
<a href="#" onclick="history.go(-1);return false">nochmals probieren</a>';
    echo '</div>';
}
?>
<!-- footer -->
<div id="footer">
best view: 1024 x 768<br>
<?php
// Gibt z.B. aus:  somefile.txt was last modified: December 29 2002 22:16:23.

$filename = 'index.php';
if (file_exists($filename)) {
    echo "$filename was last <b>modified</b>: " . date ("F d Y H:i:s", filemtime($filename));
}
?> 
</div> 
<!-- footer -->
<?php
}
Ich hatte versucht ünber die Links eine SID mitzugeben um anzuzeigen dass der user bereits angemeldet ist, doch der Versuch ist gescheitert.
PHP:
<a href="index.php?status=start&' . SID . '">start</a>';
wenn ich wieder sie Startseite aufrufe, kennt er den Benutzer nicht mehr und man muss sich erneut anmelden :-(

Am Anfang der Seite index.php habe ich folgendes Script stehen:
PHP:
<?php
// Errors auf der Seite anzeigen
//error_reporting(E_ALL);
session_start();
$_SESSION['benutzer'] = $_POST['user'];
$_SESSION['geheim'] =   $_POST['passwd'];
$_COOCKIE['BenutzerID'] = $_SESSION['benutzer'];
$_COOCKIE['PasswordID'] = $_SESSION['geheim'];

// Es wird ueberprueft ob POST oder GET Variablen gesetzt sind und wenn ja neu zugeordnet
if (isset($_POST['status'])) {
        $status = $_POST['status'];
} else
{ if (isset($_GET['status'])) {
        $status = $_GET['status'];
}
  else {
         $status = "start";
}
}
?>
Aber ich komme einfach nicht weiter. Kann mir bitte jemand einen Tipp geben wie der Benutzer dauerhaft angemeldet bleibt?

Vielen Dank
Gruß Matze
 
Angemeldet sein ist kein Status den ein Script oder eine Webanwendung annehmen kann. Ob ein User angemeldet ist oder nicht hängt in den meisten Fällen schlichtweg damit zusammen, ob dem User bestimmte Funktionen zugänglich sind oder nicht.

Ich mach das so:
Bei erstmaligem Aufrufen der Seite wird $_SESSION['UserID'] auf 0 gesetzt. $_SESSION['UserID'] = 0 bedeutet, dass der User nicht eingeloggt ist. Wenn sich der User erfolgreich einloggt, bekommt $_SESSION['UserID'] den Wert der ID die dem User in der Datenbank zugeordnet ist. Bei jeder Aktion, bei der man eingeloggt sein muss (also $_SESSION['UserID'] != 0 sein muss), prüfe ich dann

PHP:
if($_SESSION['UserID']) {
  //Aktion kann durchgeführt werden
}else{
  //Aktion darf nicht durchgeführt werden
}

Eine SessionID bekommt jeder User, sobald session_start() aufgerufen wird.

Gruss
De Igäl
 
Hallo,

danke für die Antwort. Wenn ich dich richtig verstanden habe, dann bekommt der User beim Anmelden auf der Seite aus der Datenbank nach dessen Abfrage seine ID mit und kann dann mit dieser Information:
also $_SESSION['UserID'] != 0
beim erfolgreichen anmelden
verschiedene Bereiche einer Seite sehen und hat hier ganz andere Möglichkeiten.
Zum Beispiel den if Teil deiner Funktion ausführen. Du baust also deine Seite nicht so auf wie ich in dem ich es nach Berecihen aufteile (doch ich glaube auch), sondern nach dem eingeloggt/nicht eingeloggt sein eines Users.

Oder?

Vielen Dank
Matze
 
Ich geb dir mal ein Beispiel anhand einer Navigation :

PHP:
<ul>
<li><a href="public.php">Öffentlicher Bereich</a></li>
<?php if($_SESSION['UserID']) { ?>
<li><a href="private.php">Interner Bereich</a></li>
<?php } ?>
</ul>

Wenn $_SESSION['UserID'] = 0 ist, sieht der User den Navigationspunkt nicht. Da die UserID in der Session erst einen anderen Wert als 0 bekommt, wenn der User eingeloggt ist (sprich: das Login-Script hat ihn als registrierten User bestätigt), sieht er den Menüpunkt also erst, nachdem er die Login-Routine hinter sich gebracht hat.

In meinem Beispiel kann man den User also als eingeloggt betrachten, wenn UserID in der Session ungleich 0 ist.

Achja: Beim Ausloggen dann halt einfach session_destroy() oder UserID in der Session manuell auf 0 setzen.

Ich hoffe es ist dir etwas klarer geworden, was der theoretische Ansatz dahinter ist.
 
Das Beispiel habe ich verstanden. Man bekommt einen internen Bereich nur dann zu sehen wenn man sich erfolgreich an der Datenbank angemeldet hat und man ab dann mit der $_SESSION Variablen geführt wird.
Mir geht es aber darum in verschiedenen Abschnitten diese Variable mitzunehmen.
Beispiel:
PHP:
if($status == start) {
mach was
}

wie ist das mit globalen und lokalen Variablen. Wie du oben siehst habe ich meine Navigation auf einer Seite:
PHP:
<a href="index.php?status=start">Start</a>
<a href="index.php?status=anleitung">Anleitung</a>
<a href="index.php?status=steuer">Steuerung</a>
<a href="index.php?status=faq">FAQ</a>
<a href="index.php?status=applet">Applet</a>

wie kann ich mit der $_SESSION['UserID'] Variablen innerhalb der Strukturen nach einem Login "überleben"?

Vielen Dank
Gruß
Matze
 
Ich kann dir wieder nur meine Ansätze angeben, da ich die mehr oder weniger im Einsatz hab und sie eigentlich ganz ok sind:

Lies oben auf der Seite $_GET['status'] aus und include mit dieser Information die entsprechende Seite.
Ich empfehle dir, dass du die Seite die du ansprechen willst in jedem Link übergibst. Du läufst so weniger in Gefahr die Übersicht zu verlieren.
 
wie kann ich mit der $_SESSION['UserID'] Variablen innerhalb der Strukturen nach einem Login "überleben"?

Normal überleben die von Alleine und man muß nix machen. Es kann aber vorkommen das die Session nummer abhandenkommt.Dann muß man sie manuel bei jedem link mit dranhängen
An dieser nummer erkennt der Server um welche Session es sich handelt und kann sie dir kann auch wieder nach dem Seiten aufruf zuordnen.

PHP:
<a href="index.php?<?php echo(SID)?>>

Die SID ist eine supergloabe Variable und setzt sich aus 2 anderen Supergloablen Variablen zusammen
SessionName=Session-ID wobei SessionName den Namen der Session Variable zurück gibt und Session-ID die Aktuelle nummer der Session zurück gibt.
In SID sind dann beide werte schon enthalten also SID ist nix anderes als SID=SessionName=Session-ID

Du könntes auch <a href="index.php?<?php echo(SessionName)."=".(Session-ID )?>> Schreiben würde das gleiche ergeben wie SID alleine.

Der Get Parameter kann dann in der Url so
?PHPSESSID=cd45a3f76f7325099c755b25b
Aussehen

Mfg Splasch
 
Zuletzt bearbeitet:
Danke für die Hilfe. Ich habe es geschafft, das soweit umzusetzen ;-) Danke.
Jetzt habe ich noch eine anderes Problem.
Ich möchte Tabellen mit Mannschaften im Backend editieren. Dazu habe ich für jeden möglichen Befehl ein hard-codiertes Formular aufgesetzt. Als Beispiel hänge ich die Formulare mal ran die jetzt in dem gezeigten Fall nur news in die Datenbank reinschreiben (anhängen):
PHP:
<!-- news im backend anlegen -->
  <tr>
    <td><img src="img/inside/topic.gif" height="23px"  width="23px" border="1" alt="news">News</td>
    <td><img src="img/inside/1_pix_t.gif" height="15px"  width="30px" border="0" alt="spacer"></td>
    <td>
    
<!-- form add news begin -->
<form action='<?php echo $PHP_SELF ?>' method="post">
  <!-- hidden field -->
  <input type="hidden" name="ninitial" value="newsinitial" />
  <!-- hidden field -->
  <input type="hidden" name="bname" value="<?php echo ''.$bname.'' ;?>" />
  <!-- hidden field -->
  <input type="hidden" name="pass" value="<?php echo ''.$pass.'' ;?>" />
  <input type="image" src="img/inside/addnews.gif" alt="Add">
</form>
<!-- form add news end -->

  </td>
  <td>
  
<!-- form edit news begin -->
  <form action='<?php echo $PHP_SELF ?>' method="post">
<!-- hidden field -->
    <input type="hidden" name="nedit" value="newsedit" />
<!-- hidden field -->
    <input type="hidden" name="bname" value="<?php echo ''.$bname.'' ;?>" />
 <!-- hidden field -->
    <input type="hidden" name="pass" value="<?php echo ''.$pass.'' ;?>" />
    <input type="image" src="img/inside/edit.gif" alt="Edit">
  </form>
<!-- form edit news end -->

  </td>
  <td>
  
<!-- form delete news begin -->
    <form action='<?php echo $PHP_SELF ?>' method="post">
<!-- hidden field -->
    <input type="hidden" name="ndel" value="newdel" />
<!-- hidden field -->
    <input type="hidden" name="bname" value="<?php echo ''.$bname.'' ;?>" />
<!-- hidden field -->
    <input type="hidden" name="pass" value="<?php echo ''.$pass.'' ;?>" />
    <input type="image" src="img/inside/delete.gif" alt="Delete">
  </form>
<!-- form delete news end -->

  </td>
  <td>News auf der Startseite anlegen.</td>
</tr>
<!-- end news im backend anlegen -->

Ich glaube das kann so nicht sein. Das sind jetzt 3 Formulare nur für add, edit und delete von news. Zusätzlich wird auch noch der Login mitgeschickt. Weiss hier jmd. eine bessere Lösung um die news zu editieren?
Ich muss dazu sagen, mein Script hat jetzt schon 1000 Zeilen Quellcode. Und das schöne daran ist, ich pflege über das backend news, spieltage, termine und und und.



Vielen Dank
Gruß Matze
 
Add & edit - Formulare ähneln sich sehr, da könnte man mit Refactoring arbeiten :)

Zum Thema Benutzer-Session: wenn du auf jeder Seite session_start() aufrufst, werden die Benutzerdaten automatisch weitergegeben. Wenn alle Seiten über deine index.php aufgerufen werden, brauchst du nur dort session_start() eintragen, und der Benutzer bleibt eingeloggt.
 
Ja Refactoring hört sich gut an. Ich denke da muss ich mich mal hinsetzen.

Ich habe die Session Verwaltung jetzt mal mit eingebaut. Soweit alles OK, nur bekomme ich noch den Fehler wenn ich nach dem Einloggen auf den Link Start und dann auf den Link Memberbereich klicke, kennt mich der Server nicht mehr :-( Obwohl ich mich noch nicht vom Server abgemeldet habe (Logou-Formular).
Mann kann den Quelltext einfach in einer PHP Umgebung ohne Datenbank laufen lassen. Kann sich das mal jmd. anschauen? Ich sehe den Wald vor lauter Bäumen nicht mehr.

PHP:
<?php
session_start();
//  Es wird &uuml;berpr&uuml;ft ob POST oder GET Variablen gesetzt sind und wenn ja neu zugeordnet
if (isset($_POST['action']))
    {    $action = $_POST['action'];    
    }
    else
    {    if (isset($_GET['action']))
            {    $action = $_GET['action'];    }
            else
            {    $action = "start" ;        }
    }






if($action == willkommen){

if   (  $_POST['user'] != null && $_POST['passwd'] != null )
{
    echo "Willkommen auf der Kundenseite alles OK<br><br>";
if($_POST['user'] == "testname" && $_POST['passwd'] == "pass"){

    echo "Benutzername passt: Passwort OK<br><br>";
    echo "Benutzer: <b>".$user."</b><br>";
    echo "Passwort: <b>".$passwd."</b><br>";
    echo "BenutzerID: <b>".$login."</b><br>";
    
    $login = true;
    
    echo $user."<br>";
    echo $passwd."<br>";
    echo $login."<br><br>";
    $_SESSION['user'] = $user;
    $_SESSION['passwd'] = $passwd;
    $_SESSION['login'] = $login;
     
    echo '<a href="index.php?action=Memberbereich">Memberbereich</a><br>';
    echo '<a href="index.php?action=Einstellungen">Einstellungen</a><br>';
    echo '<a href="index.php?action=start">Start</a>';
    
    }
    else {
    echo "Benutzername und Passwort ->  MURKKSSSSS<br>";
    echo '<a href="index.php?action=start">Start</a>';
    } 

} 
else {
    echo "Willkommen auf der Kundenseite alles MURKSSSSSSSSSSSSSSSs<br><br>";
    echo "Bitte wiederholen Sie Ihre Eingaben<br>";
    echo '<a href="index.php?action=start">Start</a>';
}

} // end willkommen





// if(($action == Memberbereich ) && ($_SESSION['login'] == true) ){
if($action == Memberbereich ){    
    
if ($_SESSION['login'] == true)    {
    echo "bin drinnen<br>";
    echo "Bereich Einstellungen<br>";
    echo '<a href="index.php?action=start">Start</a>';
    }
else { echo "Bitte erst einloggen<br>";
    echo '<a href="index.php?action=start">Start</a>';}    
    
    
} // end Memberberecih




// if(($action == Einstellungen ) && ($_SESSION['login'] == true) ){
if($action == Einstellungen ){    
    
if ($_SESSION['login'] == true)    {
    echo "bin drinnen<br>";
    echo "Bereich Einstellungen<br>";
    echo '<a href="index.php?action=willkommen">Willkommen</a><br>';
    echo '<a href="index.php?action=start">Start</a>';
    }
    
    
else { echo "Bitte erst einloggen<br>";
    echo '<a href="index.php?action=start">Start</a>';
    }    
    
    
} // end Memberberecih






// if(($action == Anleitung ) && ($_SESSION['login'] == true) ){
if($action == Anleitung ){    
    
    echo "Anleitung (offen)<br>";
    echo '<a href="index.php?action=start">Start</a>';
    
} // end Anleitung




// ##########################################################################################################
// ##########################################################################################################

if (!(($action == willkommen)|($action == Memberbereich)|($action == Einstellungen)|($action == Anleitung)))
    {
        echo "Willkommen<br><br>";

        if($_SESSION['login'] == null){
        // ALLE moeglichen Variablen werden zurueckgesetzt
        $_POST['user'] = null;
        $_POST['passwd'] = null;    
        $_POST['login'] = false;




    ?>
    <form action="index.php?action=willkommen" method="POST">
<!-- hier folgen die Formularelemente -->
    <table border="0" cellpadding="0" cellspacing="4">
       <tr>
         <th colspan="2">Melden Sie sich hier bitte an.</th>
       </tr>
       <tr>
          <td align="right">User</td>
          <td><input name="user" type="text" size="30" maxlength="30"></td>
        </tr>
        <tr>
          <td align="right">Password:</td>
          <td><input name="passwd" type="password" size="30" maxlength="40"></td>
        </tr>
    <tr>
    <td><input type="submit" name="send" value=" Absenden "></td>
          <td><input type="reset" value=" Abbrechen"></td>
        </tr>
         <tr>
    <td colspan="2" class="passwd">* Passwort <a href="index.php?status=forgot">vergessen</a>?</td>
         <tr>
      </table>
    </form>

<?php 

} else{
?>
<form action="index.php" method="POST">
<!-- hier folgen die Formularelemente fuer das Abmelden-->
<input type="hidden" name="destroy" value="<?php session_destroy(); ?>">
<input type="submit" name="logout" value="Logout"></td>
</form>
<?php
    echo "<br><br>";
} // else 

    echo '<a href="index.php?action=Memberbereich">Memberbereich</a><br>';
    echo '<a href="index.php?action=Einstellungen">Einstellungen</a><br>';
    echo '<a href="index.php?action=Anleitung">Anleitung</a><br>';

    }

// ##########################################################################################################
// ##########################################################################################################



?>

Wird die session_destroy(); zu früh ausgeführt?

Vielen Dank und Gruß
Matze
 
Zuletzt bearbeitet:
Zurück