mark: anwendung von sessions

hi,

ich bin ziemlich am anfang von php und (noch immer) begeistert! :)
jetzt möchte ich auf meine webseite nur user zulassen, die ein korrektes (vorgegebenes) login/passwort eingeben. um dies auf der ganzen seite dann zu behalten, will ich mit sessions arbeiten.
ich kenne ungefähr die grundlegenden funktionsweisen von session_start() etc., aber noch ist mir die genaue anwendung nicht klar. deshalb ein paar fragen:

. wo speicher ich username/passwort (in extra datei)?
. wie greift php auf diese daten zu, wenn der user sie eingibt?
. wie erreiche ich, dass die session während des kompletten verweilens auf meiner webseite behalten wird? muss auf jeder seite das vorhandensein abgefragt werden?

schon mal vielen dank für jeden hinweis!!

mark

  1. . wo speicher ich username/passwort (in extra datei)?

    Wo Du die Daten zum Login speicherst, bleibt Deiner Phantasie überlassen. Das kann eine einfache Textdatei sein, besser noch eine Datei mit eingebautem Index (db/dbm) oder, bei vielen Nutzern oder vielfälltigen Benutzerdaten, eine echte Datenbank.
    Achte aber in jedem Falle darauf, NICHT die PASSWÖRTER im Klartext zu SPEICHERN. Speichere stattdessen zum Beispiel eine mit md5() erstellte Prüfsumme.

    In der Session ($_SESSION) speicherst Du gar keine Passwortdaten, lediglich den Nutzernamen.

    . wie greift php auf diese daten zu, wenn der user sie eingibt?

    Was meinst Du damit? Formulardaten bekommst Du von PHP in einem Feld namens $_POST geliefert, die Sessiondaten werden von PHP automatisch im Feld $_SESSION gesichert.

    Benutze phpinfo(), um Dich über die von PHP zur Verfügung gestellten Variablen zu informieren.

    . wie erreiche ich, dass die session während des kompletten verweilens auf meiner webseite behalten wird?

    Das passiert automatisch. Die Sessiondaten werden auf dem Server gespeichert, dieser gesamte Datensatz mit einer eindeutigen Kennung versehen. Diese Kennung wiederum ("Session-ID") wird von PHP in einem Cookie im Browser gespeichert.
    Cookies werden automatisch bei jeder Anfrage an den Server gesendet, so daß PHP auch bei jeder Anfrage die Kennung erhält und an Hand dieser schlußendlich den gespeicherten Datensatz für Dich in $_SESSION bereit stellen.

    Gruß,
      soenk.e

    1. Hi Sönke,
      vielleicht kannst du mir ja helfen.
      Ich habe in der Datei, nennen wir sie einfach test.php, ein Formular, welches ich an eine seite auswert.php schicken will. Diese Seite auswert.php soll sich aber im popup öffnen. Das mache über Javascript (window.open). So mein Problem liegt darin, dass test.php die Variablen nicht an auswert.php übergibt, weil es im popup geöffnet wurde. Deshalb habe ich PHP-Sessions gesetz. Es klappt aber immer noch nicht. Hier sind die Auszüge aus den Dateien:
      test.php:
      <html>
      <head>
      <?PHP
      @session_start();
      session_register("ort");
      ?>
      <title>PopUp - Test</title>
      <script language="JavaScript" type="text/javascript">
      function popup()
      {
      F=window.open("auswert.php?<?=SID?>","neu","width=500,height=300");
       }
      </script>
      </head>
      <body>
      <a href="javascript:popup()">Fenster anzeigen</a>
      <form action='javascript:popup()'  method="post">
      <input type="text" NAME="ort" SIZE="39">
      <INPUT type='submit' value='Abschicken' >
      </form>
      </body>
      </html>
      auswert.php:
      <html>
      <head>
      <title>Hallo</title>
      </head>
      <body>
      <?PHP
      @session_start();
      echo $ort;
      ?>
      </body>
      </html>
      Es klappt niiiiiiicht!!!!

      1. Ich habe in der Datei, nennen wir sie einfach test.php, ein Formular, welches ich an eine seite auswert.php schicken will. Diese Seite auswert.php soll sich aber im popup öffnen. Das mache über Javascript (window.open). So mein Problem liegt darin, dass test.php die Variablen nicht an auswert.php übergibt, weil es im popup geöffnet wurde. Deshalb habe ich PHP-Sessions gesetz. Es klappt aber immer noch nicht. Hier sind die Auszüge aus den Dateien:

        @session_start();

        Den Klammeraffen solltest Du nicht einsetzen. Fehlermeldungen sind dazu da, gelesen zu werden. Oder anders ausgedrückt: Wie willst Du jemals Deine Skripte fertig kriegen, wenn Du sämtliche Fehler ignorierst?

        Daß Fehlermeldungen auf öffentlichen Seiten nichts zu suchen haben, ist natürlich klar. Mittels display_errors und log_errors (siehe PHP-Anleitung, Kapitel Konfiguration) kannst Du die Meldungen in der Seite unterdrücken und stattdessen im Fehlerprotokoll des Servers sichern. Beide Direktiven lassen sich auch in einer .htaccess setzen (wiederum: siehe Anleitung).

        session_register("ort");

        Wenn ich mich recht entsinne, benutzt man _entweder_ session_start() _oder_ session_register(), aber nicht beides.

        Mir persönlich gefällt die Benutzung von session_start() und $_SESSION[] besser, da im gesamten Skript nur ein Aufruf einer session_*()-Funktion nötig ist und alle Sessionvariablen schön an einem Platz und vollautomatisch im Feld $_SESSION bleiben.

        Davon abgesehen reicht es nicht, einfach irgendeine Variable zu registrieren. Du hast nirgends im PHP-Teil eine Zeile, die die Formulardaten (hier: "ort") in die Sessionvariablen (hier: $ort) verfrachtet. Von alleine kommen sie da nicht hin!

        Allerdings macht es Deine Funktionslogik (Formularziel ist ein neues Fenster) in der Tat etwas kompliziert.

        <script language="JavaScript" type="text/javascript">

        (nur nebenbei: Das language-Attribut ist überflüssig, type reicht und entspricht dem HTML-Standard.)

        function popup()
        {
        F=window.open("auswert.php?<?=SID?>","neu","width=500,height=300");
        }

        <form action='javascript:popup()'  method="post">
        <input type="text" NAME="ort" SIZE="39">

        Wie eben geschrieben: Eine verzwickte Angelegenheit; ich möchte glatt behaupten, daß es mit "post" überhaupt nicht geht (lass mich aber gerne eines besseren belehren).

        Mein Ansatz wäre, das Datum aus dem ort-Feld stattdessen an die URL anzuhängen:

        window.open("auswert.php?ort="+escape(document.forms[0].ort.value),"neu","width=500,height=300");

        Du erhälst dann das Datum von ort in auswert.php in einer Variable namens $_GET["ort"] (oder $HTTP_GET_VARS["ort"]). escape() ist nötig, um Zeichen, die in einer URL nicht erlaubt sind, zu maskieren. Nach dem gleichen Schema kannst Du natürlich auch weitere Daten anhängen, immer schön getrennt durch das Zeichen & .

        Auf diese Art und Weise bist Du das Session-Problem vollständig los, trotzdem noch eine allgemeine Anmerkung:

        @session_start();
        echo $ort;

        Externe Variablen erscheinen seit PHP-Version 4.1 (vor einigen Monaten rausgekommen, aktuell ist 4.3) nicht mehr standardmäßig global, sondern nur in dafür vorgesehenen Feldern ($_SESSION ist so eines, aber auch $_POST, $_GET, $_COOKIE und $_SERVER).

        Von daher fährst Du an derartigen Stellen mit

        echo $_SESSION["ort"];

        oder (für ältere PHP-Versionen)

        echo $HTTP_SESSION_VARS["ort"];

        besser. Nicht, daß Du Dich dumm aus der Wäsche schaust, sobald Dein Hoster sich zur Abwechslung mal um aktuelle Software bemüht ;)

        Gruß,
          soenk.e

        1. Danke für die konstruktive Kritik werde sie morgen in die Tat umsetzten und eventuell nochmal ins Forum zurückkehren falls es immer noch nicht klappt. Im generellen möchte ich aber die Session beibehalten, da dies ja nur ein Test war und das wahre Dokument unmengen mehr an Feldern hat und es somit nicht gerade schön wäre alle Variablen über die Url mitzuteilen!
          Über die "session_register("ort");" wollte ich die Session nicht nochmal initialisieren, sondern die Variable in der Session deklarieren.

          Ansonsten See you

          1. Im generellen möchte ich aber die Session beibehalten, da dies ja nur ein Test war und das wahre Dokument unmengen mehr an Feldern hat und es somit nicht gerade schön wäre alle Variablen über die Url mitzuteilen!

            Ist vielleicht nicht deutlich geworden: Das Problem ist nicht die Sessiongeschichte, das Problem ist, daß das Formular kein brauchbares Ziel hat.
            Formulare übertragen ihre Daten per HTTP. Du hast aber kein HTTP-Ziel angegeben, sondern Javascript (zwangsläufig, wegen dem neuen Fenster), weshalb das Formular nichts übermitteln kann. Die Daten _müssen_ per HTTP übermittelt werden, damit der Kram vom Browser (wo das Formular und Javascript sitzen) auf den Server (wo PHP sitzt) kommt. Anders geht es nicht.
            Daher auch mein Ansatz die Formulardaten manuell (per Javasript) an eine HTTP-URL anzuhängen.

            Genau betrachtet kommst Du mit einer Session bei diesem Problem nirgendwo hin, weil sich die Sessiondaten auf dem Server befinden, die Formulardaten aber im Browser - womit wir wieder beim eben dargelegten Transportproblem "Browser -> Server: HTTP" wären.

            Eine wilde Alternative, die mir gerade einfällt: Wie bisher ein neues Fenster öffnen, dort ein (verstecktes) Formular aufbauen, diesem Formular die Daten aus dem Hauptformular verpassen und es dann abschicken.
            Das sollte alles per Javascript möglich sein und somit ohne Wissen des Benutzers. Und der obligatorische Hinweis: Leute, die Javascript ausgeschaltet haben (wofür es sehr gute Gründe gibt), haben nichts von dieser akrobatischen Leistung.

            Über die "session_register("ort");" wollte ich die Session nicht nochmal initialisieren, sondern die Variable in der Session deklarieren.

            Das ist bei session_start() nicht nötig, alles in $_SESSION[] (bzw. $HTTP_SESSION_VARS[] vor PHP 4.1) wird automatisch gespeichert.

            Gruß,
              soenk.e