Witam wszystkich bardzo serdecznie.
Mam tabele, która przechowuje informacje o komputerach, która wygląda mniej więcej tak:

  1. CREATE TABLE komputery (
  2. id int(10) NOT NULL AUTO_INCREMENT,
  3. nazwa varchar(20) COLLATE utf8_polish_ci NOT NULL,
  4. lokalizacja varchar(20) COLLATE utf8_polish_ci NOT NULL,
  5. adres_ip int(16) UNSIGNED NOT NULL,
  6. ...
  7. PRIMARY KEY (id),
  8. UNIQUE KEY nazwa (nazwa),
  9. UNIQUE KEY adres_ip (adres_ip)
  10. ) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_polish_ci AUTO_INCREMENT=1 ;


oraz tabele określająca sieci IP:

  1. CREATE TABLE sieci (
  2. id int(10) NOT NULL AUTO_INCREMENT,
  3. nazwa varchar(20) COLLATE utf8_polish_ci NOT NULL,
  4. adres_ip int(16) UNSIGNED NOT NULL,
  5. maska varchar(20) COLLATE utf8_polish_ci NOT NULL,
  6. brama varchar(20) COLLATE utf8_polish_ci NOT NULL,
  7. ...
  8. PRIMARY KEY (id),
  9. UNIQUE KEY adres_ip (adres_ip),
  10. UNIQUE KEY nazwa (nazwa)
  11. ) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_polish_ci AUTO_INCREMENT=1 ;


I teraz chcę wyświetlić cały zakres adresów IP z podanej sieci na podstawie adresu IP sieci oraz maski tej sieci a w miedzy czasie chcę odpytać tabele komputery czy tam znajduje się adres IP z tej sieci, jeśli tak to zamiast adresu IP ma się wyświetlić nazwa komputera. Schemat poglądowy:

tabela komputery:
nazwa=komp
ip=192.168.1.3
nazwa=komp1
ip=192.168.1.5

tabela sieci
IP=192.168.1.0
maska 255.255.255.0

wynik:
192.168.1.0
192.168.1.1
192.168.1.2
komp
192.168.1.4
komp1
...
192.168.1.255

Napisałem coś takiego
  1. <?php
  2. $sql1='select adres_ip,maska from sieci where id="'.$_GET['id'].'"';
  3.  
  4. $maska=maska_prefix($zaw1[1]);
  5. $do=$zaw1[0]+pow(2,32-$maska);
  6.  
  7. for ($i=$zaw1[0]; $i<$do; $i++){
  8.  $sql2='select count(adres_ip) from komputery where adres_ip="'.$i.'"';
  9.  $zaw2=mysql_fetch_row(mysql_query($sql2));
  10.  if($zaw2[0]!=0){
  11.      $sql3='select id, nazwa from komputery where adres_ip="'.$i.'"';
  12.      $zaw3=mysql_fetch_row(mysql_query($sql3));
  13.      echo '<a href="#?id='.$zaw3[0].'">'.$zaw3[1].'</a>';
  14.      echo '<br />';
  15.   } else{
  16.      echo '<a href="#">'.long2ip($i).'</a>';
  17.      echo '<br />';
  18.      }
  19. }
  20. ?>


funkcja maska_prefix zamienia adres z postaci A.B.C.D do postaci prefixowej np: 255.255.255.0 to 24
I teraz mam pytanie do Was drodzy forumowicze czy da się jakoś uprościć (zmniejszyć liczbę zapytań) ten zapis? Przy małej liczbie adresów w sieci jest jeszcze ok ale jak już pojawi się maska np: 255.0.0.0 to zwis na dłuższy czas. Za zainteresowanie z góry wielkie dzięki.
Pozdrawiam.