Frage zu Sessions bezüglich eingenen Counterscripts

son gohan

Erfahrenes Mitglied
Hi, ich hab mir ein Counter für meine Seiten gebaut.

Zuerst wird mit einer Mysql Abfrage geschaut ob die aktuelle Seite schon in der Tabelle steht und ob die Session id gleich der aktuellen Session ist. Stimmt die Session in der Datenbanktabelle nicht mit der aktuellen der Seite ein, kann man davon ausgehen, dass es sich um einen neuen Besucher handelt und der Seite ein neuen Zähler berrechnen, ist die Session id gleich, handelt es sich um den gleichen Besucher und es wird nichts gemacht.

Ich denke leicht nachvollziehbar das ganze.

Problem ist jetzt, wenn der gleiche Besucher die Seite am nächsten Tag wieder besucht, und in der Zwischenzeit niemand anders da war, dann stimmt die Session id wieder überein und es wird nicht weiter gezählt, ich will aber gerne das ein neuer Besuch gezählt wird, man kann zwar davon ausgehen das in der Zwischenzeit sicher ein neuer Besucher die Seite gesehen hat und einen neue Session in der Tabelle steht, aber man weis ja nicht.

Zweites Problem ist jetzt aber noch, dass wenn ein neuer Besucher kommt, wird die Session id gespeichert unter dem Dateinamen und der Counter um eins erhöt, besucht 1 Sekunde später jemand anderes noch die Seite, steht wieder eine neue Session id in der Tabelle, wenn jetzt der erste Besucher mal die Seite einfach neu lädt, dann wird wieder unnötig der Wert um eins erhöt und eine neue Session in die Tabelle geschrieben.

Ihr solltet noch wissen, dass jede Datei nur ein Datensatz bei mir hat, es wird halt jeweils nur der Wert Count und die Session gewechselt.

Wenn jemand Tipps hat wie man eines oder beide Probleme lösen kann dann freu ich mich.
 
Bei deinem Script gibt es einen "lustigen" Fehler: Besucher A geht auf Seite A, danach geht Besucher B auf Seite A, dann wieder Besucher A auf Seite A - ergo: Besucher A wird 2 mal gezählt! Vielleicht solltest du das ganze bissl überarbeiten ;)
 
Hmm das Counterproblem wurde hier auch schon mehrmals besprochen, dafür gibt es keine optimale Lösung. Ich habe so einen Minicounter der bei einem Besucher den Counter hochzählt und eine SESSION setzt, solange die session gesetzt ist wird nicht hochgezählt, macht er allerdings seinen Browser zu, startet es von vorne.
Wenn man IP´s speichert ist es auch nicht 100% optimal und man verbraucht noch Datenbankspeicher.

mfg
 
Hmm das Counterproblem wurde hier auch schon mehrmals besprochen, dafür gibt es keine optimale Lösung. Ich habe so einen Minicounter der bei einem Besucher den Counter hochzählt und eine SESSION setzt, solange die session gesetzt ist wird nicht hochgezählt, macht er allerdings seinen Browser zu, startet es von vorne.
Wenn man IP´s speichert ist es auch nicht 100% optimal und man verbraucht noch Datenbankspeicher.

mfg


Ich hab ja auch mein Counter mit Sessions aufgebaut, aber ich habe bemerkt, dass wenn der Besucher weg ist und den Brwoser zu macht und später wieder öffnet und meine Seite besucht, dann ist die alte Session id immer noch am start und verhindert das der neue Besuch gezählt wird. Wie hast du es den gelöst das nach verlassen des Browsers eine neue Session startet beim nächsten Besuch?

Ich habe ja ein wenig mit session_destroy() gespielt, aber irgendwie unbrauchbar gewesen.

@Radhad, das Problem könnte man glaub ich nur lösen, wenn man mehrere datensätze für eine datei zuläst, zur Zeit lasse ich ja nur die Countwerte hochzählen und benutze dazu immer den gleichen Datensatz wo sich die Session mal ändert bei anderen Besuchern die die Seite aufrufen, da muss man sich halt entscheiden was einem wichtiger ist, sparsame Datenbanktabelle oder genauerer Counter.
 
Ganz simpel ohne sessionids und meines Wissens wird die Session zerstört wenn der Browser geschlossen wird also komplett geschlossen. Ebenfalls nur einen Datensatz.

PHP:
// neuer user ?
  if ($_SESSION['count'] != 1)
  {
    $sql = "UPDATE `ds_counter` SET `heute` = `heute` + 1,`gesamt` = `gesamt` + 1
            WHERE `id` = '1' LIMIT 1;";
    if (mysql_query($sql))
    {
      $_SESSION['count'] = 1;
    }
    else Fehler();
  }
 
Ich würde für den Counter auch einfach eine Session setzen.
zb: $_SESSION['dontCount']=true

Und zwar einfach, nach dieser Abfrage:

PHP:
if (!isset($_SESSION['dontCount']) || $_SESSION['dontCount']<>true) {
    .... update counter ....
}
$_SESSION['dontCount']=true

Das ist wohl die einfachste Variante. Damit wird beim ersten Aufruf der Counter hochgezählt. Bei jedem weiteren Aufruf einer beliebigen Seite wird der Counter nicht mehr erhöht, da die Session ja schon existiert.

Ciao,
Mike
 
Hm, irgendwie versteh ich die Logik eurer Scripte nicht, meins sieht so aus:

PHP:
$dit = mysql_query("SELECT `dateiname` FROM `counter` WHERE `dateiname`='".$_SERVER['PHP_SELF']."'"); 
echo mysql_error(); 
$dit_ = mysql_num_rows($dit); //echo $dit_; 
//Die Abfrage prüft ob es die Datei schon in der Datenbanktabelle gibt

if($dit_ > 0) { //Wenn die Datei schon in der Datenbanktabelle steht, dann
//wird die die Session id in der Datenbanktabelle abgefragt.
$sit = mysql_query("SELECT `sid` FROM `counter` WHERE `dateiname`='".$_SERVER['PHP_SELF']."'"); 

$roww = mysql_fetch_array($sit);
$ss = $_SESSION["sid"].$_SERVER['PHP_SELF']; //aktuelle Session id wird in Variable
//zusammen mit Dateiname gespeichert.

if($roww['sid'] != $ss) {//wenn die Session id aus der Tabelle nicht gleich der aktuellen ist,
//wird der Wert count um eins hochgezählt

mysql_query("UPDATE `counter` SET `count`=count+1, 
`sid`='".$_SESSION["sid"]."".$_SERVER['PHP_SELF']."' 
WHERE `dateiname`='".$_SERVER['PHP_SELF']."'"); 
echo mysql_error();
		       }
              }
else { // Wenn der Dateiname nicht in der Tabelle steht, dann wird ein neuer 
//Datensatz erstellt mit Dateiname 
$sql = "INSERT INTO `counter`
         (count,
         dateiname,
         titel,
         sid,
         datum)
	VALUES (
         '1',
         '".$_SERVER['PHP_SELF']."',
         '$titel',
         '".$_SESSION["sid"]."".$_SERVER['PHP_SELF']."',
          NOW())";
mysql_query($sql);
}

Ich habe jetzt halt noch das Problem, wenn Besucher A den Brwoser schließt und am nächsten Tag wieder kommt auf die Seite, dann hat er immer noch die gleiche Session id und bei der Abfrage wird deshalb nicht mehr der Counter um eins erhöt, es sei den jemand anders hat mal zwischendurch die Seite besucht und eine neue Session id abgelegt, aber davon will ich nicht ausgehen.
 
Wozu liest du die Session aus einer Tabelle aus? Um zu prüfen, ob der aktuelle Besucher neu gezählt werden soll, reicht eine einzige boolsche Session Variable aus. Gibt es die noch nicht -> Counter erhöhen, gibt es die schon -> nicht erhöhen.

Damit sparst Du Deiner DB auch einiges an Quälerei bei jedem Seitenaufruf.
 
Da ich ja nur einen Datensatz pro Datei verwende, muss ich ja prüfen ob die Session id in der Tabelle die gleiche ist wie die des aktuellen Besuchers, wie soll ich den sonst unterscheiden können :confused:
 
Achso, ist das ein Counter / Besucher? Sorry, dann hab ich mich verlesen...
Dann kannst Du aber mit der [phpf]session_id[/phpf] arbeiten - damit ist jeder client (oder zumindest browser) eindeutig (auf einen bestimmten zeitraum).
 
Zurück