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:
<?php
if(!empty($_SERVER['HTTP_X_FORWARDED_FOR'])) {
$ip = $_SERVER['HTTP_X_FORWARDED_FOR'];
} else {
$ip = $_SERVER['REMOTE_ADDR'];
}
$host = gethostbyaddr($ip);
echo "IP Adresse: $ip<br>";
echo "Hostname: $host";
$sql = "
INSERT INTO `adressen`
( `id` , `ip_adresse` , `host` )
VALUES
( NULL , '$ip', '$host' );
";
$db_erg = mysqli_query($db_link, $sql)
or die("Anfrage fehlgeschlagen: " . mysqli_error());
$control = 0;
$abfrage = "SELECT ip_adresse FROM adressen WHERE ip_adresse = '$ip'"; //prüfen ob ip berereits vorhanden
$ergebnis = mysqli_query($db_link, $abfrage);
while($row = mysqli_fetch_object($ergebnis)) {
$control++;
}
if($control !=0) { //wenn ip bereits eingetragen
echo "<br /> IP bereits vorhanden";
} else {
$eintrag = "INSERT INTO adressen
(ip_adresse, host)
VALUES
('$ip', '$host')";
$eintragen = mysqli_query ($db_link, $eintrag);
if ($eintragen == true) {
echo "IP-Adresse wurde eingetragen";
} else {
echo "Fehler im System";
}
}
?>
Alles anzeigen
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?