2

IP 範囲のデータベースがあり、以下のコードを使用して範囲を個々の IP アドレスに分割しています。これは、210937 レコードに到達するまで正常に機能し、コードは IP 範囲の分割を停止し、0.0.0.0 の挿入を開始します。

いくつかの IP アドレスを削除しようとしましたが、IP アドレスが異なっていても同じポイントで停止します。

 for ($ip = ip2long($ip1); $ip<=ip2long($ip2); $ip++)
 {
 $lip = long2ip($ip);

任意の提案をいただければ幸いです。

わかりましたので、これが完全なコードから db 接続を差し引いたものです。

  $query1 = "SELECT * FROM masteriplist";
  $result = mysql_query($query1);
  while($row = mysql_fetch_array($result))
  { 

   $ipe = $row['ip_end_range'];
   $ips = $row['ip_start_range'];

   $ip1 = "$ips";
   $ip2 = "$ipe";


   for ($ip = ip2long($ip1); $ip<=ip2long($ip2); $ip++)
    {
    $lip = long2ip($ip);


    mysql_query("INSERT INTO ip_master (ip) VALUES ('$lip')") 
    or die(mysql_error()); 

     }
     }

デバッグコードは次を返しました

array(24) { 
  ["id"]=> string(2) "50" 
  ["ip_address"]=> string(12) "85.119.25.27"
  ["ip_start_range"]=> string(0) ""
  ["ip_end_range"]=> string(0) ""
  ...
}
4

1 に答える 1

0

範囲ではなく単一の IP アドレスを処理しているようです。両方を処理するには、次のようにします。

if ($row['ip_start_range'] == '' || $row['ip_end_range'] == '') {
    $ip1 = $ip2 = $row['ip_address'];
} else {
    $ip1 = $row['ip_start_range'];
    $ip2 = $row['ip_end_range'];
}

ip2longまた、呼び出しをループの外に移動することで、より効率的にすることができます。

$start = ip2long($ip1);
$stop = ip2long($ip2);

for ($ip = $start; $ip <= $stop; $ip++) {
  // ...
}
于 2013-04-09T03:08:08.510 に答える