2013-11-23 59 views
0

我目前在我的網站上有一個包含所有可能IP地址的目錄。在過去的一年中,它一直在從MySQL數據庫中提取信息,但顯然這是一個龐大的數據庫,可以從中獲取信息。自動生成IP地址表?

我在想,因爲所有的IP地址都在0.0.0.0到255.255.255.255之間,所以應該有一種方法可以在不使用數據庫的情況下自動生成數據庫,並且僅基於該用戶所在的頁面。

每頁顯示1002個IP地址,所以第一頁應該是第1-1002個可能的IP地址,第二個頁面將顯示1003-2004個IP地址。

這裏是我目前使用的網站代碼:

<?php 
    /* 
     Place code to connect to your DB here. 
    */ 

mysql_connect("localhost", "user_name", "password") or die(mysql_error()); 
mysql_select_db("data_base") or die(mysql_error()); 


    $tbl_name="domain_names";  //your table name 
    // How many adjacent pages should be shown on each side? 
    $adjacents = 5; 

    /* 
     First get total number of rows in data table. 
     If you have a WHERE clause in your query, make sure you mirror it here. 
    */ 
    $query = "SELECT COUNT(*) as num FROM $tbl_name"; 
    $total_pages = mysql_fetch_array(mysql_query($query)); 
    $total_pages = $total_pages[num]; 

    /* Setup vars for query. */ 
    $targetpage = "ip.php"; //your file name (the name of this file) 
    $limit = 1002;        //how many items to show per page 
    $page = $_GET['page']; 
    if($page) 
     $start = ($page - 1) * $limit;   //first item to display on this page 
    else 
     $start = 0;        //if no page var is given, set start to 0 

    /* Get data. */ 
    $sql = "SELECT domains FROM $tbl_name LIMIT $start, $limit"; 
    $result = mysql_query($sql); 

    /* Setup page vars for display. */ 
    if ($page == 0) $page = 1;     //if no page var is given, default to 1. 
    $prev = $page - 1;       //previous page is page - 1 
    $next = $page + 1;       //next page is page + 1 
    $lastpage = ceil($total_pages/$limit);  //lastpage is = total pages/items per page, rounded up. 
    $lpm1 = $lastpage - 1;      //last page minus 1 

    /* 
     Now we apply our rules and draw the pagination object. 
     We're actually saving the code to a variable in case we want to draw it more than once. 
    */ 
    $pagination = ""; 
    if($lastpage > 1) 
    { 
     $pagination .= "<div class=\"pagination\">"; 
     //previous button 
     if ($page > 1) 
      $pagination.= "<a href=\"$targetpage?page=$prev\">&lt; previous</a>"; 
     else 
      $pagination.= "<span class=\"disabled\">&lt; previous</span>"; 

     //pages 
     if ($lastpage < 7 + ($adjacents * 2)) //not enough pages to bother breaking it up 
     { 
      for ($counter = 1; $counter <= $lastpage; $counter++) 
      { 
       if ($counter == $page) 
        $pagination.= "<span class=\"current\">$counter</span>"; 
       else 
        $pagination.= "<a href=\"$targetpage?page=$counter\">$counter</a>";     
      } 
     } 
     elseif($lastpage > 5 + ($adjacents * 2)) //enough pages to hide some 
     { 
      //close to beginning; only hide later pages 
      if($page < 1 + ($adjacents * 2))   
      { 
       for ($counter = 1; $counter < 4 + ($adjacents * 2); $counter++) 
       { 
        if ($counter == $page) 
         $pagination.= "<span class=\"current\">$counter</span>"; 
        else 
         $pagination.= "<a href=\"$targetpage?page=$counter\">$counter</a>";     
       } 
       $pagination.= "..."; 
       $pagination.= "<a href=\"$targetpage?page=$lpm1\">$lpm1</a>"; 
       $pagination.= "<a href=\"$targetpage?page=$lastpage\">$lastpage</a>";  
      } 
      //in middle; hide some front and some back 
      elseif($lastpage - ($adjacents * 2) > $page && $page > ($adjacents * 2)) 
      { 
       $pagination.= "<a href=\"$targetpage?page=1\">1</a>"; 
       $pagination.= "<a href=\"$targetpage?page=2\">2</a>"; 
       $pagination.= "..."; 
       for ($counter = $page - $adjacents; $counter <= $page + $adjacents; $counter++) 
       { 
        if ($counter == $page) 
         $pagination.= "<span class=\"current\">$counter</span>"; 
        else 
         $pagination.= "<a href=\"$targetpage?page=$counter\">$counter</a>";     
       } 
       $pagination.= "..."; 
       $pagination.= "<a href=\"$targetpage?page=$lpm1\">$lpm1</a>"; 
       $pagination.= "<a href=\"$targetpage?page=$lastpage\">$lastpage</a>";  
      } 
      //close to end; only hide early pages 
      else 
      { 
       $pagination.= "<a href=\"$targetpage?page=1\">1</a>"; 
       $pagination.= "<a href=\"$targetpage?page=2\">2</a>"; 
       $pagination.= "..."; 
       for ($counter = $lastpage - (2 + ($adjacents * 2)); $counter <= $lastpage; $counter++) 
       { 
        if ($counter == $page) 
         $pagination.= "<span class=\"current\">$counter</span>"; 
        else 
         $pagination.= "<a href=\"$targetpage?page=$counter\">$counter</a>";     
       } 
      } 
     } 

     //next button 
     if ($page < $counter - 1) 
      $pagination.= "<a href=\"$targetpage?page=$next\">next &gt;</a>"; 
     else 
      $pagination.= "<span class=\"disabled\">next &gt;</span>"; 
     $pagination.= "</div>\n";  
    } 
?> 

    <?php 
$i = 0; 
echo '<table style="table-layout:fixed; width:95%;"><tr>'; 
     while($row = mysql_fetch_array($result)) 
{ 
    $i ++; 
    if ($i<=3) 
    { 
     echo '<td style="word-wrap: break-word;"> 
     <div><center><a style="text-decoration:none;color:#489FDC;" href="http://ip.mysite.com/'.strtolower($row[domains]).'">'.strtolower($row[domains]).'</a></center></div> 
     </td>'; 
    } 

    else 
    {  
     echo '</tr><tr>'; 
     echo '<td style="word-wrap: break-word;"><div><center><a style="text-decoration:none;color:#489FDC;" href="http://ip.mysite.com/'.strtolower($row[domains]).'">'.strtolower($row[domains]).'</a></center></div></td>'; 
     $i = 0; 
    $i++; 
    } 
} 
echo '</tr></table><br />'; 
    ?> 

<?=$pagination?> 

是什麼,我想可能這樣做,是有一個簡單的方法,有人能想到這樣做呢?它看起來應該像刪除任何與數據庫相關的代碼一樣簡單,然後根據某個人所在的頁面將數字基於...

任何與此有關的幫助將非常感謝。

+0

您使用的[過時的API(http://php.net/manual/en/mysqlinfo.api.choosing.php),並使用字符串互操作構建查詢,這是[風險]( http://stackoverflow.com/questions/60174/how-can-i-prevent-sql-injection-in-php?rq=1)。 – Dan

+0

我認爲如果你需要顯示ipv4地址的頁面,那麼把所有的地址存儲在數據庫表中並不是最理想的,只需要在php中計算你想要顯示的每頁地址的數量並顯示它們。然後,如果您保留地址或將它們與某些信息存儲關聯起來,那麼這些地址只與那些存儲或與某些信息相關聯的信息相關聯,並且可以在您的php代碼中容納此邏輯。例如,從數據庫中查詢您在特定頁面上顯示的地址範圍內的持久地址,並顯示額外信息。 – melc

回答

1

IPv4地址實際上只是32位整數。您可以使用整數並使用long2ip將它們轉換爲'ip格式'。

您以編號([pagenumber] * [pagesize])開始頁面,迭代[pagesize]數字並使用long2ip打印它們。

可能的缺陷: 在64位系統上應該沒問題 - 在32位系統上,您必須處理「負數」。 根據您的使用情況,請考慮並非所有可能的地址實際上都可能是合法的。有所謂的私人範圍(無路由),組播等。

0

沿着這些線路的東西會使這更容易。

$perPage = 1002; 

$i = ($page - 1) * $perPage; 
$end = $page * $perPage; 


while($i < $end) { 

    $dotIP = long2ip((float)$i); 

    // Do something with $dotIP; 
}