PHP startet die Session immer neu
Lutz
- php
0 Jens-Peter0 Lutz
0 Daniel0 Fabian St.
Hallo,
ich habe einen Counter programmiert (greift auf eine MYSQL Datenbank zu, funktioniert auch alles super) und der soll jetzt nur dann Zählen, wenn ein User auf die HP kommt, der seit min. 3 Stunden nichtmehr da war.
Habe ein Tutorial gefunden wo stand, ich sollte das ganze per Session lösen. Die Session soll dann halt 3 Stunden aktiv bleiben und solange es die Session gibt, wird der Counter nicht erhöht. Sinngemäßer Quelltext:
session_set_cookie_params(10800);
session_start();
...
include 'source/base/config/config.php';
@mysql_connect(MYSQL_HOST, MYSQL_USER, MYSQL_PASS) or die('- database down1 -');
@mysql_select_db(MYSQL_DATABASE) or die("- database down2 -");
$result=mysql_query('SELECT count FROM rakete') or die('- database down3 -');
if($row = mysql_fetch_assoc($result)) {
if ($_SESSION['counter_ip'] == !true) {
$result=mysql_query('UPDATE rakete SET count = count+1') or die('- database down4 -');
$_SESSION['counter_ip'] = true;
}
echo '<p>Sie sind der <span>'.$row['count'].'. </span>Besucher seit Mai 2000</p>';
echo session_id(); //nur zu Testzwecken
}
So, wenn ihr jetzt die Seite aufruft http://www.lutzfechner.de/rf_php und mal auf Aktualisiernen klickt werden ihr sehen, dass der Counter munter hochzählt und die Session-ID immer unterschiedlich ist, also immer eine neue gestartet wird, woran kann das liegen?
Hallo,
ich habe einen Counter programmiert (greift auf eine MYSQL Datenbank zu, funktioniert auch alles super) und der soll jetzt nur dann Zählen, wenn ein User auf die HP kommt, der seit min. 3 Stunden nichtmehr da war.
Habe ein Tutorial gefunden wo stand, ich sollte das ganze per Session lösen. Die Session soll dann halt 3 Stunden aktiv bleiben und solange es die Session gibt, wird der Counter nicht erhöht. Sinngemäßer Quelltext:session_set_cookie_params(10800);
session_start();...
include 'source/base/config/config.php';
@mysql_connect(MYSQL_HOST, MYSQL_USER, MYSQL_PASS) or die('- database down1 -');
@mysql_select_db(MYSQL_DATABASE) or die("- database down2 -");
$result=mysql_query('SELECT count FROM rakete') or die('- database down3 -');
if($row = mysql_fetch_assoc($result)) {
if ($_SESSION['counter_ip'] == !true) {
$result=mysql_query('UPDATE rakete SET count = count+1') or die('- database down4 -');
$_SESSION['counter_ip'] = true;
}
echo '<p>Sie sind der <span>'.$row['count'].'. </span>Besucher seit Mai 2000</p>';
echo session_id(); //nur zu Testzwecken
}So, wenn ihr jetzt die Seite aufruft http://www.lutzfechner.de/rf_php und mal auf Aktualisiernen klickt werden ihr sehen, dass der Counter munter hochzählt und die Session-ID immer unterschiedlich ist, also immer eine neue gestartet wird, woran kann das liegen?
also ich hab ein counter script, welches sich auch in ner mysql-datenbank ablegt, aber es wird gleichzeitug noch ein cookie erzeugt, somit wird erst wieder gezählt wenn die cookies gelöscht werden.
Wenn du an dem php.script interessiert bist, schreib einfach nochmal.
Wenn du an dem php.script interessiert bist, schreib einfach nochmal.
ja würde mich interessieren, kannstes per mail schicken?
Hi,
warum machst du es nicht über die IP anstatt über die SESSION-ID?
MfG
Hi,
warum machst du es nicht über die IP anstatt über die SESSION-ID?MfG
weiß jemand wie das dann über die ip funktioniert ?
Hallo Jens.
Das Posting wurde bereits 1 mal als hilfreich und 0 mal als nicht hilfreich bewertet.
Da hat jemand Humor.
Einen schönen Freitag noch.
Gruß, Ashura
Hi,
AFAIK mit $_SERVER['REMOTE_ADDR']
MfG
Hi!
ich habe einen Counter programmiert (greift auf eine MYSQL Datenbank zu, funktioniert auch alles super) und der soll jetzt nur dann Zählen, wenn ein User auf die HP kommt, der seit min. 3 Stunden nichtmehr da war.
Habe ein Tutorial gefunden wo stand, ich sollte das ganze per Session lösen. Die Session soll dann halt 3 Stunden aktiv bleiben und solange es die Session gibt, wird der Counter nicht erhöht. Sinngemäßer Quelltext:
Grundsätzlich ist dies eine mögliche Lösung, aber du solltest dir bewusst sein, dass es für dein Vorhaben keine wirklich «sichere» Lösung gibt, d.h. man kann es immer umgehen und damit die Ergebnisse fälschen. Verlasse dich lieber auf die Server-Logs - diese sind wesentlich aussagekräftiger.
[...]
So, wenn ihr jetzt die Seite aufruft http://www.lutzfechner.de/rf_php und mal auf Aktualisiernen klickt werden ihr sehen, dass der Counter munter hochzählt und die Session-ID immer unterschiedlich ist, also immer eine neue gestartet wird, woran kann das liegen?
Dein Code scheint soweit in Ordnung zu sein. Trotzdem solltest du am Beginn deines Skriptes die Zeile error_reporting(E_ALL);
einfügen, um wirklich _alle_ Fehler angezeigt zu bekommen.
Das Problem bei der obigen Seite liegt daran, dass offenbar kein Session-Cookie gesendet wird, welches jedoch für dein Vorhaben notwendig ist, da sonst z.B. bei einem Aufruf von http://www.lutzfechner.de/rf_php/index.php nicht erkannt wird, dass bereits eine Session existiert. Dies bestätigt auch folgender Test:
1.) Rufe http://www.lutzfechner.de/rf_php/index.php in deinem Browser auf
2.) Kopiere dir die angezeigte Session-ID
3.) Rufe http://www.lutzfechner.de/rf_php/index.php?PHPSESSID=<vorherige Session-ID> auf und du wirst sehen, dass weitere Requests nicht zu einer Inkrementierung der User-Anzahl führen.
Aus diesem Grund solltest du die Einstellungen zu «session.use_trans_sid», «session.use_cookies» und eventuell auch «session.use_only_cookies» überprüfen.
Ferner könntest du das ganze auch allein über Cookies realisieren, was IMHO sogar sinnvoller wäre. Solltest du dich hierzu entscheiden, ist setcookie() für dich ganz interessant.
Grüße,
Fabian St.
Aus diesem Grund solltest du die Einstellungen zu «session.use_trans_sid», «session.use_cookies» und eventuell auch «session.use_only_cookies» überprüfen.
hallo, jau wie müssen die denn eingestellt sein? wenns dir hilft:
http://www.lutzfechner.de/info.php
Danke im Vorraus!!!
Hi!
hallo, jau wie müssen die denn eingestellt sein? wenns dir hilft:
http://www.lutzfechner.de/info.php
Die betrefflichen Zeilen schauen so aus:
session.use_cookies On
session.use_only_cookies Off
session.use_trans_sid Off
Sie sollten also OK sein. Komischerweise werden jedoch keine Cookies verwendet. Steht vor dem session_start() eventuell noch ein «@», das mögliche Warnings unterdrückt? Wenn ja, sollte dies auf alle Fälle entfernt werden. Darüber hinaus sollte das session_start() wirklich gleich am Beginn der Seite stehen und es muss jegliche Ausgabe (Leerzeichen, HTML-Code, etc.) unterbunden werden.
Unter Umständen wäre es auch sinnvoll, wenn du uns den ganzen Quelltext zeigen würdest - entweder als *.txt oder bennene die index.php in index.phps um, sodass sie - bei entsprechender Servereinstellung - nicht geparst, sondern gehighlighted angezeigt wird.
Die info.php solltest du nun jedoch wieder entfernen, da sie sehr viel über dein System verrät.
Grüße,
Fabian St.
hallo,
Ferner könntest du das ganze auch allein über Cookies realisieren, was IMHO sogar sinnvoller wäre. Solltest du dich hierzu entscheiden, ist setcookie() für dich ganz interessant.
Irgendwie versteh ich das nicht mit den cookies... ich muss die ja ganz am Anfang im header setzen. Das ist doch viel zu früh, der header kommt garnicht aus der PHP-Datei die ich grade bearbeite, ich befinde mich zwischen <body> und </body>, alles was drüber stehen müsste gehört in eine andere Datei. Und dann wirds echt kompliziert. Oder wie stellst Du dir das ungefähr vor?
Hi!
Ferner könntest du das ganze auch allein über Cookies realisieren, was IMHO sogar sinnvoller wäre. Solltest du dich hierzu entscheiden, ist setcookie() für dich ganz interessant.
Irgendwie versteh ich das nicht mit den cookies... ich muss die ja ganz am Anfang im header setzen. Das ist doch viel zu früh, der header kommt garnicht aus der PHP-Datei die ich grade bearbeite, ich befinde mich zwischen <body> und </body>, alles was drüber stehen müsste gehört in eine andere Datei. Und dann wirds echt kompliziert. Oder wie stellst Du dir das ungefähr vor?
Irgendwie verstehe ich nun deine Frage nicht :-/ Das Vorgehen bei jener Problemstellung lässt sich jedoch kurz beschreiben:
Gleich am Anfang deiner index.php wird mittels isset($_COOKIE['count']) überprüft, ob ein Cookie names count existiert _und_ ob der darin gespeicherte Timestamp weniger als drei Stunden zurückliegt. Ist dies der Fall, dann wird der Counter nicht erhöht. Ansonsten wird mittels setcookie() ein Cookie gesetzt, das «count» heißt und als Wert den aktuellen Timestamp bekommt, der Counter wird außerdem um eins erhöht.
Bei Fragen kannst du dich ja nochmal melden...
Grüße,
Fabian St.
Hallo,
noch eine Frage:
wenn ich eine Session eröffne mit
<?php
session_set_cookie_params(10800);
session_start();
?>
und ein User kommt sagen wir um 12 Uhr auf meine Homepage, dann ist
die für ihn erzeugt Session ja bis um 15 Uhr gültig. Was passiert aber,
wenn der User sagen wir um 14 Uhr nochmals auf die Seite kommt?
Wird die Session dann "verlängert" bis 17 Uhr oder läuft sie trotzdem um 15 Uhr ab?
Danke!
Lutz