• Das Erstellen neuer Accounts wurde ausgesetzt. Bei berechtigtem Interesse bitte Kontaktaufnahme über die üblichen Wege. Beste Grüße der Admin

[FRAGE] Besucherzähler für Unterseiten mit IP Sperre logik Problem.

xorg1990

New member
Hi, ich steh für eine denkbar einfachen Aufgabe die aber nicht funktioniert:mad:

Folgendes: jeder User kann sich auf meiner Website Registrieren und mehrere Unterseiten anlegen. Eben für diese Unterseiten brauch ich einen Zähler mit Heute,Gestern,Total,Rekord.
Der Zähler ist Datenbank basirend und soll eine Ip Sperre beinhalten.
Die IP Sperre über eine Session zu lösen funktioniert nicht, denn die session wird schon von der Hauptseite gesetzt klickt man dann auf die Unterseiten wird nix mehr gezählt. Wer dafür eine Lösung hat bitte melden. ExpressJs session wird genutzt.


Meine Lösung war und daran halte ich auf fest, eine zusätzlich spalte anlegen mit der Remote IP und der Aktuellen Zeit. Das alles als JSON.


Das Objekt sieht dann so aus {
"123.xxx.xxx" : 23156231566,
"456.655.xxx": 12345678912,
//usw
}

Jetzt muss eine Schleife her die sucht ob die ip schon vorhanden ist und ob die Zeit abgelaufen ist ,
dann erhöhe um eins. Damit das Objekt nicht größer wird muss auch mal eine ip gelöscht werden.
Die Funktion schaut so aus:
Code:
function count(call, GrabberName, ip, cb) {
    handleDisconnect(function(connection) {
        connection.query("SELECT GrabberID FROM Grabbers WHERE GrabberName = ? ", [GrabberName], function(err, rows) {
            if (err) {
                throw err.message;
            } else {
                connection.query("SELECT * FROM Counts WHERE GrabberID =" + rows[0].GrabberID, function(err, rows) {
                    if (err) {
                        throw err.message;
                    } else {
                        var sperre = 90000 //ip sperre in ms ändern auf 24h
                        var gefunden = false;
                        var insertObj = {};
                        var ips = JSON.parse(rows[0].ips);
                        var Heute = parseInt(rows[0].Heute);
                        var Gestern = parseInt(rows[0].Gestern);
                        var Rekord = parseInt(rows[0].Rekord);
                        var Total = parseInt(rows[0].Total);
                        if (Total === 0) {//erste zählung
                            ips[ip] = Date.now();
                            Heute += 1;
                            Total += 1;
                            insertObj.Heute = Heute;
                            insertObj.Total = Total;
                            insertObj.Gestern = Gestern;
                            insertObj.ips = JSON.stringify(ips);
                            //zählung eintragen
                            connection.query("UPDATE Counts SET ?", insertObj, function(err, reult) {
                                connection.end();
                                if (err) {
                                    throw err;
                                }
                            });
                            return cb();
                        } else {
                            for (var v in ips) {
                                if (v === ip) {
                                    gefunden = true;
                                    if (Date.now() > ips[v] + sperre) {
                                        gefunden = false;
                                        delete ips[v];
                                    }
                                }
                            } //for

                            if (gefunden === false) {
                                ips[ip] = Date.now();
                                Heute += 1;
                                Total += 1;
                                insertObj.Heute = Heute;
                                insertObj.Total = Total;
                                insertObj.Gestern = Gestern;
                                insertObj.ips = JSON.stringify(ips);
                                connection.query("UPDATE Counts SET ?", insertObj, function(err, reult) {
                                    connection.end();
                                    if (err) {
                                        throw err;
                                    } else {
                                        return cb();
                                    }
                                });
                            }
                        }
                    }
                    return cb();

                });
            }

        });
    }); //handleDissconnect

}
Ich habe mir eine Hilfsvariable "gefunden" erstellt damit funktionier die Sperre.
Das Problem ist das löschen alter IP's entweder wird gar nix gelöst oder die falsche ip. Eigentlich wird noch ein query benötig, weiß aber nicht wie weil da bekomme ich Problem mit connection.end().

Von Wartbar kann auch keine rede sein, dass muss auch einfacher gehen kann mir da wer helfen.

VG xorg1990
 
Zuletzt bearbeitet:
Das ist falsch:
Code:
                            for (var v in ips) {
                                if (v === ip) {
                                    gefunden = true;
                                    if (Date.now() > ips[v] + sperre) {
                                        gefunden = false;
                                        delete ips[v];
                                    }
                                }
                            } //for
Das muss so aussehen:
Code:
                            var now = Date.now();
                            for (var v in ips) {
                                if (now > ips[v] + sperre) {
                                    delete ips[v];
                                }
                            } //for
                            gefunden = !!ips[ip];
ABER ein for...in ist eigentlich nie eine gute Idee... und wenn brauchst du die Prüfung auf .hasOwnProperty().
 
Zuletzt bearbeitet:
Wiso ist die For schleife kein gute Idee?
Gedacht hatte ich eigentlich an ein mysql query nach der schleife ohne if(gefunden === false). In der Schleife wollte ich gucken ob ein user schon vorhanden ist wenn nicht coutner+=1, ist der userüber die Zeit(sperre) counter+=1 , ist der User bsw die IP viel zu lange drüber löschen(sperre + x Sekunden) da ja sonnst das Objekt immer größer wird..
So war der plan aber ich bekomme es es nicht zsm..

Irgendwie habe ich völlig ein Brett vom Kopf bei dieser sache oder ich denk zu kompliziert.
 
For...in iteriert gerne mal über Attribute, über die du nicht gehen willst, da es auch über den Prototypen geht. Ich würde da mit Object.keys() arbeiten:
Code:
Object.prototype.test = function(){};

var o = {a: 1};
console.log("for...in");
for (var name in o){
	console.log(name);
}
console.log("Object.keys");
Object.keys(o).forEach(console.log, console);
 
An Object.keys habe ich gar nicht mehr gedacht. Ich stanz das bei Gelegenheit mal ein, momentan reicht die for in loop.
 
Zurück
Oben