2013-07-22 4 views
8

Ich versuche, eine Benutzer-IP-Adresse zu meiner Datenbank speichern unter Verwendung Laravel 4. fand ich die folgende Funktion, dieLaravel 4 Einsparung IP-Adresse zu modellieren

einen String zurückgibt
Request::getClientIp() 

Wie würde ich dieses Geschäft in mein Modell? Nur eine Zeichenfolge oder gibt es einen effizienteren Weg?

$table->string('ip_address'); 
+0

Werfen Sie einen Blick auf diese relevante Frage: http://stackoverflow.com/questions/6427786/ip-address-storing-in-mysql-database – euantorano

+0

danke! Ich habe über VARBINARY nachgedacht, aber ich kann diesen Typ im Schema-Builder nicht finden, ist es dasselbe wie $ table-> binary ('data'); ? http://four.laravel.com/docs/schema – user391986

+0

Sieht aus, als wäre es nur eine binäre Spalte statt VARBINARY: http://laravel.com/api/source-class-Illuminate.Database.Schema.Bluprint.html#576 -585 - könnte eine gute Idee sein, es zu testen und zu sehen. – euantorano

Antwort

1
$table->string('ip_address', 39); 

Da die maximale Länge einer IPv6-Adresse ist 39.

IPv4 unterstützt werden, wie es Länge nicht überschreitet nicht 15

36

Option 1: Mit VARCHAR (45) Spalte

Betrachten wir die Diskussion in einer anderen SO Frage Maximum length of the textual representation of an IPv6 address?, die Maxime Die Länge von IPv6 beträgt 45, wenn die IPv4-Tunnelfunktion einbezogen wird.

Somit ist ein sicherer Migrationsbefehl wäre:

$table->string('ip_address', 45); 

Pro:

  1. Die Säule ist in lesbarer Form. Keine Konvertierung erforderlich, wenn der Wert festgelegt oder die Zeile zum Anzeigen abgefragt wird.

Nachteile:

  1. Es nutzt mehr Platz als Option 2, fast 3-mal größer ist in der Tat. Aber ich würde mir keine Sorgen machen, es sei denn, Sie planen Millionen von Zeilen.

Option 2: Verwenden Sie BLOB-Spalte

Wie @euantorano den Link zu IP address storing in mysql database zur Verfügung gestellt, die IP als binäre speichern kann, um Platz zu sparen.

Die einfachste Antwort wäre zu verwenden:

$table->binary('ip_address'); 

Vorteile:

  1. Shop IP-Adressen in binärer werden Sie etwas Platz sparen.

Nachteile:

  1. Sie müssen die IP-Adresse Zeichenfolge konvertieren inet_pton() zunächst mit so etwas wie PHP binär. Die Spalte ist nicht direkt lesbar, da sie im Binärformat gespeichert ist. Sie werden merkwürdige Zeichen oder Leerzeichen sehen, wenn Sie versuchen, es direkt abzufragen.Vielleicht möchten Sie meinen Weg zum Speichern und Abrufen der IP-Adresse in Option 3 unten sehen.

  2. Der Abfrage-Generator in Laravel, trotz der Methode, die als binär bezeichnet wird, wird tatsächlich create a BLOB column für Sie. BLOB is stored off the table, out of the row buffer, die möglicherweise bedeutet eine geringere Leistung. Und es gibt wirklich keinen Grund, den BINARY-Spaltentyp nicht zu verwenden, da wir wissen, dass IP-Adressen nicht so lang sind, dass BLOB notwendig ist.


Option 3: Verwenden Sie VARBINARY (16) Spalte

Laravel der Query Builder eine BLOB-Spalte für das Beispiel in Option erzeugt 2. Wenn Sie MySQL verwenden, werden Sie verwenden möchten VARBINARY (16) anstelle von BLOB für bessere Leistung.

Migration Skript:

class CreateMyLogsTable extends Migration { 

    public function up() 
    { 
     Schema::create('my_logs', function(Blueprint $table) { 
      $table->increments('id'); 
     }); 

     DB::statement('ALTER TABLE `my_logs` ADD `ip_address` VARBINARY(16)'); 
    } 

    public function down() 
    { 
     DB::statement('ALTER TABLE `my_logs` DROP COLUMN `ip_address`'); 

     Schema::drop('my_logs'); 
    } 
} 

Offensichtlich ist die einzige oberhalb wichtiger Teil ist die DB :: Aussage (...). Wir müssen rohe Abfragen als Taylor Otwell suggested verwenden. Fühlen Sie sich frei, den Rest des Tisches auf Ihre Art zu erschaffen.

Von hier aus können Sie die inet_pton() und inet_ntop() PHP verwenden, um die IP-Adressfolgen in binäre und umgekehrt umzuwandeln.

Vorteile:

  1. Raum spart im Vergleich zu Option 1
  2. Leistung besser DB im Vergleich zu Option 2

Nachteile:

  1. Wie Option 2, Sie müssen entweder manuell y wandeln Sie zwischen binärer und menschenlesbarer Zeichenkette hin und her oder verwenden Sie das Eloquent-Modell mit einem Paar benutzerdefiniertem Accessor/Mutator, den ich unten zeigen werde.

Extra-Kredit: Fügen Sie benutzerdefinierte Eloquent Accessor/Mutator (optional):

Hier ist, wo ich Eloquent wirklich nützlich finden. Sie können Ihren eigenen Accessor/Mutator auf Ihr Eloquent-Modell einstellen und Sie können wie gewohnt über die Instanzvariable Ihres Modells abrufen/setzen.

class MyLog extends Eloquent { 

    public $timestamps = false; 

    public function getIpAddressAttribute($value) 
    { 
     return inet_ntop($value); 
    } 

    public function setIpAddressAttribute($value) 
    { 
     $this->attributes['ip_address'] = inet_pton($value); 
    } 
} 

Nun, wenn Sie tun:

$log = new MyLog; 
$log->ip_address = '192.168.0.1'; 
$log->save(); 

Die IP-Adresse wird korrekt als binär gespeichert werden. Und Sie können:

$log = MyLog::find(1); 
echo $log->ip_address; 

Und es wird 192.168.0.1. Sehr hilfreich!

+0

Unter Verwendung der bereitgestellten Schritte hat es die IP-Adresse als eine lange Binärdatei eingefügt, und beim Abrufen von der Datenbank wurde '7f00: 1 :: 'zurückgegeben. Die an die Datenbank gesendete IP war '127.0.0.1'. Wenn Sie das Beispiel '192.168.0.1' verwenden, geben Sie' c0a8: 1 :: 'zurück. Verwenden Sie die Option 3. – davidxd33

+0

@ davidxd333 Danke, dass Sie diese Option hervorgehoben haben. Dies liegt daran, dass BINARY beim Speichern Nullen auf IPv4-Adressen auffüllt. Was Kanin Peanviriyakulkit in einer anderen Antwort unten erwähnt, müssen wir VARBINARY anstelle von BINARY tatsächlich verwenden. Ich habe meine Antwort zu VARBINARY geändert. – Unnawut

+0

Ist die 'DB :: Anweisung (...)' in der 'down' Methode notwendig? – Matthew

0

Von @UnnaWut.

Sie müssen von binary(16) zu varbinary(16) ändern, wenn Sie mit ipv4 und ipv6 im gleichen Feld beschäftigen möchten.

Aber wenn Sie brauchen nur ip v4 beschäftigen nur INT UNSIGNED

Wenn Sie nur IP v6 umgehen BINARY(16)

ref: MYSQL - SELECT IP v4/v6, inet_pton & bin2hex

ref2: https://stackoverflow.com/a/5133610/2126472

+0

fallen lassen Richtig! Danke, dass du darauf hingewiesen hast. Freut mich, auch bekannte Namen auf SO zu sehen! : D – Unnawut

+0

Ah! Ich bin auch froh, dich zu sehen. –