MichaelS: Bei gleichen Daten bleiben und auch session!! Aber wie?

Hallo Ihr !

Hantiere nun mit PHP und komme auch langsam in die Materie rein, aber habe noch ein kleiones problem.

Habe eine Homepage wprin unteranderem auch sowas wie ein Eshop enthalten ist, der nach Kunden gehen soll. Sprich... Kunde loggt sich mit seinem Benutzernamen und seinem Kennwort ein und darf dann aber nur seine Daten sehen... Angebotsanfragen, Bestellungen usw.

Eine Session ist ja immer nur "einmal" gültig pro Einloggen, oder? Denke ich zumindest.... Kann ich es irgendwie drehen, daß zum beispiel der benutzername oder die Kundennummer sie session ist der eine kombination aus Sessionnummer und der z.B. Kundennummer....

Habe bei einem Versuch nämlich festgestellt, wenn ich mich ohne einer "Kundennummertrennung" erneut einlogge, sehe ich alle daten... das soll ja so nicht sein...

Kann mir da einer eine Sprunghilfe geben ??

Danke schonmal vorab...

Michael

  1. Habe eine Homepage wprin unteranderem auch sowas wie ein Eshop enthalten ist, der nach Kunden gehen soll. Sprich... Kunde loggt sich mit seinem Benutzernamen und seinem Kennwort ein und darf dann aber nur seine Daten sehen... Angebotsanfragen, Bestellungen usw.

    Eine Session ist ja immer nur "einmal" gültig pro Einloggen, oder?

    Jein. Eine Session ist gültig, bis Du sie entweder explizit mit session_destroy() löschst, bis der Cookie verfällt (zum Beispiel beim Beenden des Browsers) oder die Session selber verfällt (d.h. eine Weile lang nicht mehr benutzt wurde).

    Denke ich zumindest.... Kann ich es irgendwie drehen, daß zum beispiel der benutzername oder die Kundennummer sie session ist der eine kombination aus Sessionnummer und der z.B. Kundennummer....

    Das macht so wie ich Dich verstehe keinen Sinn. Da bräuchte ich mir ja nur Deine Kundennummer holen, in meinem Browser eintragen und schon komme ich an Deine Daten.
    Die vom Server vergebene Session-ID ist so, wie sie erscheint, schon vollkommen in Ordnung: absolut zufällig und deshalb absolut nicht vorhersehbar.

    Habe bei einem Versuch nämlich festgestellt, wenn ich mich ohne einer "Kundennummertrennung" erneut einlogge, sehe ich alle daten... das soll ja so nicht sein...

    Was meinst Du mit "Kundennummertrennung"? Dein Problem ist möglicherweise schlicht und ergreifend, daß Du vergessen hast, die Session zu beenden, d.h. Dich auszuloggen. Solange das nicht geschehen ist, sendet Dein Browser weiterhin den Cookie mit der Session-ID und Du verbleibst in der Session. Erst nach einem Aufruf von session_destroy() wird die Session gelöscht.

    Gruß,
      soenk.e

    1. Jein. Eine Session ist gültig, bis Du sie entweder explizit mit session_destroy() löschst, bis der Cookie verfällt (zum Beispiel beim Beenden des Browsers) oder die Session selber verfällt (d.h. eine Weile lang nicht mehr benutzt wurde).

      Ok, das habe ich schonmal verstanden ;-) ist ok... werde ich umsetzen.

      Das macht so wie ich Dich verstehe keinen Sinn. Da bräuchte ich mir ja nur Deine Kundennummer holen, in meinem Browser eintragen und schon komme ich an Deine Daten.
      Die vom Server vergebene Session-ID ist so, wie sie erscheint, schon vollkommen in Ordnung: absolut zufällig und deshalb absolut nicht vorhersehbar.

      Ok, wenn ich diese Session vom Server aus lasse, wie kann ich mir dann nur daten bzw. der anwender nur daten von sich selbst ansehen. Wie bringe ich sagen wir mal den benutzernamen in verbindung zu der Kundennummer (wäre ja noch möglich indem ich in der benutzerverwaltung die kdnr. noch angebe) ... aber ich meine wie bringe ich dann die Anzeige auf dem Bildschirm ( :-) ) dazu, nur daten von dem Benutzer anzuzeigen und nicht alle... Der benutzername steht ja nicht in verbindung mir der sessionnummer oder?

      Danke...

      Michael

      1. Hi,

        Der benutzername steht ja nicht in verbindung mir der sessionnummer oder?

        je nachdem wie Du es definierst
        wenn Du in dieser session eine Varianble $benutzername definierst
        $_SESSION["benutzername"] = nameausform;

        danach kannst Du alle Abfragen an Datenbanken oder ähnlichemit diesem Benutzernamen machen.

        Also:  1. Login
         2. der username wird überprüft und dann in einer sessionvariable gespeichert
         3. diese kannst Du für alle Angaben benutzen
         4. bis sich der nutzer ausloggt, wo du ein session_destroy() einfügen musst

        hih
        ciao
        romy

        --
        DIE ROMY AUS L. AN DER P. SAGT DANKE UND AUF WIEDERSEHEN
        ->Alles ist gut wenn es aus Schokolade ist
        1. $_SESSION["benutzername"] = nameausform;
          danach kannst Du alle Abfragen an Datenbanken oder ähnlichemit diesem Benutzernamen machen.
          Also:  1. Login
           2. der username wird überprüft und dann in einer sessionvariable gespeichert
           3. diese kannst Du für alle Angaben benutzen
           4. bis sich der nutzer ausloggt, wo du ein session_destroy() einfügen musst

          Wo muß ich in diesem php das mit Session eintragen??
          <?php
          include("kontakt.inc");
          if(@mysql_connect($host, $user, $pwd))
          if(@mysql_select_db($dbname))
            {
            $erg=@mysql_query("SELECT benutzername, kw FROM benutzer WHERE benutzername = '{$_POST['benutzername']}' AND kw = '".md5($_POST['kw'])."'");
            $erg=mysql_fetch_array($erg,MYSQL_ASSOC);
            if($erg['kw']==md5($_POST['kw']))
            header("Location: /wirtschaft/auswahl.htm");
            else
            header("Location: /wirtschaft/logginfehler.htm");
            }
          mysql_close()
          ?>

          Danke... meine Versuche klappen einfach nicht...

          1. Hi,

            Wo muß ich in diesem php das mit Session eintragen??
            <?php
            include("kontakt.inc");
            if(@mysql_connect($host, $user, $pwd))
            if(@mysql_select_db($dbname))
              {
              $erg=@mysql_query("SELECT benutzername, kw FROM benutzer WHERE benutzername = '{$_POST['benutzername']}' AND kw = '".md5($_POST['kw'])."'");
              $erg=mysql_fetch_array($erg,MYSQL_ASSOC);
              if($erg['kw']==md5($_POST['kw']))

            // hierhin
             session_start();
             $_SESSION["benutzername"] = $_POST["benutzername"];

            header("Location: /wirtschaft/auswahl.htm");
              else
              header("Location: /wirtschaft/logginfehler.htm");
              }
            mysql_close()
            ?>

            irgendwie muss man jetzt noch die session auf den Folgeseiten initialisieren, leider habe ich auf diese Frage selbst noch keine Antowrt erhalten, was man da schreibt. Früher zu Zeiten von $HTTP_SESSION_VARS hat man einfach am seiten anfang ein session_register("benutzername") geschrieben
            Kann sein, dass durch dass dierekte Einschreiben in die session, die werte auch so überall zur Verfügung stehen.

            ciao
            romy

            --
            DIE ROMY AUS L. AN DER P. SAGT DANKE UND AUF WIEDERSEHEN
            ->Alles ist gut wenn es aus Schokolade ist
            1. Halloa ;-)
              ....

              if($erg['kw']==md5($_POST['kw']))
              // hierhin
               session_start();
               $_SESSION["benutzername"] = $_POST["benutzername"];
                header("Location: /wirtschaft/auswahl.htm");
                else

              So, das habe ich schonmal gemacht... soweit schon mal danke, aber jetzt bekomme ich eine Fehlermeldung, daß er den header nicht mehr mag !
              Meldung : parse error in e:\jupu.org\_cgi-bin\kennungloggin.php on line 12

              Ich nehme mal an, es wird der Header gemeint... Aber was kann ich dagegen tun?

              Michael

            2. Hallo

              korrektur... er mag die esle anweisung nicht mehr... Gibt es da eine Alternative? Wegen Session und else`???

              <?php
              include("kontakt.inc");
              if(@mysql_connect($host, $user, $pwd))
              if(@mysql_select_db($dbname))
                {
                $erg=@mysql_query("SELECT benutzername, kw FROM benutzer WHERE benutzername = '{$_POST['benutzername']}' AND kw = '".md5($_POST['kw'])."'");
                $erg=mysql_fetch_array($erg,MYSQL_ASSOC);
                if($erg['kw']==md5($_POST['kw']))                      <<<<<
                session_start();                                       <<<<<
                $_SESSION["benutzername"] = $_POST["benutzername"];    <<<<<
                header("Location: /wirtschaft/auswahl.htm");           <<<<<
                else                                                   <<<<<
                header("Location: /wirtschaft/logginfehler.htm");
                }
              mysql_close()
              ?>

              1. Danke danke... habe es bemerkt... Diese {} ... Klammern haben gefehlt.... mann mann... Ab und zu sollte mann das Gehirn benutzen gelle? Ich weis...

                Trotzdem danke für eure Hilfe...

                Michael

            3. Wo muß ich in diesem php das mit Session eintragen??
              <?php
              include("kontakt.inc");
              if(@mysql_connect($host, $user, $pwd))
              if(@mysql_select_db($dbname))

              Gehört nicht zum Thema, aber das ist extrem unklug, was Du hier machst. Fehlermeldungen sind dazu da, Dich über Fehler zu informieren und Fehler müssen behoben werden. Wenn Du die Fehlermeldungen mit @ unterdrückst, wie gedenkst Du dann Fehler zu beheben?
              Du hast die Möglichkeit, Fehlermeldungen nicht in der Seite anzuzeigen, sondern in die Fehlerdatei des Webservers zu schreiben. Die Einstellungen dazu lauten display_errors und error_log (siehe PHP-Anleitung, Kapitel Konfiguration).

              {
                $erg=@mysql_query("SELECT benutzername, kw FROM benutzer WHERE benutzername = '{$_POST['benutzername']}' AND kw = '".md5($_POST['kw'])."'");

              Das ist auch nicht richtig. Wenn Du Daten von außen bekommst, tust Du gut daran, diese gegen Manipulationen abzusichern.

              $erg=mysql_query("SELECT benutzername, kw FROM benutzer WHERE benutzername = "".mysql_escape_string($_POST["benutzername"]."" AND kw = "".md5($_POST['kw']).""");
                if (! $erg) die("DB-Fehler: ".mysql_error());

              $erg=mysql_fetch_array($erg,MYSQL_ASSOC);
                if($erg['kw']==md5($_POST['kw']))

              Woher weißt Du, daß in $erg["kw"] tatsächlich ein Ergebnis steht? Das Passwort wurde schon in der SQL-Abfrage geprüft, Du kannst hier also genauso gut

              if (mysql_num_rows($erg)==1)

              angeben und vermeidest damit, auf nicht existierende Daten zuzugreifen.

              // hierhin
               session_start();
               $_SESSION["benutzername"] = $_POST["benutzername"];

              header("Location: /wirtschaft/auswahl.htm");
                else
                header("Location: /wirtschaft/logginfehler.htm");
                }

              Diese Weiterleitung ist teilweise unsinnig. Du mußt eh in jeder folgenden Seite prüfen, ob $_SESSION["benutzername"] gesetzt ist, da man andernfalls /wirtschaft/auswahl.htm auch genauso gut direkt anspringen kann. Von daher gehört dieser Teil in die einzelnen Seiten und nicht in das Loginformular.

              Die Angabe bei Location _muß_ eine vollständige URL sein, siehe HTTP-Spezifikation, Abschnitt 14.30: http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.30. Du bekommst den Hostnamen in $_SERVER["HTTP_HOST"].

              Weiterhin würde ich der Einfachheit (für die Nutzer) empfehlen, statt eines Benutzernames die Kundennummer zu verwenden bzw. allgemein nur Daten zu verwenden, die eh schon bekannt sind.
              Auf das Passwort kann man natürlich so oder so nicht verzichten.

              Schreibe Dir also eine Funktion, die prüft, ob der Benutzer schon eingeloggt ist oder sich gerade eingeloggt hat und rufe sie in jeder folgenden Seite auf. Alles in allem sieht das etwa so aus:

              function login()
                  {
                   session_start();
                   if (isset($_POST["kundennummer"])) ) // Login-Formular abgeschickt
                     {
                      if (! (($db=mysql_connect($host, $user, $pwd)) &&
                             (mysql_select_db($dbname))
                            )
                         ) die("DB-Fehler: ".mysql_error());
                      if (! $dbr=mysql_query("select blabla")) die("DB-Fehler: ".mysql_error());
                      if ($kunde=mysql_fetch_assoc($dbr))
                        {
                         $_SESSION["kunde"]=$kunde; // Kundendaten in Session speichern
                        }
                       else
                        {
                         $_SESSION=Array(); // fehlgeschlagener Login, Sessiondaten vorsichtshalber löschen
                         session_destroy();
                        };
                      mysql_free_result($dbr);
                     };
                   // an diesem Punkt muß entweder der Login geglückt sein oder
                   // bereits eine Session existieren, falls nicht: Seite verweigern
                   if (! isset($_SESSION["kunde"]["kundennummer"]))
                     {
                      header("HTTP/1.0 303 See other");
                      header("Location: http://".$_SERVER["HTTP_HOST"]."/wirtschaft/logginfehler.htm");
                      echo "<html><body><a href="/wirtschaft/logginfehler.htm">Logindaten fehlerhaft</a></body></html>";
                      exit(); // keine weitere Bearbeitung dieser Datei
                     };
                  };

              Die Funktion prüft zuerst, ob der Benutzer über das Loginformular gekommen ist und, falls dem so ist, holt die entsprechenden Kundendaten aus der Datenbank. Auf diese Art und Weise kann auch bei einem bereits eingeloggter Browser die Loginseite benutzt werden - man weiß ja nie. Tritt ein Loginfehler auf, wird die möglicherweise existierende Session gelöscht.
              Im zweiten, übergeordneten if-Block wird dann geprüft, ob in der aktuellen Session eine Kundennummer gesetzt ist. Falls nicht, wird der Browser an die Loginfehlerseite weitergeleitet und das Skript beendet. Existiert eine Kundennummer, wird die Funktion vollständig durchlaufen und die Seite weiter ausgegeben.

              Im Unterschied zu Deiner Variante habe ich gleich die kompletten Kundendaten in der Session gespeichert (daher $_SESSION["kunde"]["kundennummer"]). Das ist nicht unbedingt nötig, aber vielleicht brauchst Du außer der Kundennummer weitere Kundendaten; die sind dann bereits da und Du sparst eine relativ gesehen aufwendige Datenbankabfrage.

              irgendwie muss man jetzt noch die session auf den Folgeseiten initialisieren, leider habe ich auf diese Frage selbst noch keine Antowrt erhalten, was man da schreibt.

              Komisch, das möchte ich glatt für ein Gerücht halten (http://forum.de.selfhtml.org/archiv/2002/12/33231/#m180761)..

              Gruß,
                soenk.e

              1. Hi Sönke,

                irgendwie muss man jetzt noch die session auf den Folgeseiten initialisieren, leider habe ich auf diese Frage selbst noch keine Antowrt erhalten, was man da schreibt.
                Komisch, das möchte ich glatt für ein Gerücht halten (http://forum.de.selfhtml.org/archiv/2002/12/33231/#m180761)..

                hast Du die erste Zeile Deines Postings dort im nachhinein reingezaubert ;)
                ups, ich glaube, da habe ich mit fliegenden Augen diese Zeile übersehen
                Das ist mir peinlich *schäm*
                Aber jetzt macht es wenigstens Sinn, dh. also ich muss in den Folgeseiten
                einfach nur session_start() aufrufen und die session wird übernommen.

                Das erklärt mir so einiges. Dadurch sind die probleme von damals auch geklärt. Weil ich dort durch ein einfaches Session_start() die alte session wieder aufnehmen konnte (ich hatte immer geglaubt mit session_start() eröffnet man eine neue session, passiert;))

                Ich bin deswegen so extrem durcheinander gekommen, weil ich im Lernprozess mit PHP 4.1.0 gearbeitet habe und der Webserver aber auf PHP 4.0.4 arbeitet.
                Und plötzlich war alles anders ;)

                Nun gut...

                danke für Deine geduldige Hilfe

                ganz liebe Grüsse
                romy

                --
                DIE ROMY AUS L. AN DER P. SAGT DANKE UND AUF WIEDERSEHEN
                ->Alles ist gut wenn es aus Schokolade ist