Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP]Zapisywanie IP gości do pliku
Forum PHP.pl > Forum > Przedszkole
E30Tomas
Witam
Z PHP mam kontakt od dzisiaj, a więc proszę o wyrozumiałość.
Udało mi się ostatnimi czasy uruchomić Serwer za pomocą IIS'a i zacząłem się bawić z prywatną stronką na no-ip. Wpadłem na pomysł, że fajnie będzie móc zapisywać sobie informacje o użytkownikach, którzy mnie odwiedzili, np. ich IP.
Napisałem taki kod, ale niestety nie działa, siedzę nad nim już ponad godzinę i już się troszkę tym zmęczyłem a nic nie widzę, wydaje mi się, że problem jest z którymś while, ale niestety to jest "kopiuj", "wklej" bo dopiero dzisiaj pierwszy raz miałem kontakt z PHP i nie znam komend na odczyt i zapis plików.

Kod:
  1. //$ip pobieram wcześniej za też pomocą wklejki, ale dobrze działa.
  2. //plik state.txt zawiera jedną cyfrę z informacją ile IP jest zapisanych w folderze "dane" pod kolejnymi cyframi od "0".
  3. //(teraz zauważyłem problem, że przy 10tym użytkowniku, przekręci mi state.txt ponieważ odczyta 1 znak
  4. //no trudno, później się tym zajmę, ale chciał bym, żeby kod zaczął działać).
  5. $read = fopen("state.txt","r");
  6. while (!feof($read)){
  7. $lp = fgetc($read); //odczytanie liczby IP zapisanych
  8. fclose($read);
  9. for ($i = 0; $i < $lp ; $i++){
  10. $read2 = fopen("dane/".$i.".txt", "r"); //otwarcie pliku
  11. while (!feof($read2)){
  12. $ipFromFile[$i] = fgets($read2); //odczytanie IP z pliku
  13. fclose($read2);
  14. if($i++ == $lp){ //nie umiem posługiwać się globalnymi zmiennymi, a więc w taki sposób wszystko wcisnąłem lokalnie
  15. $check = 0;
  16. for ($j = 0; $j < $lp ; $j++){
  17. if($ip == $ipFromFile[$i]){
  18. $check++; //zwiększam wartość $check tylko wtedy, gdy IP już mam zapisane
  19. } //czyli $ip użytkownika jest równe $ip z pliku
  20. }
  21. if($check == 0){ //jeżeli check nie został zwiększony, to znaczy, że jest to nowe IP
  22. $save2 = fopen("dane/".($lp+1).".txt", "w"); //zapisanie nowego IP w kolejnym pliku
  23. fwrite($save2, $ip);
  24. fclose($save2);
  25. $save = fopen("state.txt","w");
  26. fwrite($save, $lp++); //zapisanie w pliku state.txt liczby większej o 1
  27. fclose($save); //ponieważ jest jedno nowe IP
  28. }
  29. }
  30. }
  31. }
  32. }


Może ktoś to przepuści przez jakiś kompilator i zobaczy czy nie ma błędów w ten sposób, ja nie mam żadnego, piszę kod w Notepad++ i patrzę na efekty na stronie.


z góry dziękuję bardzo za pomoc!
Prosiłbym o nakierowanie mnie co gdzie jest źle, nie interesuje mnie gotowiec, wykonany 100 razy lepiej przez doświadczonego informatyka, ja czerpie przyjemność z pisania kodu samemu i debugowania go, ale chciałbym, żeby strona dalej działa i chciałbym już zbierać informację i gościach.
Beniooo
Prosciej bedzie uzyc file_get_contents rozbic na tablice, potem sprawdzic in_array i zapisujesz file_put_contents, prosciej biggrin.gif
Sephirus
Można to napisać dużo lepiej bez wnikania co nie działa w tym miejscu.

  1. $ip = $_SERVER['REMOTE_ADDR'];
  2. $found = false;
  3. $filePath = 'sciezka/do/pliku/z/lista_ip.txt'; // jeden plik, w którym masz listę IP
  4.  
  5. if(is_readable($filePath)) { // jeśli istnieje to ładujemy go
  6. $file = fopen($filePath,'r');
  7.  
  8. while(!feof($file)) { // sprawdzamy czy dana linia jest równa adresowi IP
  9. $line = fgets($file);
  10. if($line == $ip) { // jeśli tak to kończymy
  11. $found = true;
  12. break;
  13. }
  14. }
  15.  
  16. fclose($file);
  17. }
  18.  
  19. if(!$found) { // jeśli nie znaleziono to zapisujemy plik (dopisujemy nowe IP)
  20. $file = fopen($filePath,'a+');
  21. if(flock($file, LOCK_EX)) { // ale blokujemy plik by nie było równoległych zapisów
  22. fwrite($file, "{$ip}\n");
  23. fflush($file);
  24. flock($file, LOCK_UN)
  25. }
  26. fclose($file);
  27. }
!*!
@E30Tomas włącz wyświetlanie błędów, a wszystko stanie się jasne.
  1. error_reporting(E_ALL); // umiesc to na początku pliku


@Sephirus - nie utrudniaj innym życia ;)

  1. $file = 'ip.txt'; // plik z adresami
  2. $ip = $_SERVER['REMOTE_ADDR']; // pobranie IP
  3.  
  4. $ipAll = file($file, FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES); // wczytanie wszystkich ip z pliku do tablicy
  5.  
  6. if (!in_array($ip, $ipAll)) // jesli nie jestnieje
  7. {
  8. file_put_contents($file, $ip."\n", FILE_APPEND | LOCK_EX); //zapis ip do pliku
  9. }
Sephirus
@!*! Touche - ale ale przyzwyczajony jestem do działania na wydajności i przerabiania sporych plików - toteż wolałem napisać coś co nie zajmie dużo ramu wink.gif

Skrajność: oneeyedsmiley02.png

plik z Ip ma już 1mb - wchodzi 100 gości - u Ciebie ram skacze o ~200mb
u mnie o jakieś ~60mb smile.gif

plik 2mb - u Ciebie 300mb
a u mnie ~60mb tongue.gif

Przelicz smile.gif

Stąd taki a nie inny kod wink.gif

Oczywiście w przypadku autora nie ma to większego sensu wink.gif
E30Tomas
Dzięki bardzo za pomoc!

kod od "Sephirus" nie działa, strona nie ładuje, ale kod od "!*!" działa świetnie!

Dzięki bardzo!! Oboje dostajecie po pomocy smile.gif


Tutaj link do strony, możecie zobaczyć jak to działa, a ja przy okazji zobaczę czy IP mi zapisze i licznik odwiedzin wzrośnie smile.gif
5k.no-ip.org
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.