Problema contorizre ip-uri unice cu IPv6

Discutii despre script-uri si coduri PHP-MySQL, precum si lucru cu XML in PHP.
Avatar utilizator
ionatan
Mesaje:94

Problema contorizre ip-uri unice cu IPv6

Salut, si La multi ani!
Am facut un script in care vreau sa contorizez vizitatorii unici pe care ii introduc in baza de date cu:

Cod: Selectaţi tot

$ip = $_SERVER['REMOTE_ADDR'];
merge totul ok pana am observat ca cineva acceseaza siteul de pe telefon mobil iar ip-ul inregistrat este de ex: "2a02:2f02:b001:1" sau "2a02:2f07:301f:f"
Ce ip este acesta?
Nu m-ar deranja, dar treaba e ca de cate ori acceseaza se tot adauga in baza de date ca ip unic dar in fond este acelasi ip si nu ar trebui sa il mai repete.
Am cautat pe net ai am gasit ceva de genul ca sunt IPv6.
Cum as putea rezolva?
Cumpără adevărul, şi nu-l vinde, înţelepciunea, învăţătura şi priceperea.
https://www.crestinmultimedia.com/

MarPlo Mesaje:4343
Salut
Nu stiu cum e cu unicitatea la IPv6; o fi acelasi telefon, dar probabil are conexiune cu ip variabil care se schimba la fiecare conectare. Asa poate fi si la ip standard tip IPv4, acelasi calculator cu ip schimbator la fiecare conectare.
O idee ar fi sa folosesti si cookie impreuna cu ip-ul:

Cod: Selectaţi tot

$ip = isset($_COOKIE['yourip']) ? $_COOKIE['yourip'] : $_SERVER['REMOTE_ADDR'];
setcookie('yourip', $ip, time()+(3600 *24 *30));  //register the ip in cookie for 30 days
echo $ip;
// restul codului 
Asa, chiar daca se schimba ip-ul, daca e acelasi calculator si browser foloseste ip-ul din cookie.

- Daca iti e de folos sa verifici ca ip-ul e standardul IPv4, poti folosi acest cod:

Cod: Selectaţi tot

$ip = $_SERVER['REMOTE_ADDR'];
if(filter_var($ip, FILTER_VALIDATE_IP, FILTER_FLAG_IPV4)) {    
  echo 'Valid IPv4';
}
else {
  echo 'Invalid IPv4';
} 

ionatan Mesaje:94
Ideea era ca la fiecare accesare a site-ului era acelasi ip 2a02:2f02:b001:1 a accesat 20 pagini si a adaugat in baza de date 20 randuri cu acelai ip ca si cum ar fi 20 unici...... nu e corect deci eu am pus conditia daca mai exista acel ip in bd sa nu mai introduca si totusi se face insert
Multumesc de raspuns, inca caut sa rezolv....... si nu ma las pana nu ii dau de capat :D :D

ar fi o idee geniala si cu cookie . se poate seta cookie.ul ca si timp sa fieziua curenta sau durata lui de viata sa fie pana la sfarsitul zilei.....?
Cumpără adevărul, şi nu-l vinde, înţelepciunea, învăţătura şi priceperea.
https://www.crestinmultimedia.com/

MarPlo Mesaje:4343
Atunci, daca face insert cu aceeasi valoare, problema nu e la ip, ci la codul de verificare si insert in baza de date, poate si tipul coloanei de tabel mysql.
Daca setezi tipul coloanei ca UNIQUE nu va mai adauga de 2 ori aceeasi valoare.

- Cookie valabil pana la sfarsitul zilei:

Cod: Selectaţi tot

setcookie('yourip', $ip, strtotime('tomorrow')); 

ionatan Mesaje:94
asa fac verificare si insert

Cod: Selectaţi tot

$ip = $_SERVER['REMOTE_ADDR'];
    date_default_timezone_set('Europe/Bucharest');
       $data = date('Y-m-d H:i:s'); 
       
  // Conectare si creare obiect PDO
  $conn = new PDO("mysql:host= ; dbname=", " ", "");

  $sql="select * from vizite_unice 
       where ip='$ip' AND 
         DAY( data ) = EXTRACT(DAY FROM NOW()+ INTERVAL 1 HOUR ) AND 
          MONTH( data ) = EXTRACT(MONTH FROM NOW() ) AND 
            YEAR( data ) = EXTRACT(YEAR FROM NOW() )  ";
                                           
  $rows = $conn->query($sql);
$nr_rows = $rows->rowCount();    
if($nr_rows == 0) {
  $sql = "INSERT INTO `vizite_unice` (`ip`, `data`, `utilizator` ) VALUES ('". $ip. "',  '".$data."' ,  '". $utilizator. "' )";
  $rows = $conn->query($sql);
 } 
daca voi seta tipul coloanei UNIQUE inseamna ca indiferent de data calendaristica, nu va repeta acel ip dar eu vreau acel ip o data pe zi
Cumpără adevărul, şi nu-l vinde, înţelepciunea, învăţătura şi priceperea.
https://www.crestinmultimedia.com/

MarPlo Mesaje:4343
Coloana "ip" sa aibe numar de caractere care sa poata cuprinde si IPv6, de exemplu VARCHAR(40).
Incearca sa stergi " + INTERVAL 1 HOUR", adica:

Cod: Selectaţi tot

$sql = "... DAY( data ) = EXTRACT(DAY FROM NOW()) ...";
Sau Select-ul si Insert asa:

Cod: Selectaţi tot

$sql="SELECT COUNT(*) FROM vizite_unice 
where ip='$ip' AND 
 DAY( data ) = EXTRACT(DAY FROM NOW() ) AND 
 MONTH( data ) = EXTRACT(MONTH FROM NOW() ) AND 
 YEAR( data ) = EXTRACT(YEAR FROM NOW() )";
                                           
$rows = $conn->query($sql);
if($rows->fetchColumn() <= 0) {
  $sql = "INSERT INTO `vizite_unice` (`ip`, `data`, `utilizator` ) VALUES ('". $ip. "',  '".$data."' ,  '". $utilizator. "' )";
  $rows = $conn->query($sql);
 } 

ionatan Mesaje:94
cred ca sa rezolvat.....
coloana ip am avut-o VARCHAR , dar numarul de caractere foarte mic si normal ca nu se facea insertul ip-ului intreg, doar o parte din ip si logic ca facea selectul, cauta daca mai exista acel ip si nu il gasea ....si facea din nou un insert.....
am cautat pe net IPv6 si am gasit si din 38 caractere eu aveam VARCHAR(16) :D

am schimbat codul de select-insert cu ce mi-ai dat si am schimbat cu VARCHAR(100)

astept sa se conecteze acel utilizator sa verific
multumesc pentru tot .
Cumpără adevărul, şi nu-l vinde, înţelepciunea, învăţătura şi priceperea.
https://www.crestinmultimedia.com/

Subiecte similare