Counter - ip Sperre

Hallo Community!

Bin gerade dabei mir einen Counter mit IP-Sperre auf MYSQL Basis zu bauen.
Ich habe eine Datenbank mit 4 Spalten (id, Besucheranzahl, ip, Zeit).

Ich bin schon soweit, dass beim Aufruf der Seite ein Eintrag in die Datenbank erstellt wird, in der die id-Spalte mit auto_increment eins hochgezählt wird. Bei der Besucheranzahl wird verglichen ob die ip schon einmal vorgekommen ist. Falls nicht wird es um eins erhöht und dann in die Datenbank geschrieben, wenn schon werden die Besucher übernommen. ip und time werden einfach immer die aktuellen hineingeschrieben.

Hier der aktuelle code:

[code]<?php
mysql_connect(„localhost“,„aschachinger“,"***") or die(„Keine Verbindung moeglich“);
mysql_select_db(„aschachinger“) or die („Die Datenbank existiert nicht“);

$time=time();

$query_visitors="SELECT visitors FROM counter ORDER BY id DESC LIMIT 1";
$result_visitors=mysql_query($query_visitors);
extract(mysql_fetch_array($result_visitors));

$query_ip="SELECT ip FROM counter WHERE ip='".$_SERVER['REMOTE_ADDR']."'";
$result_ip=mysql_query($query_ip);
extract(mysql_fetch_array($result_ip));

if($ip==""){
	$visitors++;
}

$ip=$_SERVER['REMOTE_ADDR'];
$time=time();

$entry="INSERT INTO counter(visitors,ip,time) VALUES ('$visitors','$ip','$time')";
$enter=mysql_query($entry);

$query_id="SELECT id FROM counter ORDER BY id DESC LIMIT 1";
$result_id=mysql_query($query_id);
extract(mysql_fetch_array($result_id));

?>[/code]

Das ganze liegt hier.

Falls man diesen Code noch optimieren kann (was ich ziemlich stark glaube :ps: ) könnt ihr das auch gerne posten.

Nun zu meiner eigentlichen Frage:

Ich möchte alle Einträge aus der Datenbank auslesen, in denen die Zeit um maximal 60 kleiner ist als die jetzige Zeit. Die Einträge in denen das der Fall ist möchte ich anschließend zählen.
Nur weiß ich nicht wirklich, wie ich das realisieren sollte.

Moin,

Na ja, die Abfrage geht definitiv mit dem WHERE-Attribut, womit du die Abfrage eingrenzen kannst. Zählen kannst du entweder mit SELECT COUNT oder hinterher mit mysql_num_rows(). Hab mal kurz was zusammengeschustert, ist ungetestet und vermutlich noch ein wenig buggy, aber das Prinzip sollte deutlich werden …

$sql = mysql_query("SELECT *, COUNT(id) AS anzahl FROM tabelle WHERE zeit < (time()-60)");
while($row = mysql_fetch_object($sql)) {
 echo $row->anzahl; // Wieviele Einträge
 echo $row->ip; // was du halt sonst noch brauchst
}
$anzahl = mysql_num_rows($sql); // falls du COUNT() nicht nutzen möchtest.
echo $anzahl;

MfG
myPages

Hab das mal eingefügt und ein bisschen angepasst.

[code]<?php
mysql_connect(“localhost”,“aschachinger”,“schachinger”) or die(“Keine Verbindung moeglich”);
mysql_select_db(“aschachinger”) or die (“Die Datenbank existiert nicht”);

$time=time();

$query_visitors="SELECT visitors FROM counter ORDER BY id DESC LIMIT 1";
$result_visitors=mysql_query($query_visitors);
extract(mysql_fetch_array($result_visitors));

$query_ip="SELECT ip FROM counter WHERE ip='".$_SERVER['REMOTE_ADDR']."'";
$result_ip=mysql_query($query_ip);
extract(mysql_fetch_array($result_ip));

if($ip==""){
	$visitors++;
}

$ip=$_SERVER['REMOTE_ADDR'];
$time=time();

$entry="INSERT INTO counter(visitors,ip,time) VALUES ('$visitors','$ip','$time')";
$enter=mysql_query($entry);

$query_id="SELECT id FROM counter ORDER BY id DESC LIMIT 1";
$result_id=mysql_query($query_id);
extract(mysql_fetch_array($result_id));

$query_online=mysql_query("SELECT *, COUNT(id) AS online FROM counter WHERE time < (time()-60)");
while($row=mysql_fetch_object($query_online)){     // line 30
echo $row->online; // Wieviele Einträge
echo $row->ip; // was du halt sonst noch brauchst
};

?>[/code]

http://aschachinger.bplaced.net/test/datenbank/counter.php

Kommt aber ein fehler für Line 30 (habs als Kommentar makiert).

Weiß aber nicht wirklich was ich da falsch gemacht habe…
Also wenn wir nochmal wehr helfen kann… :unamused:

Moin,

also in Zeile 13 ist das erste Argument von dir kein Array :slight_smile:

Und das andere sagt nur aus, dass der Query-String so nicht stimmt und MySQL mit dem nicht sonderlich viel anfangen kann. Interessanterweise scheint mir aber die Syntax zu stimmen.

Entweder mal mysql_fetch_assoc() oder mysql_fetch_array() versuchen (aber Vorsicht, du müsstest auch die Schreibweise in der Ausgabe (while()-Schleife) ändern) oder vielleicht mal * durch die Werte ersetzen die du brauchst, z.B. ip, time …

Ansonsten könnte man noch ausprobieren die Klammern von (time()-60) wegzulassen - aber es würde mich wundern, wenn das nicht ginge.

Als schnellste Variante - stell nen @ vor mysql_fetch_object(). Dann werden keine Warnungen mehr ausgegeben :p - aber mit Sicherheit nicht die beste Methode.

MfG
myPages

Dass das in Zeile 13 nicht optimal gelöst ist weiß ich schon, nur weiß ich nicht wie ich das von dem sql Eintrag in eine php Variable umschreiben kann. Hab das noch nicht so ganz durchschaut…

Heißt das, dass dich online Abfrage schon fonktioniert? Die Variable $online ist auf jeden Fall noch leer. Oder wo wird das jetzt hingespeichert?
sry, aber ich blicke gerade nicht mehr so ganz durch :ps:

mfg andi

Moin,

nein in Zeile 13 sorgt glaube ich das Limit 1 für ein Problem, da das Ergebnis nicht als Array aufgefasst wird und nur als Variable - mysql_fetch_array() hat damit Probleme, weil es mehrere Argumente/Werte erwartet. Du könntest z.B. so etwas versuchen, um ein Array zu erzwingen (auch wenn es halt nur einen Eintrag hat) - oder du verwendest mysql_fetch_object() bzw. mysql_fetch_assoc():

 $query_visitors="SELECT visitors FROM counter ORDER BY id DESC LIMIT 1";
   $result_visitors= (array) mysql_query($query_visitors); // Variante 1
   $result_visitors[] = mysql_query($query_visitors); // Variante 2
   extract(mysql_fetch_array($result_visitors));

Zu dem anderen: Ehrlich gesagt, kann ich dir nicht sagen, warum es nicht funktioniert. Die Syntax sollte eigentlich soweit stimmen, aber wenn $row->online leer ist, bedeutet das, dass es nicht so klapp wie ich mir das vorgestellt habe :wink:

Hast du diese Variante ausprobiert?

$sql = mysql_query("SELECT * FROM tabelle WHERE zeit < (time()-60)");
while($row = mysql_fetch_object($sql)) {
echo $row->ip; // was du halt sonst noch brauchst
}
$anzahl = mysql_num_rows($sql);
echo $anzahl;

So geschrieben, sollte es definitiv keine Probleme verursachen.

MfG
myPages

Danke für deine Mühe, aber ich merke gerade, dass mir das doch etwas zu kompliziert wird. :smiley:
Das einzige, was ich von MYSQL kann ist das von http://www.schattenbaum.net/php/ und das ist leider ein bisschen zu wenig…

Kennst du irgend eine Seite wo MYSQL etwas ausführlicher erklärt wird? Weil ich kenne so viele Ausdrücke nicht, ich müsste das nochmal genauer durchmachen…

mfg

Moin,

schau mal hier:
tut.php-quake.net/
webmaster-resource.de/tutori … torial.php
webmaster-eye.de/php-tutorial/

Könnte noch mehr aufführen :wink: Aber eigentlich ist das erste aus meiner Sicht immer noch eines der besten und bringt alles verständlich rüber.

MfG
myPages

Danke…werd ich mir bei Gelegenheit mal reinziehen…