Anmelden

Archiv verlassen und diese Seite im Standarddesign anzeigen : PHP - SessionProbleme



WebRobert
24.01.2005, 14:07
hallo Leute koennt ihr mir helfen mit meinem board?!?

auf meiner haupt-board-seite wo alles includet wird steht session_start();

so beim einloggen wird zB reingeschrieben:
$_SESSION["name"] = $name;
$_SESSION["passwort"] = $passwort;

so, dann wird auch alles richtig gemacht, wird dann auch zB ueber
$login_name = $_SESSION["name"];
print("$login_name");
auch alles richtig ausgegeben, nur wenn ich dann zB weiter klicke zB in ein thread reingehe, dann ist auf einmal nichts mehr in der session drinne und wird nichts ausgegeben und bin dann nicht eingeloggt!

woran kann dies liegen? im prinzip ist alles richtig, denn bei mir auf dem apache2 server funzt alles einwandfrei, nur nicht auf dem server im internet!

plz help! thx im voraus! http://www.multimediaxis.de/images/smilies/old/sm_12.gif

mfg WebRobert


Wollte nur mal angemerkt haben, daß ich den Thread ins Webdev-Forum verschoben habe. --Jeez

Lukas
24.01.2005, 14:12
Pack in die erste Zeile des Php-Codes jeder(!) Seite den Befehl session_start() rein.
Und poste nächstes mal ins Webdesigner-/Programmiererforum, wenn du eine Frage zu Php hast (zumindest, wenn sie eindeutig Webprogrammierung bestrifft).

WebRobert
24.01.2005, 14:27
ds hab ich jetzt gemacht und klappt trotzdem nicht!
woran kann es liegen?

ich hab jetzt sogar bei reinschreiben in die session
statt $_SESSION["name"] = $name;
dies gemacht:
$name = "hans";
session_register("name");

und geht immer noch nicht! help!

Lukas
24.01.2005, 14:33
Ich hab' nicht soviel Ahnung von Session. Werden die Session-IDs bei dir evtl. nur mittels Cookie gespeichert? Wenn ja, würde ich das ändern, viele Surfer lassen nicht alle Cookies zu.

WebRobert
24.01.2005, 14:42
Ich hab' nicht soviel Ahnung von Session. Werden die Session-IDs bei dir evtl. nur mittels Cookie gespeichert? Wenn ja, würde ich das ändern, viele Surfer lassen nicht alle Cookies zu.
wie soll ich denn das aendern? ich hab auch nicht viel ahnung mit sessions!

Latency
24.01.2005, 15:21
Einfach die Session ID per GET übermitteln, du hast zwar dann immer nen häßlichen Hash in der Leiste, aber dafür braucht es keine Cookies.

Saturo
04.02.2005, 20:03
Ich versteh ja das Anti-Cookie Argument. Aber jeder der aktiv in Foren mitwirkt wird wohl Cookies aktiviert haben.

Ohne Cookies funktioniert zB das automatische Einloggen nicht mehr.

dead_orc
04.02.2005, 21:49
Das beruhigt mich: Ich bin nicht der einzige, der Probleme mit Sessions hat :)
Möglich wäre es, dass du in der ersten Datei mit session_name() der Session einen neuen Namen zugewiesen hast und es deshalb nicht funktioniert. Um die SID per URL zu übergeben musst du "nur" an jeden Link folgendes anhängen:

echo '<a href="index.php?'.SID.'">Index</a>';
echo '<a href="view_forum.php?id=3&'.SID.'">Forum</a>';

Manni
05.02.2005, 07:25
@ ork
Wäre das nicht so sinnvoller:

echo '<a href="index.php?SID='.SID.'">Index</a>';
echo '<a href="view_forum.php?id=3&SID='.SID.'">Forum</a>';
Sonst kommt man irgendwie nicht so gut an die ID ran...
(BTW, muss man nicht &amp; statt & nehmen? Zumindest für den Validator ;))

dead_orc
05.02.2005, 08:42
Zitat aus dem PHP-Manual zur Konstante "SID" (http://de3.php.net/manual/de/ref.session.php#session.constants):

Konstante, die entweder den Namen und die ID der Session in der Form "name=ID" enthält oder eine leere Zeichenkette, falls die Session-ID in einem entsprechenden Cookie gesetzt wurde.
Aber das mit &amp; statt & stimmt, hab ich kurzfristig vergessen ;) (der Validator hätte mich ja aber freundlich darauf hingewiesen :D )

Dingsi
05.02.2005, 10:34
statt $_SESSION["name"] = $name;
dies gemacht:
$name = "hans";
session_register("name");Piiiiiiiiep.

$bla = "123";
session_register("bla");Veraltet, unsauber und nur bei aktivierten register_globals funktional (Bei neueren PHP-Version sind register_globals endlich standardmäßig deaktiviert). Besser und mMn übersichtlicher ist es folgendes zu machen:
$_SESSION['bla'] = "123";

WebRobert
05.02.2005, 19:14
@dingsi:
das mit der veralteten weise hab ich auch nicht angewendet, mache es so wie du es gesagt hast, aber hatte ich auch schon fueher gemacht, bevor du es mir gesagt hast! :)

@all:
das prob ist behoben, musste einfach in den internet-optionen unter datenschutz automatisches cookie-bearbeiten ausmachen und somit einfach cookies annehmen!

mit firefox ging das sowieso sofort einwandfrei!

thx fuer alle fleissigen posts und hilfe-versuche! http://www.multimediaxis.de/images/smilies/old/sm_12.gif

mfg WebRobert

Tomarus
05.02.2005, 20:47
Ja ... ich hab auch irgendwie gerade ein dämliches Sessionproblem >_>


Hab mich jetzt mal ein klein wenig mit Sessions auseinandergesetzt und die dann auch anstelle der Cookies verwendet ... aber sobald ich auch nur ein session_start(); an den Anfang der Datei schreib, weigert sich mein Browser strikt, diese aufzurufen ._.

Siehe auch hier (http://forum.rpg-ring.com/forum/showthread.php?t=51075)
Aus irgendeinem Grund will nichts mehr funktionieren, wenn ich auch nur session_start(); hinschreibe und den restlichen Sessionkram (ohne den es vorher ja funktioniert hatte) weglasse ... der erste Teil des Scripts (mit PHP-Anweisungen) sieht so aus ...



<?php session_start();
include ('global.php'); // mit MySQL-Verbindung usw.

if ($_GET['autologin'] != 'false' && isset ($_COOKIE['chat_user']) && isset ($_COOKIE['chat_pass']))
{
$username = $_COOKIE['chat_user'];
$password = $_COOKIE['chat_pass'];
}
else
{
$username = $_POST['user'];
$password = md5($_POST['pass']);
}

$select = mysql_query ('SELECT `ID`, `pass` FROM `chat_users` WHERE `user` = "'.$username.'"');
while ($row = mysql_fetch_array ($select))
{
if ($password == $row[1])
{
$_SESSION['chat_logged'] = true;
$_SESSION['chat_logged_as_id'] = $row[0];
$_SESSION['chat_logged_as'] = $username;
$_SESSION['chat_logged_pass'] = $row[1];

if ($_POST['cookie'] == true && !isset ($_COOKIE['chat_user']))
{
setcookie ('chat_user', $_POST['user'], time() + 60*60*24*365);
setcookie ('chat_pass', md5($_POST['pass']), time() + 60*60*24*365);
}

mysql_query ('UPDATE `chat_users` SET `lastlogin` = NOW(), `active` = 1 WHERE `user` = "'.$username.'"');
mysql_query ('INSERT INTO `chat_messages` (`msg`, `user`, `zeit`) VALUES ("'.$username.' hat sich gerade eingeloggt!", "-Chatbot-", NOW())');
header ('Location: chat.php?'.SID); // wobei ich mir nicht ganz sicher war, ohne SID geht's aber auch nicht
exit();
}
} ?>


Das einzig veränderte daran ist eigentlich der Teil nach der Passwortkontrolle, und zwar dass nun die Daten in Sessionvariablen und nicht mehr in Cookies gespeichert werden ... mit Cookies funktionierte es zwar in den Grundlagen, führte aber zu Fehlern. Wäre schön wenn mir wer das erklären kann ._.

Chocwise
06.02.2005, 02:45
@ Tomarus:
Browser haben mit Sessions nix zu tun... zumindest nicht mit diesen PHP-Sessions.
Alles findet auf dem Server statt
Hat ein User noch keine Session-ID (welche per Cookie oder auch per GET-Variable an das Script übergeben wird) wird per session_start() eine ID angelegt.
Jede Session-ID hat dann ein Konto an Variablen die man mit der ID assoziiert anlegen kann und die, soweit die Session-ID an das Script übergeben wird (per Cookie oder auch GET-Variable), kann das Script auf das damit Assoziierte Konto zurückgreifen.
Alles was nun also ein Browser tun können muss, ist:
1.: Cookies annehmen und an Scripte übergeben,
oder
2.: Variablen+Werte per GET an ein Script übergeben.
Ersteres können schätzungsweise 90% aller Clients die im Netz unterwegs sind.
Zweiteres... *zucktmitdenschultern* 99%.

Hier stellt sich ergo eher die Frage, ob dein Server überhaupt mit Sessions klarkommt.
Mach halt mal'n phpinfo() und schau was dort bei den Sessions erlaubt ist.

Ansonsten ist dieser Text zum Thema Sessions recht interessant:
http://tut.php-q.net/sessions.html

Tomarus
06.02.2005, 10:29
Hatte ich schon nachgeschaut, wusst nur net genau, was da nu aktiviert sein muss und was nicht ... also die infophp.php (http://www.tomarus.de/infophp.php) sagt mir folgendes ...



Session Support enabled
Registered save handlers files user mm

Directive Local Value Master Value
session.auto_start Off Off
session.bug_compat_42 On On
session.bug_compat_warn On On
session.cache_expire 180 180
session.cache_limiter nocache nocache
session.cookie_domain no value no value
session.cookie_lifetime 0 0
session.cookie_path / /
session.cookie_secure Off Off
session.entropy_file no value no value
session.entropy_length 0 0
session.gc_dividend 100 100
session.gc_maxlifetime 1440 1440
session.gc_probability 1 1
session.name PHPSESSID PHPSESSID
session.referer_check no value no value
session.save_handler files files
session.save_path /tmp /tmp
session.serialize_handler php php
session.use_cookies On On
session.use_only_cookies Off Off
session.use_trans_sid On On


Hat das was mit dem Autostartdingens zu tun? Aber ich mein ... müsst dann beim Aufrufen der Datei nicht wenigstens ne Fehlermeldung oder der HTML-Teil der Datei angezeigt werden? Ist ja gleich auf der Loginseite, auf der die Session eigentlich erst nach dem erfolgreichen Login starten sollte ._. Und außerdem, einmal hatte ich auf diesem Server schon was mit Sessions gemacht, und da funktionierte es auch ...

Ich werd's mal eben auf nem anderen Host versuchen ... gestern hat mein FTP-Prog gestreikt >_>
[edit] Habs mal woanders getestet ... da streikt er zwar nicht gleich wegen dem session_start();, funktionieren tut's aber auch nichts >_>

WebRobert
08.02.2005, 16:15
ich hatte das gleiche prob dass er session_start() net erkennen konnte!

das liegt aber daran, das der internet explorer standartmaessig cookies nicht annimmt!
firefox tut dies!

mit dem IE:

du gehst auf internet optionen -> datenschutz -> erweitert-> automatische cookiebehandlung ausschalten (haekchen hinmachen!)

so muesste das gehen!

mfg WebRobert

Tomarus
08.02.2005, 17:48
Öhm joar ... nur haben Sessions nicht unbedingt was mit Cookies zu tun, und zweitens benutz ich ja normalerweise Opera und hab überall anders mit Sessions keine Probleme >_>

Es ist einfach nur, dass die Seite, sobald ich das session_start(); in die erste Zeile schreibe, nicht mehr will >_>

Kann jetzt eigentlich irgendwer diese phpinfo da oben deuten? :\

Chocwise
08.02.2005, 18:06
...Kann jetzt eigentlich irgendwer diese phpinfo da oben deuten? :\
Keine Ungereimtheiten, bis auf den Umstand, das dein SID nicht funktionieren wird.
Standard-Name des Variable-Value-Paars ist PHPSESSID.
Wie man nun einen anderen, eigenen Namen per PHP-Funktion im Script initiiert, weiß ich nicht, geht aber. Ich machs direkt in der php.ini. Das ist der Vorteil eines root-Zugangs. :D

Weshalb dein Script nun so seltsam reagiert, weiß ich nicht. Ich bin zu faul/hab zu viel zu schaffen dein Script bis ins Detail zu analysieren.

dead_orc
08.02.2005, 18:47
session_name('SID'); (http://de2.php.net/session_name)
It's as easy as that!
Muss aber vor jedem session_start() neu aufgerufen werden :(

Dingsi
08.02.2005, 18:48
Irgendwie fühle ich mich langsam schlecht, nie was zum Problem selber zu schreiben sondern nur zu anderen Sachen die nebenbei erwähnt wurden.. Aber auch nur langsam..
Wie man nun einen anderen, eigenen Namen per PHP-Funktion im Script initiiert, weiß ich nicht, geht aber.Jup. Vor dem session_start(); einfach session_name("name_fur_session"); Machen. Unter name_fur_session wird dann der Cookie bzw die GET-Variable gespeichert...

EINE Sekunde. EINE. :/.
Quatsch, eine Minute.

Tomarus
10.02.2005, 17:16
Dieses Sache regt mich auf >_>


<?php include ('global.php');
session_start();

if (isset ($_COOKIE['chat_user']) && isset ($_COOKIE['chat_pass']))
{
$username = $_COOKIE['chat_user'];
$password = $_COOKIE['chat_pass'];
}
else
{
$username = $_POST['user'];
$password = md5($_POST['pass']);
}

$select = mysql_query ('SELECT `ID`, `pass` FROM `chat_users` WHERE `user` = "'.$username.'"');
while ($row = mysql_fetch_array ($select))
{
if ($password == $row[1])
{
$_SESSION['chat_logged'] = true;
$_SESSION['chat_logged_as_id'] = $row[0];
$_SESSION['chat_logged_as'] = $username;
$_SESSION['chat_logged_pass'] = $row[1];

if ($_POST['cookie'] == true && !isset ($_COOKIE['chat_user']))
{
setcookie ('chat_user', $_POST['user'], time() + 60*60*24*365);
setcookie ('chat_pass', md5($_POST['pass']), time() + 60*60*24*365);
}

mysql_query ('UPDATE `chat_users` SET `lastlogin` = NOW(), `active` = 1 WHERE `user` = "'.$username.'"');
mysql_query ('INSERT INTO `chat_messages` (`msg`, `user`, `zeit`) VALUES ("'.$username.' hat sich gerade eingeloggt!", "-Chatbot-", NOW())');
header ('Location: chat.php?'.session_name().'='.session_id());
exit();
}
} ?>

Womit das mit dem SID gelöst wäre, der Rest aber nicht :/
Was mir aufgefallen ist: Ich habe das gleiche einmal für ein Login in meinem 1337-Forum verwendet. Beim ersten Mal klappte es, und es wurden auch alle $_SESSION-Variablen richtig ausgegeben. Wenn ich das Dokument dann aber noch ein zweites Mal aufrufe, geht wieder gar nichts ;_; Ich dachte, die Sessiondaten werden gelöscht, wenn man den Browser schließt? Scheint mir ja irgendwie damit zusammenzuhängen ... aber ich hab irgendwie grad überhaupt keine Ahnung mehr ;_; Hat nicht zufällig schon mal irgendwer so einen Session-Login gemacht und könnte mir seine Erfahrungen vermachen? ;_; Oder alternativ, wie könnte ich Sessions ... automatisch manuell ;_; löschen lassen, sobald der Besucher nicht mehr auf der Seite verweilt?

Manni
10.02.2005, 19:11
Ich denke mal, Sessions bleiben auch länger bestehen, auch wenn man den Browser schließt. Sie werden erst gelöscht, wenn du dich neu ins Internet einloggst und eine adere IP Adresse bekommst.
Manuelles Löschen könntest du nur mit JavaScript machen, indem Javascript beim Schließen der Seite ein PHP Script aufruft, das dich ausloggt. Ansonsten bau einfach einen Logoutknopf ein und benutz session_destroy() ;)

Chocwise
10.02.2005, 19:50
Ich denke mal, Sessions bleiben auch länger bestehen, auch wenn man den Browser schließt. Sie werden erst gelöscht, wenn du dich neu ins Internet einloggst und eine adere IP Adresse bekommst.
Manuelles Löschen könntest du nur mit JavaScript machen, indem Javascript beim Schließen der Seite ein PHP Script aufruft, das dich ausloggt. Ansonsten bau einfach einen Logoutknopf ein und benutz session_destroy() ;)
Standardmäßig sind Sessions nicht IP-Abhängig.
Man kann es allerdings so einrichten und einen zusätzlichen Schutz einbauen, das man nicht aus Versehen eine URL weitergibt, in der die eigene SID steht, und der Empfänger dann die Session übernehmen kann, indem man die IP in einer Sessionvariable speichert und das Nutzen der Session nur deinem Client mit dieser IP erlaubt.

dead_orc
11.02.2005, 12:56
Rein interessehalber: Wie überprüfst du dann, ob der User eingeloggt ist?
Könntest du das ganze evtl. mit einem Test-Zugang hochladen?

Tomarus
11.02.2005, 13:26
Naja ... halt Loginformular -> Loginkontrolle (siehe oben) -> und dann, wenn man zum Beispiel im meinem tollen Forum einen Beitrag schreiben will, wird das nochmal kontrolliert ... oder meinst du, es würde helfen, wenn ich die $_SESSION['chat_logged'] wegließe? Wobei ich das auch nochmal einzeln kontrollieren lass ... könnt die also auch weglassen, ich glaube aber kaum, dass es an der liegt, dass sich die gesamte Seite nicht mehr wirklich aufrufen lässt ...

Das Formular funktionierte ja ... nur sobald ich das session_start() in die Seite schreib, will halt die ganze Seite nicht mehr ._.