Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Zapis adresu IP w bazie danych
Forum PHP.pl > Forum > PHP
SmokAnalog
Witajcie,

mam kilka pytań/wątpliwości odnośnie zapisu adresu IP w bazie danych. Wypunktuję, żeby był porządek smile.gif
  1. Jakie są najlepsze praktyki jeśli chodzi o zapisywanie adresu IP w bazie danych z użyciem biblioteki PDO? Chciałbym otworzyć się na ipv6, więc powinienem użyć funkcji inet_pton - zgadza się?

    Wymyśliłem coś takiego:
    1. $sql->bindValue(':ip', inet_pton($_SERVER['REMOTE_ADDR']), PDO::PARAM_LOB);
  2. Czy PARAM_LOB to dobry wybór?
  3. Jestem też ciekaw jaki typ pola w bazie powinienem wybrać: VARBINARY(16), a może coś innego?

Liczę na gorącą dyskusję smile.gif
Damonsson
Zawsze mnie zastanawiało skąd mnóstwo dyskusji i zapytań o to jak zapisywać IP. Co w nim jest takiego wyjątkowego, że nie można go zapisać jako najzwyklejszy string?
SmokAnalog
Można, tylko po co? Liczbę znaków używanych przez adres IP można policzyć na palcach obu rąk. Najzwyklejsze w świecie marnotrawstwo miejsca w bazie. Oczywiście jeśli mamy kilka(set) rekordów to żadne kotki nie ucierpią, ale przy milionach to już jest spora różnica. Nie zawsze droga na skróty i najprostsze rozwiązania są najlepsze.
Damonsson
To wszystko zależy od tego w jakim kontekście wykorzystujemy to ip (może jakaś zaawansowana geolokalizacja po ip, wtedy można by pomyśleć o optymalizacji), ale w 95% przypadków wg mnie to jest tylko sztuka dla sztuki. Można mnie zbesztać i zasypać rzeczowymi argumentami, jeśli głoszę herezję wink.gif
redeemer
@Damonsson: Bo adres IP to tak naprawdę liczba, a nie string (np. http://1167283143 ).

@SmokAnalog: Ten sposób jest chyba najlepszy, jeśli chodzi o IPv6. (MySQL od wersji 5.6 zawiera funkcje do IPv6 jak np. INET6_ATON i operują one też na VARBINARY(16).
SmokAnalog
Cytat(Damonsson @ 17.09.2013, 13:41:02 ) *
To wszystko zależy od tego w jakim kontekście wykorzystujemy to ip (może jakaś zaawansowana geolokalizacja po ip, wtedy można by pomyśleć o optymalizacji), ale w 95% przypadków wg mnie to jest tylko sztuka dla sztuki. Można mnie zbesztać i zasypać rzeczowymi argumentami, jeśli głoszę herezję wink.gif

Nie rozumiem co ma jedno do drugiego smile.gif Co to za różnica do czego wykorzystujemy to IP w kontekście sposobu jego zapisu?
Crozin
Co prawda nie wspomniano nic o konkretnym silniku bazy danych, ale w MySQL sprawa jest o tyle nieciekawa, że bazie tej brakuje dobrego wsparcia dla przechowywania adresów IP i niestety trzeba się ratować ogólnym typem binarnym, np. VARBINARY(16). Jednak, gdy w przyszłości w końcu poprawią ten aspekt, nie będzie żadnego problemu z migracją. W innych baza danych, w miarę możliwości korzystaj z dedykowanego typu dla adresów, np. w przypadku Postgresa będzie to typ inet

1. Wszystkie adresy IPv4 konwertuj do IPv6. Łatwiej jest pracować nad pojedynczym modelem danych. Ewentualnie tuż przed wyświetleniem gdzieś tego adresu możesz sprawdzić czy jest to v4 i zaprezentować go w takiej właśnie formie.
2. Po stronie PHP przydatne będzie inet_pton oraz inet_ntop.

@Damonsson: Jeżeli interesuje Cię jedynie zapisanie i odczytanie adresu, to zapisywanie jako tekst jeszcze przejdzie, ale jeżeli chcesz z tymi danymi zrobić cokolwiek innego będzie to stwarzało sporo problemów.
SmokAnalog
Cytat(Crozin @ 17.09.2013, 14:00:12 ) *
1. Wszystkie adresy IPv4 konwertuj do IPv6. Łatwiej jest pracować nad pojedynczym modelem danych. Ewentualnie tuż przed wyświetleniem gdzieś tego adresu możesz sprawdzić czy jest to v4 i zaprezentować go w takiej właśnie formie.

Rozumiem, że inet_pton sam się tym zajmie, prawda?

Proszę jeszcze o odpowiedź w sprawie PDO::PARAM_LOB, bo nie ukrywam, że to mnie najbardziej intryguje.
Crozin
Jeżeli masz adres IPv4 jego najprostszym odpowiednim w IPv6 jest dokładnie ten sam ciąg poprzedzony dwoma dwukropkami:
Kod
123.123.123.123   - IPv4
::123.123.123.123 - IPv6
Funkcje inet_*() powinny rozumieć taką konstrukcję.

Co do PDO::PARAM_LOB to w większości przypadków nie będzie miało znaczenia z czego skorzystasz, ale tak, _LOB to dobre rozwiązanie.
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.