Syli Geschrieben 2. März 2009 Teilen Geschrieben 2. März 2009 (bearbeitet) Hallo, ich möchte den benutzern meiner website nach einer bestimmten zeit (sagen wir mal 2 stunden) eine neue session_id() geben, allerdings nur wenn sie 2 stunden inacktiv waren... das ganze ist an einem counter für webstats gekoppelt um zu sehen auf welche seiten der benutzer wie lange zeit verbringt usw... mein bisherriger lösungsweg sieht etwa so aus: function counter(){ $user_ip = $_SERVER['REMOTE_ADDR']; $sid = session_id(); odb(); //verbindung zur mysql datenbank $qry = 'SELECT * FROM counter WHERE ip="'.$user_ip.'" AND sid="'.$sid.'" LIMIT 1'; $res = mysql_query($qry)or die(mysql_error()); $check_user = mysql_num_rows($res); $data = mysql_fetch_array($res); cdb(); //verbindung zur mysql datenbank trennen if ($check_user == 0){ counter_create($data); } if ($check_user == 1){ counter_update($data); } } [/PHP] die function counter_create() funktioniert soweit einwandfrei und trägt unteranderem ein: -eine ID für den benutzer -session_id() -acktueller timestamp -timestamp + 60*60*2 (timestamp 2 stunden in der zuckunft) und einige für hier belanglose dinge bei der funktion counter_update() hab ich allerdings ein kleines problem in den ersten zeilen: [PHP] function counter_update($data) { $ts = time(); if($data['timestamp_kill'] < $ts){ $sid = session_id(); echo $sid; session_regenerate_id(true); $sid = session_id(); echo " " .$sid; echo " kill"; } . . . . . . also in die schleife geht er rein, ich hab natürlich den timestamp nur auf 10 sekunden begrenzt um das zu kontrolieren, aber wie man sieht weis ich hier einfach nicht weiter... ich möchte halt nach 2 stunden inaktivität eine neue session_id() vergeben, nur funktioniert das weder mit: session_destroy(); session_regenerate_id(true); bei der 2. version schmeisst er mir zusätzlich noch diese fehlermeldung an den kopf: Warning: session_regenerate_id() [function.session-regenerate-id]: Cannot regenerate session id - headers already sent in D:\xampp\htdocs\ws\func\counter.php on line 74 währe um nen codesnippet nicht böse oder anregungen wie ich das problem lösen könnte! die session_id() übergebe ich überrigens nicht in der adresszeile, und möchte ich möglichst auch nicht! danke schonmal im vorraus! Bearbeitet 2. März 2009 von Syli Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
ZuVieL Geschrieben 2. März 2009 Teilen Geschrieben 2. März 2009 schaue dir deine fehlermeldung mal genau an. das liegt daran, du darfst den webseiteinhalt nicht vorher darstellen bevor du die funktion aufrufst.. google mal nach "headers already sent" Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
robotto7831a Geschrieben 2. März 2009 Teilen Geschrieben 2. März 2009 Hallo, Du machst halt in Zeile 74 in der counter.php irgendwelche Ausgaben. Das darf nicht sein. Das Sessiongedöns macht man am besten als aller erstes auf der Seite und danach kommt erst der normale Rest. Frank Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Syli Geschrieben 2. März 2009 Autor Teilen Geschrieben 2. März 2009 hmm also ist das logischte jetzt den "counter" aus dem "feeder" raus zu nehmen und direct als erstes starten zu lassen und am besten dort dann session_start() mit einzubauen??? Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
robotto7831a Geschrieben 2. März 2009 Teilen Geschrieben 2. März 2009 Dieses session_regenerate_id muss in der Nähe von session_start ablaufen. Frank Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Syli Geschrieben 2. März 2009 Autor Teilen Geschrieben 2. März 2009 also ich hab das bischen umstruckturiert, vorher hatte ich den counter im feeder, also als letztes sozusagen jetzt sieht das so aus: index.php: <?php require('func/db.php'); require('func/counter.php'); session_start(); counter(); . . . . [/PHP] und in der counter.php(70-76): [PHP] function counter_update($data) { $ts = time(); if($data['timestamp_kill'] < $ts){ echo session_id(); session_regenerate_id(); echo " " . session_id(); } wird nach counter(); ausgeführt, welcher prüft ob der benutzer schon in der DB drin steht oder nochnicht (anhand von session_id() und IP) siehe ersten post.... trotzdem selber fehler: 4fd9898cffd01d6f50c1d47d208df6b2 Warning: session_regenerate_id() [function.session-regenerate-id]: Cannot regenerate session id - headers already sent in D:\xampp\htdocs\ws\func\counter.php on line 74 4fd9898cffd01d6f50c1d47d208df6b2 also hab ich momentan eher das problem das ich vor der funktion counter() abfragen muss ob die session_id(); für meine webseite zu alt ist ohne session_id(); benutzen zu dürfen??? Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
robotto7831a Geschrieben 2. März 2009 Teilen Geschrieben 2. März 2009 Und was wird in Zeile 74 ausgegeben? Frank Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
kein-tee Geschrieben 2. März 2009 Teilen Geschrieben 2. März 2009 [...] echo session_id(); session_regenerate_id(); echo " " . session_id(); [...] [/PHP] [...] trotzdem selber fehler [...] schaue dir deine fehlermeldung mal genau an. das liegt daran, du darfst den webseiteinhalt nicht vorher darstellen bevor du die funktion aufrufst.. google mal nach "headers already sent" Du machst halt in Zeile 74 in der counter.php irgendwelche Ausgaben. Das darf nicht sein. Das Sessiongedöns macht man am besten als aller erstes auf der Seite und danach kommt erst der normale Rest. Wer lesen kann ist klar im Vorteil. Gruß Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Syli Geschrieben 2. März 2009 Autor Teilen Geschrieben 2. März 2009 74: session_regenerate_id(); [/PHP] mein ansatz dabei war halt die bisherige session_id() durch eine neue zu ersetzen, was laut php.net referenz genau dessen aufgabe ist das problem bei der ganzen sache ist das ich das mit der datenbank abgleiche und wenn ich das richtig verstanden habe MUSS session_regenerate_id(); direct nach session_start(); kommen, was bei mir wiederrum das problem darstellt das ich somit nicht vorher abgleichen kann ob die zeit überschritten ist in der datenbank oder noch okay ist, oder sollte ich eine globale variabel nutzen statt den maximalen timestamp (zum vergeben der neuen session_id() mit der mysql datenbank abzugleichen???? Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Syli Geschrieben 2. März 2009 Autor Teilen Geschrieben 2. März 2009 (bearbeitet) okay, danke ich habe es verstanden ich nehme das "echo" einfach raus.... aus der 73. zeile, dann klappt es, bzw ich teste es gerade... tut mir leid wegen meinem einen blinden auge PS: ich habe jetzt meine abfrage (ob die session_id() wirklich geändert wird) nun folgendermassen abgeändert.... function counter_update($data) { $ts = time(); if($data['timestamp_kill'] < $ts){ $oldsid = session_id(); session_regenerate_id(true); echo $oldsid." " . session_id(); } [/PHP] Bearbeitet 2. März 2009 von Syli Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Empfohlene Beiträge
Dein Kommentar
Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.