Doppelte Einträge in DB vermeiden (IP-Adressen)

  • Hallo,
    ich habe mal wieder ein kleines Verständnisproblem.
    Und zwar benötige ich für mein Projekt eine Liste mit den IP-Adressen von möglichst vielen Such-Bots.
    Da ich sowas nicht gefunden habe, dachte ich mir, bastel ich mir ein kleines "Fangprogramm" zusammen, welches mir die IP-Adressen in eine Datenbank schreibt.
    Das klappt soweit auch.
    Jetzt wollte ich aber doppelte Einträge vermeiden.
    Dafür nutze ich das folgende Skript:


    Ja ich weiß aus dem anderen Topic, dass man Variablen nicht direkt in die SQL-Befehle schreiben soll. Das ändere ich noch, sobald ich mich mehr mit pdo beschäftigt habe.
    Theoretisch sollte die IP-Adresse nur einmal eingetragen werden. Wenn sie schon in der Datenbank steht, sollte die IP-Adresse nicht eingetragen werden. Stattdessen, sollte die Meldung kommen, dass die IP-Adresse schon existiert.
    Wenn ich diese Seite aufrufe, erscheint die Meldung zwar, aber trotzdem wird die Datenbank nocheinmal mit der selben Adresse befüllt.
    Aber warum? Wenn die If-Anweisung zutrifft, sollte die Else-Anweisung, welche die Daten in die Datenbank schreibt doch übersprungen werden?


    Außerdem steht meine IP-Adresse im folgenden Format in der DB: 2a02:8109:91c0:19dc:105b:404d:cda4:55c9 liegt es daran, dass es eine IPV6 IP-Adresse ist? Oder kann ich den Hexadezimalen wert einfach in einen normalen Wert umrechen?

  • Ja ich weiß aus dem anderen Topic, dass man Variablen nicht direkt in die SQL-Befehle schreiben soll.


    Ich wollt schon los meckern :D


    Das könnte sein, da Du WHERE ip_adresse = '$ip'" abfragst.
    Wenn nun zB das Feld `ip` in der DB ein (nur Bsp) VARCHAR(10) ist, aber eine ipv6 reinkommt,
    und kein sql_mode = STRICT_ALL_TABLES aktiviert ist,
    dann werden nur die ersten 10 Zeichen in das Feld geschrieben.
    (wenn STRICT_ALL_TABLES on/an ist, dann gibts Fehler geschmissen - was richtig und gut ist/wäre)


    kurz: es kann sein, dass Du nach 12345 suchst, aber nur 1234 im Feld steht, da nicht mehr Platz reserviert wurde.



    Tipp: ips speichern (v4 und v6)
    NTOA und ATON


    Wenn Du immer ausgeben möchstest, ob die ip schon vorhanden war, dann musst Du wohl immer eine Abfrage der ip durchführen.
    Wenn Du das nicht brauchst, dann empfehle ich ON DUPLICATE KEY UPDATE:

    SQL
    INSERT INTO `tblname` 
    SET 
        `ip` = INET6_ATON(:ip)
    ON DUPLICATE KEY UPDATE `id` = `id`;


    Was passiert hier:
    (Ich gehe von fortlaufender id `id` aus)
    todo: Setze das Feld `ip` auf UNIQUE ( UNIQUE INDEX `uidx_ip` (`ip` ASC) )
    Der mysql Server bekommt die Aufgabe eine Zeile einzufügen mit der ip x.
    Sollte die ip nun schon vorkommen, würde der Server einen Fehler schmeissen.
    Aber - wir haben ihm gesagt: ON DUPLICATE KEY (wenn key (feld) ein Duplikat verursachen würde) UPDATE `id` = `id`


    Note. Es könnte auch heissen: ON DUPLICATE KEY UPDATE `updated_at` = NOW(), `user` = :user, ...
    (~ wenn Duplikat dann mach das)


    Bei der id = id Variante wird der Server nichts machen (keine unnötige Artbeit). (Warum genau -> google, bekomms grad nicht zusammen)



    So, das war wiedermal viel von mir ... :D sollte aber alle klar sein. =)

  • Ich habe mir den Code jetzt ein paar Tage später nochmal genauer angeschaut und festgestellt, dass ich den Befehl die Daten in die Datenbank zu schreiben, doppelt drin hatte. Das habe ich jetzt geändert.
    Damit geht es.
    Manchmal sieht man den Wald vor lauter Bäumen nicht. :S


    Jetzt muss ich nur noch Hoffen, dass möglichst schnell viele Suchmaschinen vorbei kommen

Jetzt mitmachen!

Sie haben noch kein Benutzerkonto auf unserer Seite? Registrieren Sie sich kostenlos und nehmen Sie an unserer Community teil!