Benutzer-ip Speichern
lima-city → Forum → Programmiersprachen → PHP, MySQL & .htaccess
adresse
array
ausgabe
browser
code
date
datei
datum
file
gespeicherten daten
hand
minute
monat
ordner
personenbezogene daten
schutz
speichern
string
url
zeile
-
Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!
lima-city: Gratis werbefreier Webspace für deine eigene Homepage
-
sollte eig. funktionieren. Probiers doch einfach mal aus :D
Wieso sollte das verboten sein? Im Gegenteil ist machmal sogar ganz praktisch. -
es funtzt!
es waren sogar schon welche mit ipv6 da! -
du kannst die Funktion natürlich auch noch "ausbauen" und zb. Datum und Uhrzeit mit speichern.
Das fände ich z.B. auch mal ganz spannend :D -
hier ein BSP Code um
+ mehr als "nur" die IP-Adresse speichern
... (Zeit, Browser, Referer, etc) ... in CSV Datei
+ für jeden Monat eine neue Datei (in einem Unter-Ordner)
... denn wenn alles in eine Datei, dann wird die schnell sehr groß
---> allgemein ... sowas sollte man ehh besser in MySQL DB speichern
aber hier mal als BSP mit Speichern in Datei (csv)
FILE: save_user_ip.php
<?php // ----------------------------------------------- $save_path = 'udata'; if (!file_exists($save_path)) { mkdir($save_path,0777); } // --- der CHMOD Wert 0777 kann auch anders, z.B.: 0666 // --- oder den Ordner per Hand vorher in FTP anlegen $save_date = date('Y').'_'.date('m'); $save_file = $save_path.'/ips_'.$save_date.'.csv'; // ----------------------------------------------- $usr_ipadr = $_SERVER['REMOTE_ADDR']; $usr_rtime = $_SERVER['REQUEST_TIME']; $usr_agent = $_SERVER['HTTP_USER_AGENT']; $usr_refer = (isset($_SERVER['HTTP_REFERER'])) ? $_SERVER['HTTP_REFERER'] : 'no-referer'; ### $srv_host = $_SERVER['HTTP_HOST']; $usr_rquri = $_SERVER['REQUEST_URI']; $delimiter = '|'; $head_strg = ''; $head_strg .= 'ipadr'.$delimiter; $head_strg .= 'rtime'.$delimiter; $head_strg .= 'agent'.$delimiter; $head_strg .= 'refer'.$delimiter; ### $head_strg .= 'shost'.$delimiter; $head_strg .= 'rquri'."\n"; $save_strg = (!file_exists($save_file)) ? $head_strg : ''; $save_strg .= $usr_ipadr.$delimiter; $save_strg .= $usr_rtime.$delimiter; $save_strg .= $usr_agent.$delimiter; $save_strg .= $usr_refer.$delimiter; ### $save_strg .= $srv_host.$delimiter; $save_strg .= $usr_rquri."\n"; $fp = fopen($save_file, 'a'); fwrite($fp, $save_strg); fclose($fp); // ----------------------------------------------- // --------- Ausgabe der gespeicherten Daten ----- print '<p>File Name: <u>'.$save_file.'</u></p>' . "\n"; print '<p>CSV String:</p>' . "\n"; print '<pre style="margin:18px 4px; padding:6px; text-align:left; background:#FFFFAA; color:#0000AA;">'."\n"; print_r($save_strg)."\n"; print '</pre>'."\n"; $parsed_csv = str_getcsv($save_strg,$delimiter); print '<p>Array Data:</p>' . "\n"; print '<pre style="margin:18px 4px; padding:6px; text-align:left; background:#DEDEDE; color:#0000AA;">'."\n"; print_r($parsed_csv)."\n"; print '</pre>'."\n"; // ----------------------------------------------- ?>
den Teil "--- Ausgabe der gespeicherten Daten ---" kann man auch weg lassen,
ist nur zur DEMO, damit man gleich sieht, was gespeichert wird.
anstatt $_SERVER['REQUEST_TIME'] könnte man auch time() nehmen
als Unix Timestamp ... oder ein anders formatiertes Datums-Format ...
Hinweis: den Ordner, den man in $save_path angibt
kann man auch selbst per Hand (in FTP) erstellen
oder auch den CHMOD Wert 0777 anders, z.B.: 0666
muss halt für das Script Schreib- und Lese- Rechte bekommen
+++
Zum Auslesen der einzelnen CSV Dateien (je Monat)
kann man dann einfach fgetcsv() nutzen ...
Hier mal ein BSP php CODE mit Liste der Dateien (als Link)
... und nach an-klicken kommt der CSV Inhalt als Array
FILE: read_user_ip.php
... Achtung ... noch ohne Zugangs-Schutz (Passwort)
<?php // ----------------------------------------------- $save_path = 'udata'; $file_list = glob($save_path.'/*.csv'); ## print '<pre style="margin:18px 4px; padding:6px; text-align:left; background:#DEDEDE; color:#0000AA;">'."\n"; ## print_r($file_list)."\n"; ## print '</pre>'."\n"; foreach($file_list as $file_name) { print '<br /> + <a href="?f='.urlencode($file_name).'">'.$file_name.'</a>' . "\n"; } print '<br />' . "\n"; print '<br />' . "\n"; // ----------------------------------------------- function csv_to_array($csvfile, $csvhead=true, $delimiter=';', $length=2048) { $csvdata = false; if (($handle = fopen($csvfile, "r")) !== FALSE) { $csvdata = array(); if ($csvhead !== FALSE) { $headrow = fgetcsv($handle, $length, $delimiter); } $row = 0; while (($data = fgetcsv($handle, $length, $delimiter)) !== FALSE) { if ($csvhead !== FALSE) { foreach( $headrow as $key => $name ) { if (empty($name)) { $name = 'tab_'.$key; } $csvdata[$row][$name] = $data[$key]; } } else { $csvdata[$row] = $data; } $row++; } fclose($handle); } return $csvdata; } // ----------------------------------------------- if (!empty($_GET['f'])) { $save_file = trim($_GET['f']); if (file_exists($save_file)) { $read_data = csv_to_array($save_file, true, '|'); print '<pre style="margin:18px 4px; padding:6px; text-align:left; background:#DEDEDE; color:#0000AA;">'."\n"; print_r($read_data)."\n"; print '</pre>'."\n"; } } // ----------------------------------------------- ?>
Für die Datei: read_user_ip.php sollte man noch einen Passwort-Schutz machen
... damit nicht Hinz und Kunz auf die gespeicherten Daten zugreifen können !!
und wie gesagt, noch besser wäre das ganze mit MySQL zu speichern / aus-zu-lesen
dann kann man auch einfacher "alte" Datensätze wieder löschen und noch mehr machen
wie z.B. mit Reload-Zeit für Counter ... also gleiche IP nur alle n Minuten neu Speichern.
das ginge zwar mit CSV auch, ist aber deutlich aufwendiger als mit MySQL
aber das (mit MySQL) will ich jetzt nicht auch noch in diesem Beitrag schreiben,
.... ich hoffe trotzdem, dass diese zwei BSP Codes weiter helfen :)
-
die zeit ist schon mit drin, allerdings möchte ich das ganze nur durchführen, wenn die ip nicht direkt vorher schonmal da war:
$post_ip = file("ip.txt"); $post_ip = $post_ip[count($post_ip)-1]; echo($post_ip); echo($_SERVER['REMOTE_ADDR']); if ($post_ip != $_SERVER['REMOTE_ADDR']) { $date = date("Y-m-d",time())."-".date("H_i",time()); $fp = fopen('ip.txt', 'a+'); fwrite( $fp, " %%% " .$date . "\n"); fwrite( $fp,$_SERVER['REMOTE_ADDR'] . "\n" ); fclose( $fp ); $datei = file("ipzahl.txt"); $ipanzahl = $datei[count($datei)-1]; $ipanzahl = $ipanzahl + 0; $i = $ipanzahl+1; $datei = fopen ("ipzahl.txt", 'w+'); fclose( $datei ); $fp = fopen("ipzahl.txt", 'a+'); fwrite( $fp,$i . "\n" ); fclose( $fp ); }
das geht aber nicht: er geht so oder so die schleife durch, obwohl er das nicht tun soll.
Warum? -
Hallo
mach mal HTML-Zeilenumbruch z.B. <br /> zwischen die IP Ausgabe zur Test-Ansicht
dann kann man besser sehen, ob es die "gleichen" sind, wenn sie untereinander stehen
und dann .... FRAGE: .... wird denn bei ....
echo('<br />'.$post_ip); echo('<br />'.$_SERVER['REMOTE_ADDR']);
.... genau das gleiche ausgegeben ??
ahh ... ich denke es ist in $post_ip noch der Zeilenumbruch
mit dran,\n
denn beim Speichern hängst du ja das
mit dran,\n
was aber in $_SERVER['REMOTE_ADDR'] nicht vorkommt, daher immer ungleich
das könnte dazu führen, dass die if-Bedingung nicht hinhaut,
also mach noch trim() mit rein
if ( trim($post_ip) != $_SERVER['REMOTE_ADDR']) { ... }
oder halt schon eine Zeile vorher ....$post_ip = trim($post_ip);
damit dieses \n vom Ende des String (der letzten IP) entfernt wird.
Edit:
oder schon beim Einlesen der Daten mit file() die Umbrüche weg lassen:
$post_ip = file('ip.txt', FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES);
PS: grundsätzlich ist Deine Herangegensweise es so zu speichern Quatsch,
denn es wird immer nur die letzte Zeile / letzte IP geprüft, und wenn mehr als 1 User
gleichzeitig Online sind, dann kann das sooooo schon nicht mehr klappen !!!
Speichere die IP und die Zeit besser in eine Zeile (mit Trenner-Zeichen dazwischen)
und lesen dann mit fgetscsv() alle Zeilen in ein (multidiemensionales) Array,
dann kannst du dieses Array durchlaufen ob die IP darin schon vorkommt.
Dann hast Du noch das Problem, dass die eine Datei größer und größer wird
also du solltest sehr "alte" Einträge auch wieder (automatisch) löschen,
oder (wie in Antwort oben) je Monat eine neue Datei anlegen ...
oder noch besser, das mit MySQL machen, das würde alle Probleme lösen :)
Beitrag zuletzt geändert: 17.12.2013 22:36:35 von webnfo -
mit MySQL habe ich aber noch garnichts gemacht, und weiß überhaupt nicht, was geht und was nicht und vor allem wie es geht...
-
Normalerweise würde ich die php-einfach.de zum MySQL lernen empfehlen, allerdings bezieht sich das noch auf den alten Verbindungstreiber, der inzwischen von MySQLi abgelöst wurde und in Zukunft gar nicht mehr in PHP enthalten sein wird. Von daher => Keine Ahnung, ob es dazu vernünftige Tutorials gibt.
Als kleiner Gedankenanstoß: Du solltest 3 Spalten haben: id, ip, timestamp. Die ID wird per auto_increment vergeben. Mit dem timestamp speicherst du, wann du die IP das letzte gesehen hast und kannst dann Abfragen realisieren wie alle Zeilen, bei denen diese IP enthalten ist und bei denen der timetamp größer ist als der aktuelle minus z.B. 60 Minuten.
Anfangs wirkt es kompliziert, später fragt man sich allerdings, warum man nicht schon längt von Textdateien weggegangen ist, weil es einfach viel einfacher und bequemer und zu guter letzt auch noch schneller ist. -
Einfach so die IPs der Nutzenden mitloggen gehört aber nicht zum guten Ton, es ist zumindest diskussionswürdig, ob es sich da um personenbezogene Daten handelt.
(siehe z.B. https://www.datenschutzzentrum.de/ip-adressen/).
Und personenbezogene Daten dürfen nur dann erhoben werden, wenn sie für den angebotenen Dienst auch benötigt werden. -
@codindings
Ich habe extra gefragt, ob man das darf, außerdem möchte ich später vieleicht mal ein Anmeldedings machen, und da hatte ich vor, als eine Art Kontrolle des Benutzers das so machen, wann man sich womit(Browser) eingeloggt hat, und wollte das hiemit außprobieren -
Das ist ja auch nicht eindeutig entschieden, sondern eine Grauzone, und die Praxis ist in vielen Fällen, dass solche Daten gespeichert werden.
Aber man sollte sich zumindest immer überlegen, ob es unbedingt nötig ist, die Daten direkt zu loggen. Es wäre ja auch möglich, die Zuordnung pseudonymisiert zu speichern. Z.B. einen salted md5-Hash (oder eine andere Form der ein-Weg-Verschlüsselung) der IP zu speichern, der ist bei einem Wiederbesuch der Website ebenso leicht eindeutig zu vergleichen, es lässt sich aber nicht mehr die IP daraus ermitteln (zumindest nicht ohne großen Aufwand). Und der Nutzen von IPs ist ja ohnehin begrenzt, weil es keinen direkten 1 zu 1 Zusammenhang zwischen Nutzenden und IPs gibt (durch dynamische IP Vergabe, mobile Endgeräte, Ortswechsel etc.). -
Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!
lima-city: Gratis werbefreier Webspace für deine eigene Homepage