[PHP] Session wird nur teilweise gespeichert.



  • Hallo, ich habe folgendes Problem: Ich schreibe etwas in die Session, nach einem refresh wird aber nur ein teil davon gespeichert.

    hier mal die login.php um die es geht (diese Datei wird in der index.php eingebunden, und in der index.php steht oben "session_start();"):

    <?php
    if(!$_SESSION['online']==1){
        echo file_get_contents("./include/html/login_box_offline.html");
    }
    
    if($_SESSION['online']!=1){
      if(isset($_REQUEST['login'])){
          if(isset($_POST['Loginname'])&&isset($_POST['Passwort'])){
              $errors=0;
              if($_POST['Loginname']==""||$_POST['Loginname']=="Loginname"){
                  echo "Bitte Loginname eingeben!<br>";
                  $error++;
              }
              if($_POST['Passwort']==""||$_POST['Passwort']=="Passwort"){
                  echo "Bitte Passwort eingeben!";
                  $error++;
              }
              $name=htmlspecialchars($_POST['Loginname']);
              $pw=$_POST['Passwort'];
              if(!$error){
                  $rew=mysql_query("SELECT * FROM `user` WHERE `name`='$name' AND `passwort`='$pw'");
                  $row=mysql_fetch_array($rew);
                  if(isset($row['name'])){
                      unset($row['passwort']);
                      $_SESSION['online']=1;
                      $_SESSION=array_merge($_SESSION, $row);
                      //echo "<meta http-equiv='refresh' content='0'; URL='index.php?content=login'>";
                  }else{
                      echo "Die Daten stimmmen nicht!";
                  }
              }
          }else{
              echo "schon online...";
          }
      }else{
              echo "";
      }
    }else{
      echo "Hallo ".$_SESSION['name']."<br>";
      if($_SESSION['rang']==5){
        echo "<a href=admin.php>Zum Adminmenü</a><br>";
      }
      echo "<a href=index.php?sub=logout>Logout</a>";
    }
    echo '<pre>';
    print_r($row);
    echo '</pre>';
    echo '<pre>';
    print_r($_SESSION);
    echo '</pre>';  
    ?>
    

    Die pre Ausgabe unten zeigt mir vor dem login:

    Array
    (
    )

    Beim login:

    Array
    (
    [0] => 1
    [id] => 1
    [1] => admin
    [name] => admin
    [2] => passwort
    [3] => 5
    [rang] => 5
    )

    Array
    (
    [online] => 1
    [0] => 1
    [id] => 1
    [1] => admin
    [name] => admin
    [2] => passwort
    [3] => 5
    [rang] => 5
    )

    und nach einem refresh:

    Array
    (
    [online] => 1
    )

    Aber warum wird nur der status "online" übernommen? Ich hoffe ihr könnt mir helfen.
    Gruß



  • Zuerst ein Sicherheitshinweis: Dein Code ist anfaellig fuer so genannte SQL-Injections. Schau' dir dazu am Besten das hier an:

    Zum eigtl. Problem: Hast du Cookies aktiviert?



  • Erstmal danke für den Hinweis, hab ich glatt vergessen ⚠
    Zum Problem, Cookies sind aktiviert. Das seltsame was ich grad festgestellt habe, im localhost funktioniert es super, sobal ich es auf den Server lade passiert wieder das beschriebene.



  • Lass' dir das Array $_SESSION mal ganz am Anfang ausgeben. Macht das einen Unterschied?



  • Es macht nur einen logischen unterschied:
    -Vorm login ist nichts drin.
    -Beim drücken des login buttons ist nicht drin (da die Ausgabe vor der Zuweisung geschieht)
    -Nach einem refresh steht wieder nur:

    Array
    (
    [online] => 1
    )



  • Dann liegt der Fehler in der Serverkonfiguration und nicht an deinem Skript.
    Meine Empfehlung, solltest du auf den Server angewiesen sein: Probier's ueber Cookies statt Sessions und weise die Besucher darauf hin.

    Koennte an der php.ini liegen, aber auch an Vorgaben vom Server, wenn's z.B. eine VM ist, oder wenn's sogar nur ein Hoster ist und dein Bereich nur ein VH.



  • Das scheint eher an php zu liegen, $_SESSION kann man wohl nicht mergen:

    http://www.php.net/manual/de/function.array-merge.php#68096





  • Dann wuerde ich der Einfachheit halber folgendermassen vorgehen (siehe Markierung):

    <?php
    if(!$_SESSION['online']==1){
        echo file_get_contents("./include/html/login_box_offline.html");
    }
    
    if($_SESSION['online']!=1){
      if(isset($_REQUEST['login'])){
          if(isset($_POST['Loginname'])&&isset($_POST['Passwort'])){
              $errors=0;
              if($_POST['Loginname']==""||$_POST['Loginname']=="Loginname"){
                  echo "Bitte Loginname eingeben!<br>";
                  $error++;
              }
              if($_POST['Passwort']==""||$_POST['Passwort']=="Passwort"){
                  echo "Bitte Passwort eingeben!";
                  $error++;
              }
              $name=htmlspecialchars($_POST['Loginname']);
              $pw=$_POST['Passwort'];
              if(!$error){
                  $rew=mysql_query("SELECT * FROM `user` WHERE `name`='$name' AND `passwort`='$pw'");
                  $row=mysql_fetch_array($rew);
                  if(isset($row['name'])){
                      unset($row['passwort']);
                      $_SESSION['online']=1;
    /* CHANGE BEGIN */
                      $keys=array_keys($row);
                      foreach($keys as $k) $_SESSION[$k]=$row[$k];
    /* CHANGE END */
                      //echo "<meta http-equiv='refresh' content='0'; URL='index.php?content=login'>";
                  }else{
                      echo "Die Daten stimmmen nicht!";
                  }
              }
          }else{
              echo "schon online...";
          }
      }else{
              echo "";
      }
    }else{
      echo "Hallo ".$_SESSION['name']."<br>";
      if($_SESSION['rang']==5){
        echo "<a href=admin.php>Zum Adminmenü</a><br>";
      }
      echo "<a href=index.php?sub=logout>Logout</a>";
    }
    echo '<pre>';
    print_r($row);
    echo '</pre>';
    echo '<pre>';
    print_r($_SESSION);
    echo '</pre>';  
    ?>
    

    Das sollte es dann sein, wenn du dich dann noch um die Sicherheitsfrage kuemmerst. 😉


Anmelden zum Antworten