Sessions funktionieren nicht richtig
Manuel
- php
0 Tom0 Manuel0 Magic Mike0 Manuel0 Magic Mike0 Manuel0 Magic Mike0 Manuel0 Magic Mike0 Manuel0 Sven Rautenberg
0 Magic Mike
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
Hello,
wie teilst Du dem Server denn mit, dass er eine Session benutzen soll?
Liebe Grüße aus http://www.braunschweig.de
Tom
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
Moin Manuel,
zur Sicherheit. Welcher Wert ist hier gesetzt:
session.auto_start?
und der hier:
session.use_cookies?
regds
Mike
Hi,
meinst du die php.ini?
Falls ja, auf die hab ich glaub ich keinen Zugriff. Kann man das irgendwie anders herausfinden?
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
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?
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
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.
Moin Manuel,,
<?php session_start();
if (isset ($_SESSION["id"]))
{
echo $_SESSION["vorname"]." ".$_SESSION["nachname"];
}
?>
Lasse mal das wech:
if (isset ($_SESSION["id"]))
regds
Mike
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
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
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
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!
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
Ich hatte es drin weil ich bei meiner lokalen Testumgebung Probleme bei der Variableübergabe hatte!
mfg
Manuel
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
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
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
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
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
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
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
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