Visualizzazione dei risultati da 1 a 5 su 5

Discussione: Classi IP

  1. #1

    Classi IP

    Salve a tutti,
    volevo chiedervi se mi poteste postare il codice php per individuare le classi di un indirizzo ip. Per spiegarmi meglio io vorrei un codice che prima mi prende, tanto per intenderci, i numeri fino al primo punto, poi fino al secondo, poi fino al terzo....
    Infatti, a seconda di quelli io dovrei associare l'ip con un tabella. Da quella io poi mi leggo lo style del sito.
    Esempio pratico:
    arriva un ip 125.152.15.1
    incomincio a prelevare l'ip più dettagliato 125.152.15.1, controllo la tabella. Se la tabella non mi restituisce nessun valore proseguo nel più generico...
    Prendo l'ip prima dell'ultimo punto: 125.152.15, controllo la tabella e come prima se non c'e' nessun valore associato a quell'ip vado avanti.
    Ovviamente il tutto funzionerà con una serie di if a scalare. Gli if me li faccio io. Quindi se mi daste un codice php che mi prende a mano l'ip più generico, mi fareste un grande favore.
    Grazie in anticipo.

  2. #2
    Moderatore di PHP L'avatar di Alhazred
    Registrato dal
    Oct 2003
    Messaggi
    12,505
    Codice PHP:
    $ip $_SERVER['REMOTE_ADDR']; //ip di chi raggiunge la pagina, ad esempio 125.152.15.1
    $ip_groups explode(".",$ip);

    echo 
    $ip_groups[0]; //stampa 125
    echo $ip_groups[1]; //stampa 152
    echo $ip_groups[2]; //stampa 15
    echo $ip_groups[3]; //stampa 1 
    con una serie di if, else if puoi ricreare il comportamento che ti serve.

  3. #3
    beh, se ti serve cercare l'IP a blocchi credo che ti convenga di più convertirlo a numero piuttosto che tenerlo in forma letterale!

    www.php.net/ip2long

    codice:
    $ip = ip2long($_SERVER['REMOTE_ADDR']);
    dopo di che, sappiamo che ti interessa prendere 4 blocchi, ovvero se ad esempio ti viene dato, prima vuoi cercare questo 125.152.15.1, poi vuoi cercare gli ip compresi tra 125.152.15.0 e 125.152.15.255 (benché lo 0 e il 255 non sono usabili), poi tra il 125.152.0.0 e il 125.152.255.255 e via dicendo

    per far questo ti basta usare una serie di maschere booleane in quanto ogni "parte" dell'ip altro non è che un byte (compreso per l'appunto tra 0 e 255) di conseguenza per ottenere inizio e fine basta che quel byte prima lo imposti a zero (mettendo a zero tutti i bit) e poi lo imposti a 255 (mettendo a 1 tutti i bit) quindi direi qualcosa tipo

    codice:
    $ip_4_start = $ip & 0xFFFFFF00; // con questo forzo l'ultimo byte a essere a zero
    $ip_4_end = $ip || 0x000000FF; // con questo forzo l'ultimo byte a essere a 1
    
    
    $ip_3_start = $ip & 0xFFFF0000; 
    $ip_3_end = $ip || 0x0000FFFF;
    
    $ip_2_start = $ip & 0xFF000000; 
    $ip_2_end = $ip || 0x00FFFFFF;
    
    $ip_1_start = 0; 
    $ip_1_end = 0xFFFFFFFF;
    in realtà non ha molto senso $ip_1_start e $ip_1_end perché sarebbero 0.0.0.0 e 255.255.255.255



    quando fai la query ti basta costruire un where che utilizzi queste combinazioni di risultati e per ordinarli basta che riproduci la clausola where all'interno di un order by che da precedenza prima alla corrispondenza diretta e alle altre, magari usando un case ... mettendo in fine un LIMIT 1 per poter estrarre un solo elemento
    The fastest Redis alternative ... cachegrand! https://github.com/danielealbano/cachegrand

  4. #4
    Originariamente inviato da Alhazred
    Codice PHP:
    $ip $_SERVER['REMOTE_ADDR']; //ip di chi raggiunge la pagina, ad esempio 125.152.15.1
    $ip_groups explode(".",$ip);

    echo 
    $ip_groups[0]; //stampa 125
    echo $ip_groups[1]; //stampa 152
    echo $ip_groups[2]; //stampa 15
    echo $ip_groups[3]; //stampa 1 
    con una serie di if, else if puoi ricreare il comportamento che ti serve.
    Vorrei aggiungere una cosa: così si ottiene un array di stringhe, meglio convertirlo in array di interi:
    Codice PHP:
    $ip $_SERVER['REMOTE_ADDR'];
    $ip_groups explode(".",$ip);
    foreach(
    $ip_groups as $group){
        
    $ip_integer[]=(int)$group;

    La differenza fra la genialità e la stupidità è che la genialità ha i suoi limiti.


  5. #5
    Grazie,
    ora posso procedere con lo script.
    Buon lavoro

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.