laravel 4 enregistrer l'adresse IP au modèle
Je suis en train d'enregistrer une adresse ip de l'utilisateur à ma base de données à l'aide de Laravel 4.
J'ai trouvé la fonction suivante qui retourne une chaîne de caractères
Request::getClientIp()
Comment aurais-je stocker dans mon modèle? Juste une chaîne ou est-il un moyen plus efficace?
$table->string('ip_address');
source d'informationauteur user391986
Vous devez vous connecter pour publier un commentaire.
Option 1: Utilisation de type VARCHAR(45) de la colonne
Compte tenu de la discussion dans un autre DONC, la question Longueur maximale de la représentation textuelle d'une adresse IPv6?la longueur maximale de l'IPv6 est de 45 lors de l'inclusion de l'IPv4 fonctionnalité.
Ainsi, une migration plus sûre de commande serait:
Pour:
Contre:
Option 2: Utilisation de la colonne BLOB
@Euantorano fournis le lien pour L'adresse IP de stockage dans la base de données mysqlvous pouvez stocker l'IP en binaire pour économiser de l'espace.
La réponse la plus simple serait d'utiliser:
Pour:
Contre:
Vous aurez besoin de convertir l'adresse IP de la chaîne binaire en utilisant d'abord quelque chose comme PHP inet_pton(). La colonne ne sera pas lisible directement depuis qu'il est stocké dans un format binaire. Vous verrez des caractères bizarres ou vide si essayé de l'interroger directement. Vous pouvez regarder ma façon de stocker et de récupérer l'adresse IP dans l'Option 3 ci-dessous.
Le générateur de requête dans Laravel, en dépit de l'appel d'une méthode binaire, créer une colonne BLOB pour vous. BLOB est stocké hors de la tablehors de la ligne de la mémoire tamponqui éventuellement signifie une baisse des performances. Et il n'y a vraiment pas de raison de ne pas utiliser les BINAIRES de type de colonne, comme nous savons que les adresses IP ne sont pas longues pour BLOB nécessaire.
Option 3: Utilisation de type VARBINARY(16) de la colonne
Laravel du générateur de requête produit une colonne BLOB pour l'exemple de l'Option 2. Si vous utilisez MySQL, vous souhaitez utiliser VARBINARY(16) au lieu de BLOB pour de meilleures performances.
Script de Migration:
Évidemment, la seule partie importante ci-dessus est le DB::énoncé(...). Nous avons besoin d'utiliser des requêtes comme Taylor Otwell suggéré. N'hésitez pas à créer le reste de la table à votre façon.
De là, vous pouvez utiliser PHP inet_pton() et inet_ntop() pour convertir les chaînes d'adresse IP en binaire et vice versa.
Pour:
Contre:
Un crédit supplémentaire: Ajouter des Éloquent accesseur/mutateur (facultatif):
C'est là que je trouve Éloquent vraiment utile. Vous pouvez définir votre propre accesseur/mutateur à votre Éloquent modèle et vous pouvez obtenir/jeu via votre modèle la variable d'instance, comme d'habitude.
Maintenant, si vous n':
L'adresse IP sera enregistrée en tant que binaire correctement. Et vous pouvez le faire:
Et il se fera l'écho de sortir 192.168.0.1. Très utile!
Parce que la longueur maximale d'une adresse IPv6 est de 39.
IPv4 seront pris en charge comme c'est la longueur n'est pas supérieure à 15.
De @Unnawut.
Vous avez besoin de changer de
binary(16)
àvarbinary(16)
si vous voulez traiter à la fois ipv4 et ipv6 dans le même domaine.Mais si vous avez besoin de traiter uniquement l'adresse ip v4 juste
INT UNSIGNED
Si vous voulez traiter seul ip v6
BINARY(16)
ref: MYSQL - SELECT IP v4/v6, inet_pton & bin2hex
ref2: https://stackoverflow.com/a/5133610/2126472