Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> Zapis adresu IP w bazie danych, Z użyciem PDO
SmokAnalog
post
Post #1





Grupa: Zarejestrowani
Postów: 1 707
Pomógł: 266
Dołączył: 3.07.2012
Skąd: Poznań

Ostrzeżenie: (0%)
-----


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

Ten post edytował SmokAnalog 17.09.2013, 12:19:24
Go to the top of the page
+Quote Post
Damonsson
post
Post #2





Grupa: Zarejestrowani
Postów: 2 355
Pomógł: 533
Dołączył: 15.01.2010
Skąd: Bydgoszcz

Ostrzeżenie: (0%)
-----


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?
Go to the top of the page
+Quote Post
SmokAnalog
post
Post #3





Grupa: Zarejestrowani
Postów: 1 707
Pomógł: 266
Dołączył: 3.07.2012
Skąd: Poznań

Ostrzeżenie: (0%)
-----


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.
Go to the top of the page
+Quote Post
Damonsson
post
Post #4





Grupa: Zarejestrowani
Postów: 2 355
Pomógł: 533
Dołączył: 15.01.2010
Skąd: Bydgoszcz

Ostrzeżenie: (0%)
-----


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
Go to the top of the page
+Quote Post
redeemer
post
Post #5





Grupa: Zarejestrowani
Postów: 915
Pomógł: 210
Dołączył: 8.09.2009
Skąd: Tomaszów Lubelski/Wrocław

Ostrzeżenie: (0%)
-----


@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).


--------------------
Go to the top of the page
+Quote Post
SmokAnalog
post
Post #6





Grupa: Zarejestrowani
Postów: 1 707
Pomógł: 266
Dołączył: 3.07.2012
Skąd: Poznań

Ostrzeżenie: (0%)
-----


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?
Go to the top of the page
+Quote Post
Crozin
post
Post #7





Grupa: Zarejestrowani
Postów: 6 476
Pomógł: 1306
Dołączył: 6.08.2006
Skąd: Kraków

Ostrzeżenie: (0%)
-----


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.
Go to the top of the page
+Quote Post
SmokAnalog
post
Post #8





Grupa: Zarejestrowani
Postów: 1 707
Pomógł: 266
Dołączył: 3.07.2012
Skąd: Poznań

Ostrzeżenie: (0%)
-----


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.

Ten post edytował SmokAnalog 17.09.2013, 13:06:08
Go to the top of the page
+Quote Post
Crozin
post
Post #9





Grupa: Zarejestrowani
Postów: 6 476
Pomógł: 1306
Dołączył: 6.08.2006
Skąd: Kraków

Ostrzeżenie: (0%)
-----


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.
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 21.08.2025 - 01:12