mysql-counter

Jon02

Mitglied
guten Abend

ich habe für meine Seite einen kleinen Mysql-gestützen Counter gecodet aber er will nicht

hier mal der Code

PHP:
<?php
  //datenbank counter
  mysql_connect("xxxx", "xxxxx", "xxxx") OR die(mysql_error());
  mysql_select_db("usr_web401_2") OR die(mysql_error());
  $abf_read="SELECT * FROM jscounter;";
  $abf_write="INSERT INTO jscouter (datum, ip) 
             VALUES(\"" .time(). "\",\"". $REMOTE_ADDR . "\");";
  $abfrage_read = mysql_query($abf_read)or die(mysql_error());
  $ok= 1;
  while($abfrage2_read = mysql_fetch_assoc($abfrage_read))
  {
    $differenz = time() - $abfrage2_read["datum"];
    if($REMOTE_ADDR == $abfrage2_read["ip"] AND $differenz <= 2000 )
	{
	  $ok = 0;
	}
  }
  if(ok == 1)
  {
    mysql_query($abf_write) or die(mysql_error());
	echo "gezahlt";
  }
  else
  {
  echo "warst erst gerade da";
  }
  echo "<br>datum ". $abfrage2_read["datum"]. "<br>ip ".$abfrage2_read["ip"];
?>

und die Ausgabe
Code:
warst erst gerade da
datum
ip

ich habe schon einen Testdatensatz bei dem die $differenz sicher grösser 2000 ist

danke jetzt schon für eure Hilfe

Gruss Jon02
 
PHP:
$abf_write="INSERT INTO jscouter (datum, ip)
             VALUES(\"" .time(). "\",\"". $REMOTE_ADDR . "\");";
jscouter? soll wohl jscounter heißen ;-)

Und wenn du Backsticks (`) zur Abgrenzung von Strings benützt,
oder Hochkommas (') anstatt den einleitenden Anführungszeichen ("), dann sparst du dir die Escaperei (\") der String-Delimiter.

PHP:
$abf_write = 'INSERT INTO jscounter SET 
                  datum = `'.time().'`,
                  ip = `'.$_SERVER['REMOTE_ADDR'].'`
                  ';
 
Zuletzt bearbeitet:
frage: gibt es einen Unterschied zwischen $REMOTE_ADDR und $_SERVER['REMOTE_ADDR'].
Es muss sonst noch irgendwo einen Fehler geben.
Das Script kommt gar nie zum Querry um es in die DB zu schreiben.

aber ich sehe den sehrwarscheinlich Logikfehler auch nicht
 
bin mir mal wieder nicht sicher aber warum prüfts du nicht einfach in der DB ob überhaupt ein Eintrag vorhanden ist.

Ich denke mal die Abrage könnte so aussehen

Code:
$abf_read="SELECT * FROM jscounter WHERE (ip = ".$_SERVER['REMOTE_ADDR']." ) AND (datum <= time()-2000);";

Nun nur noch testen ob ein Datensatz gefunden wurde und dann halt die entsprechende ausgabe generieren.

Somit müssen nicht die ganzen IFs und WHILEs durchlaufen werden und die Berechnung der Zeit muß auch nir einmal durchlaufen werden.


MfG
 
der Sinn dahinter ist, dass jemand mehr als nur einmal gezählt werden kann.
Jedoch mit einem zeitlichen abstand von min 2000 Sekunden

gruss Jon02
 
Dann sollte meine Abfrage doch "perfekt" sein.

Wenn man noch datum >= setzt könnte man doch die ganze Abfragerrei der Datenbank überlassen.

Wenn ein Datensatz getroffen dann wird nicht neu eingetragen und wenn Kein Datensatz gefunden dann wird ein EIntrag neu gespeichert.

So hast du nur eine IF abfrage und sparst die ganze WHILE-Schleife.

MfG
 
Zurück