Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [mysql]explode
Forum PHP.pl > Forum > Bazy danych > MySQL
sazian
Witam,
potrzebuje uzyskać coś takiego ale po stronie sql'a
  1. list($o1,$o2,$o3,$o4)=explode('.',$ip);

ma to wyciągnąć kolejne oktety z adresu IP i zapisać je do zmiennych
macie jakieś pomysły jak to zrobić questionmark.gif oczywiście niekoniecznie jedną instrukcją wink.gif
trafas
Witam,

Można to ogarnąć jednym zapytaniem.

Poniższe zapytanie zczytuje miejsca kropek w podanym adresie:

  1. SELECT
  2. LOCATE('.',adresIP) AS 'Index pierwszej kropki',
  3. LOCATE('.',adresIP,LOCATE('.',adresIP)+1) AS 'Index drugiej kropki',
  4. LOCATE('.',adresIP,LOCATE('.',adresIP,LOCATE('.',adresIP)+1)+1) AS 'Index trzeciej kropki'
  5. FROM adresy -- lub po prostu ze zmiennej adresyIP



A teraz wyciągasz sobie odpowiednio:

1. LEFT - pierwsza część adresu - od początku podanego ciągu do wystąpienia pierwszej kropki minus 1 znak ( czyli kropka )

2. MID - druga część adresu
- od wystąpienia pierszej kropki plus 1 znak ( pierwsza kropka )
- czytasz zadaną ilość znaków, obliczaną na podstawie
# miejsce wystąpienia drugiej kropki minus miejsce wystąpienia pierwszej kropki minus 1 znak ( czyli druga kropka )

3. MID - trzecia część adresu
- od wystąpienia drugiej kropki plus 1 znak ( druga kropka )
- czytasz zadaną ilość znaków, obliczaną na podstawie
# miejsce wystąpienia trzeciej kropki minus miejsce wystąpienia drugiej kropki minus 1 znak ( czyli trzecia kropka )

4. RIGHT - czwarta część adresu
- czytasz z prawej strony zadaną ilość znaków obliczaną na podstawie
# długość całego adresu minus ilość znaków występująca do trzeciej kropki włącznie


Przykład:

  1. SELECT
  2.  
  3. LOCATE('.',adresIP) AS 'Index pierwszej kropki',
  4.  
  5. LEFT(adresIP,LOCATE('.',adresIP)-1) AS 'Pierwsza część adresu',
  6.  
  7. LOCATE('.',adresIP,LOCATE('.',adresIP)+1) AS 'Index drugiej kropki',
  8.  
  9. MID(
  10. adresIP,
  11. LOCATE('.',adresIP)+1,
  12. LOCATE('.',adresIP,LOCATE('.',adresIP)+1)-LOCATE('.',adresIP)-1
  13. ) AS 'Druga część adresu',
  14.  
  15. LOCATE('.',adresIP,LOCATE('.',adresIP,LOCATE('.',adresIP)+1)+1) AS 'Index trzeciej kropki',
  16.  
  17. MID(
  18. adresIP,
  19. LOCATE('.',adresIP,LOCATE('.',adresIP)+1)+1,
  20. LOCATE('.',adresIP,LOCATE('.',adresIP,LOCATE('.',adresIP)+1)+1)-LOCATE('.',adresIP,LOCATE('.',adresIP)+1)-1
  21. ) AS 'Trzecia część adresu',
  22.  
  23. RIGHT(adresIP,CHAR_LENGTH(adresIP)-(LOCATE('.',adresIP,LOCATE('.',adresIP,LOCATE('.',adresIP)+1)+1))) AS 'Czwarta część adresu'
  24.  
  25. FROM adresy -- lub po prostu ze zmiennej adresyIP


Pozdrawiam
Crozin
1. Adresu IPv4 nie przechowuje się jako tekstu! To zwykła liczba całkowita i trzymaj ją w takiej właśnie postaci.
2. Adres IPv4 za niedługo zostanie zastąpiony adresem IPv6, który to może reprezentować adres starszego protokołu - więc to właśnie w nim powinieneś zapisywać adres użytkownika.
3. Dla IPv4:
  1. SELECT
  2. ip,
  3. @ip := INET_ATON(ip) AS numeric_ip,
  4. (@ip & 0xFF000000) >> 24 AS ip_1,
  5. (@ip & 0xFF0000) >> 16 AS ip_2,
  6. (@ip & 0xFF00) >> 8 AS ip_3,
  7. (@ip & 0xFF) AS ip_4
  8. FROM tbl_name;
Kod
+---------------+------------+------+------+------+------+
| ip            | numeric_ip | ip_1 | ip_2 | ip_3 | ip_4 |
+---------------+------------+------+------+------+------+
| 124.15.45.99  | 2081369443 |  124 |   15 |   45 |   99 |
| 211.119.54.44 | 3547805228 |  211 |  119 |   54 |   44 |
+---------------+------------+------+------+------+------+
2 rows in set (0.00 sec)
sazian
wiem że adres IP przechowuje się w postaci liczbowej i tak przechowuje wink.gif
tylko problem polegał na tym że wiedziałem jak zamienić liczbę na IP a nie nie wiedziałem jak to zrobić w drugą stronę wink.gif
Dopler
mam podobny problem tylko z ciągiem znaków
czy da się za pomocą tej funkcji wyciąg część

mój rekord ma pole np.

źródło nad. Jerzy Abecadłowski, za akta metrykalne

chodzi mi o wycięcie samego "Jerzy Abecadłowski"

czyli jest cięcie na trzy, pierwszą "kropką" jest "nad. "
a drugą najbliższy przecinek
zarówno przed jak i po mogą się pojawić różne ciągi, łącznie z kropkami i przecinkami, lub puste (czyli może być samo "nad. Jerzy Abecadłowski")

próbowałem to zrobić ale mi sieczka wychodzi

zrobiłem tak
  1. SELECT zrodlo,
  2. SUBSTRING(zrodlo,
  3. LOCATE('nad. ',zrodlo)+5,
  4. LOCATE(', ',
  5. SUBSTRING(zrodlo,
  6. LOCATE('nad. ',zrodlo)+6,
  7. CHAR_LENGTH(zrodlo)-LOCATE('nad. ',zrodlo))))


ale dalej mam dwa problemy
* - do frazy z 2 LOCATE ', ' chcę dodać inne możliwości - ale gdy wpisuje OR to wychodził błąd, lub jakieś dziwne wyniki
* rekordy które kończą się pusto (nie mają prawej strony) nie wyświetlają się - np. samo "nad. Jerzy Abecadłowski" i tego nie wiem jak zrobić.
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.