2010-09-30 7 views
3

J'ai lu que la meilleure façon de stocker des adresses IP dans une base de données est de créer un champ Unsigned Int (10). Comment puis-je convertir les adresses IP en utilisant PHP? J'ai essayé d'utiliserEnregistrer une adresse IP en tant qu'intérieur non signé?

$this->ip = long2ip($_SERVER['REMOTE_ADDR']); 

Mais cela ne semble pas fonctionner. J'ai trouvé le moyen de le reconvertir en une adresse IP à l'aide

$this->ip = sprintf("%u", ip2long($result['ip'])); 

Comment puis-je convertir l'adresse IP au départ? Dois-je utiliser PHP pour cela? Ou serait-il préférable de l'intégrer dans la requête MySQL?

+0

Eh bien, selon cette question, le meilleur type de données n'est pas un entier http://stackoverflow.com/questions/1038950/what-is-be-the-most- appropriate-data-type-for-storing-an-ip-address- in-sql-server – codingbadger

+0

Je ne suis pas sûr du meilleur type de données à travers le tableau, mais dans le cas de Postgres, je dirais que le meilleur type de données était 'Inet' plutôt que de le pirater dans quelque chose d'autre. –

Répondre

12

long2ip convertit un nombre entier dans le format IP et ip2long fait l'inverse.

Il faut donc utiliser ip2long pour convertir $_SERVER['REMOTE_ADDR'] en un entier pour le stockage dans la base de données et utiliser long2ip après avoir lu l'entier de la base de données:

$long = ip2long($_SERVER['REMOTE_ADDR']); 
$ip = long2ip($long); 
+1

Votre explication est correcte mais votre utilisation dans le snipped est incorrecte. – codaddict

+1

@codaddict: Oups, corrigé. – Gumbo

2

J'ai utilisé cette

function ip2int($ip) { 
    $a = explode(".",$ip); 
    return $a[0] * 256 * 256 * 256 + $a[1] * 256 * 256 + $a[2] * 256 + $a[3]; 
} 
+0

celui-ci est mieux que celui intégré, car il ne frappe pas le signe numéro – ianmac45

1

Vous aurez voulez convertir la version en pointillés de votre adresse IP en utilisant ip2long, et de retour en utilisant long2ip. On dirait que vous l'avez en arrière en ce moment.

$integer_ip = ip2long($_SERVER["REMOTE_ADDR"]); // => 1113982819 
$dotted_ip = long2ip($integer_ip);    // => "66.102.7.99" 
2

Si vous utilisez MySQL, vous pouvez utiliser le INET_ATON (équivalent ip2long) et INET_NTOA (long2ip) fonctions plutôt que de faire le traitement avec PHP:

12

mieux mettre cette logique dans votre requête SQL:

INSERT INTO `table` 
    (`ip`) 
VALUES 
    INET_ATON('192.168.0.1') 

Et puis adresse secrète de retour lors de la sélection des données:

SELECT INET_NTOA(`ip`) 
    FROM `table` 
+2

+1, surtout parce que cela devrait également soutenir IPv6 - bien que cela ne devienne probablement jamais réalité:/ –

+0

Quel est l'avantage de en utilisant SQL sur PHP? – Ian

+1

Eh bien, c'est juste mieux, de mettre la logique de stockage de la base de données dans les requêtes si cela est possible. Par exemple, si vous mettez à niveau votre serveur MySQL vers une nouvelle version et qu'il y aura des changements dans la façon dont les données sont stockées, ces changements seront également reflétés dans les fonctions de base de données. Si vous confiez cette logique à un autre outil, vous risquez d'avoir un problème. Mais tout d'abord, c'est la délégation logique des tâches, afin que votre code soit plus compréhensible. –