Manuel: Sessions funktionieren nicht richtig

Hallo,

ich hab ein Problem mit Sessions. Ich habe 2 Variablen:
$username
$passwort

Diese werden in einer Session gespeichert
$_SESSION["username"] = $username;
$_SESSION["passwort"] = $passwort;

und dann ausgegeben:
echo $_SESSION["username"];
echo $_SESSION["passwort"];

funktioniert wunderbar, nur wenn ich auf eine andere Seite wechsel kann ich nicht mehr drauf zugreifen. Es wird auch kein Cookie angelegt obwohl mein Browser (IE6) eigentlich richtig eingestellt ist. Ich glaub es liegt irgendwie an der Session ID.

Würde mich freuen wenn ihr mir helfen könntet.

Danke
Manuel

  1. Hello,

    wie teilst Du dem Server denn mit, dass er eine Session benutzen soll?

    Liebe Grüße aus http://www.braunschweig.de

    Tom

    --
    Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
    1. Danke für die schnellen Antworten!

      Also ich habe auf jeder Seite

      <?php session_start(); ?>

      ganz oben als ersten Eintrag stehen!

      Ich habe nun folgendes versucht:
      <a href="index.php?<?php echo $mySID; ?>">

      In der $mySID habe ich die Session ID gespeichert. Und damit funktionierts.
      Nur will ich ja nicht bei jedem Link auf meiner Homepage die mySID in der URL mitschicken. Das muss doch auch mit Cookies gehn.

      Viele Grüße
      Manuel

      1. Moin Manuel,

        zur Sicherheit. Welcher Wert ist hier gesetzt:

        session.auto_start?

        und der hier:

        session.use_cookies?

        regds
        Mike

        1. Hi,
          meinst du die php.ini?

          Falls ja, auf die hab ich glaub ich keinen Zugriff. Kann man das irgendwie anders herausfinden?

          1. Moin Manuel

            erstelle mal ein script z.Bsp. phpinfo.php

            dort muß drin stehen:

            <?php PHPinfo();?>

            Ausführen und dort gehst Du in die Sektion:
            Sessions und prüfst die Einstellungen.

            regds
            Mike

            1. Hallo,

              session.auto_start ist auf off

              und

              session.use_cookies ist auf on

              Hier auch ein Bild:
              http://www.muffdiver.at/session.jpg

              So wies aussieht sollte es eigentlich in Ordnung sein oder?

              1. Moin Manuel,

                So wies aussieht sollte es eigentlich in Ordnung sein oder?

                Leider sieht das OK aus :-(

                Hast Du mal ein Code snippet von einer aufgerufenen Page,
                wo die Session Variable nicht mehr bekannt ist.

                Nur die ersten paar relevanten Zeilen ab <?

                regds
                Mike

                1. Also,

                  Die login.php(nicht die ganze):

                  <?php
                    }
                    if ($go == 1) {
                       $sql = "SELECT * FROM benutzer WHERE (username like '".$username."') AND (passwort = '".md5($passwort)."')";
                      $res = mysql_query($sql);
                      $num = mysql_num_rows($res);
                      if ($num > 0) {
                     $_SESSION["id"]   = mysql_result($res, 0, "id");
                          $_SESSION["gruppe"]  = mysql_result($res, 0, "gruppe");
                          $_SESSION["nachname"] = mysql_result($res, 0, "nachname");
                          $_SESSION["vorname"] = mysql_result($res, 0, "vorname");
                          $_SESSION["email"]  = mysql_result($res, 0, "email");
                  ?>

                  ganz oben in der login.php steht natürlich noch session_start() und die Verbindung zur Datenbank.

                  Wenn man sich erfolgreich angemeldet hat kommt man wieder auf die index.php zurück:

                  <?php session_start();
                   if (isset ($_SESSION["id"]))
                   {
                    echo $_SESSION["vorname"]." ".$_SESSION["nachname"];
                   }
                   ?>

                  Und da wird dann nichts ausgegeben. Auch keine Fehlermeldung! Wie gesagt wenn ich die SID mit der URL übergebe dann gehts.

                  1. Moin Manuel,,

                    <?php session_start();

                    if (isset ($_SESSION["id"]))
                     {
                      echo $_SESSION["vorname"]." ".$_SESSION["nachname"];
                     }
                     ?>

                    Lasse mal das wech:

                    if (isset ($_SESSION["id"]))

                    regds
                    Mike

                    1. hat leider auch nix geholfen!

                      Könntest du evt. mal die Seite kurz testen?

                      http://www.muffdiver.at/forum/
                      Dann auf Login klicken
                      User: admin
                      Pass: december
                      zum Hauptmenü... anklicken
                      und dann sollte neben "Login" Administrator stehen

                      wenn das da steht dann liegts wohl an meinem System!
                      wäre dir sehr dankbar

                      mfg
                      Manuel

                      1. Moin!

                        und dann sollte neben "Login" Administrator stehen

                        Tut es nicht. Und es kommen auch keine Cookies irgendwo. Und keinerlei Session-ID an den Links. Mit anderen Worten: Du startest nirgendwo eine Session - zumindest nicht wirksam.

                        - Sven Rautenberg

                        --
                        Die SelfHTML-Developer sagen Dankeschön für aktuell 21335,05 Euro Spendengelder!
                        1. Hi, Danke für deine Hilfe!

                          Tut es nicht. Und es kommen auch keine Cookies irgendwo. Und keinerlei Session-ID an den Links.

                          Die ID an den Links hab ich rausgenommen da ich ja weiß dass es funktioniert.

                          Mit anderen Worten: Du startest nirgendwo eine Session - zumindest nicht wirksam.

                          Gleich nach dem Login hast du ja sicherlich die benutzerdaten (email) gesehen. Das heißt doch dass die Session gestartet wurde! Nur eben kein Cookie gesetzt wurde :-((

                          mfg
                          Manuel

                          1. Haha ich habs!!

                            Ich hatte folgende Zeile (wofür auch immer die gut war) in meine Scripte eingebaut:

                            import_request_variables("gP");

                            Jetz hab ichs rausgenommen und jetzt gehts!

                            1. Moin!

                              Haha ich habs!!

                              Ich hatte folgende Zeile (wofür auch immer die gut war) in meine Scripte eingebaut:

                              import_request_variables("gP");

                              Da fragt man das Manual und findet:
                              http://de2.php.net/manual/de/function.import-request-variables.php

                              Und das klingt so, als würde man es garantiert nicht wollen. Wozu macht man denn das ganze Gehampel mit register_globals = off? Doch  nicht deshalb, damit man den Sicherheitsgewinn durch diese Funktion wieder aufgibt?

                              Jetz hab ichs rausgenommen und jetzt gehts!

                              Und lass das auch draußen. Besser is'...

                              - Sven Rautenberg

                              --
                              Die SelfHTML-Developer sagen Dankeschön für aktuell 21335,05 Euro Spendengelder!
                              1. Ich hatte es drin weil ich bei meiner lokalen Testumgebung Probleme bei der Variableübergabe hatte!

                                mfg
                                Manuel

                                1. Moin!

                                  Ich hatte es drin weil ich bei meiner lokalen Testumgebung Probleme bei der Variableübergabe hatte!

                                  Das ist schlecht.

                                  Du solltest dein Testsystem natürlich soweit wie möglich an das Live-System anpassen (oder umgekehrt).

                                  Andererseits solltest du dein Testsystem an den empfohlenen Einstellungen für PHP orientieren. Dazu gehört unter anderem, nur $_GET und $_POST für den Zugriff auf Werte aus URL und Formularen zu verwenden. Machst du das nicht, werden deine Skripte irgendwann einmal nicht mehr funktionieren.

                                  Die von dir verwendete Funktion löst dieses Problem - aber leider genau auf die falsche Weise.

                                  Lies http://www.dclp-faq.de/q/q-formular-register-globals.html.

                                  - Sven Rautenberg

                                  --
                                  Die SelfHTML-Developer sagen Dankeschön für aktuell 21335,05 Euro Spendengelder!
  2. Moin Manuel,

    $_SESSION["username"] = $username;
    $_SESSION["passwort"] = $passwort;

    Mach die Zuweisung mal so.
    $_SESSION['USERNAME']="$username";

    Auf jeder weiteren Page muss als aller erstes wieder
    das erscheinen:

    @session_start();

    dann auslesen der Session Variable:
    $username = $_SESSION['USERNAME'];

    regds
    Mike

    1. Moin!

      $_SESSION["username"] = $username;
      $_SESSION["passwort"] = $passwort;

      Mach die Zuweisung mal so.
      $_SESSION['USERNAME']="$username";

      Was soll das bringen? Außer Performanceverlusten?

      Dass die Zuweisung funktioniert hat, wurde doch schon geklärt durch nachfolgendes echo $_SESSION['username'].

      Auf jeder weiteren Page muss als aller erstes wieder
      das erscheinen:

      @session_start();

      Warum @? Wenn session_start() nicht mehr funktionieren kann, weil die header schon weggesendet wurden, dann will man das zur Entwicklungszeit wissen. Weil man das dringend beheben muß.

      dann auslesen der Session Variable:
      $username = $_SESSION['USERNAME'];

      Warum noch mal extra auslesen? Einfach verwenden geht doch auch!

      - Sven Rautenberg

      --
      Die SelfHTML-Developer sagen Dankeschön für aktuell 21335,05 Euro Spendengelder!
      1. Moin Sven,

        Mach die Zuweisung mal so.
        $_SESSION['USERNAME']="$username";

        Was soll das bringen? Außer Performanceverlusten?

        Wo ist bei dieser Zuweisung der Performanceverlust?

        Dass die Zuweisung funktioniert hat, wurde doch schon geklärt durch nachfolgendes echo $_SESSION['username'].

        Akzeptiert ;-)

        @session_start();

        Warum @? Wenn session_start() nicht mehr funktionieren kann, weil die header schon weggesendet wurden, dann will man das zur Entwicklungszeit wissen. Weil man das dringend beheben muß.

        Nachdem ich meine Proggies sauber getestet habe, bekommen die ein "@"
        Fehlermeldungen werden von Usern sowieso übergangen, aus seltsamen
        Gründen sogar ignoniert.

        dann auslesen der Session Variable:
        $username = $_SESSION['USERNAME'];

        Warum noch mal extra auslesen? Einfach verwenden geht doch auch!

        Jetzt hänge ich aber. Wenn Du eine Variable in einer Session gespeichert hast, dann ist doch der Variablenname der nächsten
        Page nicht bekannt?

        regds
        Mike

        1. Moin!

          Mach die Zuweisung mal so.
          $_SESSION['USERNAME']="$username";

          Was soll das bringen? Außer Performanceverlusten?

          Wo ist bei dieser Zuweisung der Performanceverlust?

          Wenn du die Variablenzuweisung ohne Anführungsstriche machst, weiß PHP sofort, was getan werden muß: Variable 2 nehmen, und den Wert an Variable 1 zuweisen. Ruck Zuck.

          Wenn du Anführungsstriche drumrum machst, startet PHP den "Doppelte Anführungsstriche nach $variable durchsuchen"-Modus. Der ist meinetwegen ganz nett, wenn man
          echo "Hallo, $anrede, wie geht's?";
          machen will, aber
          echo 'Hallo, '.$anrede.', wie geht's?';
          ist deutlich performanter.

          Folglich verbrät deine Lösung unnütz Performance. Das mag scheißegal sein, wenn dieser Codeteil sowieso nur einmal durchlaufen wird, aber es ist nicht mehr scheißegal, wenn der Teil in einer Schleife steht, und mehrfach (tausende Male?) durchlaufen wird.

          @session_start();

          Warum @? Wenn session_start() nicht mehr funktionieren kann, weil die header schon weggesendet wurden, dann will man das zur Entwicklungszeit wissen. Weil man das dringend beheben muß.

          Nachdem ich meine Proggies sauber getestet habe, bekommen die ein "@"
          Fehlermeldungen werden von Usern sowieso übergangen, aus seltsamen
          Gründen sogar ignoniert.

          Warum dieses? Wenn deine Skripte sauber funktionieren, werfen sie doch keine Fehlermeldungen mehr aus. Und das Debugging, wenn denn doch mal was nicht funktioniert, ist auch schwieriger.

          Sofern du kannst, stelle die Ausgabe von Fehlermeldungen auf ein Logfile um, und unterdrücke die Ausgabe der Fehlermeldungen an den Browser auf dem Live-Server komplett. Das sollte vollkommen ausreichend sein. @ unterdrückt die Ausgabe der Fehlermeldung - repariert aber deinen Code nicht. Das führt u.U. zu Folgefehlern. Und am Ende wundert man sich, warum nichts kommt.

          Ein wirklich gutes Programm fängt alle Fehler ab. Die Verwendung von @ ist also vollkommen unnötig.

          dann auslesen der Session Variable:
          $username = $_SESSION['USERNAME'];

          Warum noch mal extra auslesen? Einfach verwenden geht doch auch!

          Jetzt hänge ich aber. Wenn Du eine Variable in einer Session gespeichert hast, dann ist doch der Variablenname der nächsten
          Page nicht bekannt?

          $_SESSION ist eine wunderschöne, superglobale Variable, üblicherweise ein Array. Das kann man überall im Direktzugriff verwenden, lesend wie schreibend. Es ist unnötig - und für die meisten Fälle auch verwirrend, bis hin zu überflüssig fehlerträchtig - wenn man am Skriptanfang alle benutzten Variablen der Session aus $_SESSION ausliest, und sie am Skriptende dort wieder hineinschreibt. Wenn man aus Versehen eine Variable vergißt - sowohl beim Lesen als auch beim Schreiben - dann führt das zu ätzenden Programmfehlern, deren Ursache mit Sicherheit nicht leicht erkennbar ist.

          Außerdem: Wenn dein Einwand stimmen würde, wieso weißt du dann im zweiten Skript, dass du $_SESSION['USERNAME'] verwenden mußt, um auf den in der Session gespeicherten Usernamen zuzugreifen? Wenn du nicht weißt, dass es 'USERNAME' heißt - wie willst du es herausfinden?

          - Sven Rautenberg

          --
          Die SelfHTML-Developer sagen Dankeschön für aktuell 21335,05 Euro Spendengelder!
          1. Moin Sven,

            Folglich verbrät deine Lösung unnütz Performance. Das mag scheißegal

            Agreed. Ist "scheißegal" seit Raab gesellschaftsfähig? ;-)
            Das war ein: ROFL

            Das führt u.U. zu Folgefehlern. Und am Ende wundert man sich, warum nichts kommt.

            Agreed

            Außerdem: Wenn dein Einwand stimmen würde, wieso weißt du dann im zweiten Skript, dass du $_SESSION['USERNAME'] verwenden mußt, um auf den in der Session gespeicherten Usernamen zuzugreifen? Wenn du nicht weißt, dass es 'USERNAME' heißt - wie willst du es herausfinden?

            Ich glaub hier reden wir aneinader vorbei.

            Wenn in meinem script die Variable $a bekannt ist, und ich der Session sage $a=x

            dann weiß das nachfolgende script doch gar nicht was was $a ist!

            Ich muss im sagen dein $a holst du dir aus $schlach_mich_tot = $_SESSION['a'];

            Wir reden doch hier nicht über "globale Variablen" sondern über Seesions.

            Wo liegt mein Denkfehler?

            regds
            Mike

            1. Moin!

              Außerdem: Wenn dein Einwand stimmen würde, wieso weißt du dann im zweiten Skript, dass du $_SESSION['USERNAME'] verwenden mußt, um auf den in der Session gespeicherten Usernamen zuzugreifen? Wenn du nicht weißt, dass es 'USERNAME' heißt - wie willst du es herausfinden?

              Ich glaub hier reden wir aneinader vorbei.

              Wenn in meinem script die Variable $a bekannt ist, und ich der Session sage $a=x

              dann weiß das nachfolgende script doch gar nicht was was $a ist!

              Korrekt. Wenn du zur Programmierzeit also weißt, dass du eine Sessionvariable mit dem "aussagekräftigen" Namen 'a' benötigst, erstellst du keinerlei Variable $a, sondern nimmst gleich $_SESSION['a'].

              Sofern für die Session bedeutungslose Berechnungen, Prüfungen oder Zwischenschritte zur Erstellung von 'a' erforderlich sind, muß sich das natürlich nicht in $_SESSION['a'] oder sonst irgendwo in $_SESSION abspielen.

              Ich muss im sagen dein $a holst du dir aus $schlach_mich_tot = $_SESSION['a'];

              Nein. Mußt du nicht. Weil du immer direkt mit $_SESSION['a'] arbeitest.

              Wir reden doch hier nicht über "globale Variablen" sondern über Seesions.

              Wo liegt mein Denkfehler?

              Globale Variablen und Sessions haben keine Gemeinsamkeit. Das eine ist eine Bezeichnung für die Variablen des "Hauptprogramms", das andere ist eine Bezeichnung für Mechanismen, in verbindungslosen Protokollen eine Verbindung herzustellen.

              Solltest du "Session-Variablen" gemeint haben: Das sind (im Verständnis von PHP) die Elemente des superglobalen Arrays $_SESSION.

              - Sven Rautenberg

              --
              Die SelfHTML-Developer sagen Dankeschön für aktuell 21335,05 Euro Spendengelder!
              1. Moin Sven,

                Korrekt. Wenn du zur Programmierzeit also weißt, dass du eine Sessionvariable mit dem "aussagekräftigen" Namen 'a' benötigst, erstellst du keinerlei Variable $a, sondern nimmst gleich $_SESSION['a'].

                Hier ist des Rätsels Lösung: $_SESSION['a']

                Klar funtzt das. Wir haben doch aneinder vorbei geredet ;-)

                Diese Variable kann ich direkt nutzen. INDEED ;-)

                regds
                Mike