我有一个任务,用户将输入网络地址(即192.168.1.0)和子网掩码/ cidr(255.255.255.0或/ 24),脚本将显示网关(第一个可用的IP),然后是HTML下拉框将包含该范围内的所有可用IP。然后,这将输入到跟踪所有已使用/不可用IP地址的SQL数据库。
用户输入ip / subnet的第一页非常基本
<form method='POST' action='iprange.php'>
Network Address<br /><input type='text' name='netaddress' value=''><br />
Subnet Mask<br />
<select name='subnet'>
<option value='24'>255.255.255.0 or /24</option>
<option value='24'>255.255.255.128 or /25</option>
<option value='24'>255.255.255.192 or /26</option>
<option value='24'>255.255.255.224 or /27</option>
</select>
<input type='submit' value='Submit'>
</form>
目前还有另一个我发现的脚本,开始执行此操作,如下所示:
<?php
function getIpRange( $cidr) {
list($ip, $mask) = explode('/', $cidr);
$netaddress = $_POST["netaddress"];
$subnet = $_POST["subnet"];
$maskBinStr =str_repeat("1", $mask ) . str_repeat("0", 32-$mask ); //net mask binary string
$inverseMaskBinStr = str_repeat("0", $mask ) . str_repeat("1", 32-$mask ); //inverse mask
$ipLong = ip2long( $ip );
$ipMaskLong = bindec( $maskBinStr );
$inverseIpMaskLong = bindec( $inverseMaskBinStr );
$netWork = $ipLong & $ipMaskLong;
$start = $netWork+2;//ignore network ID and Gateway(eg: 192.168.1.0)
$end = ($netWork | $inverseIpMaskLong) -1 ; //ignore brocast IP(eg: 192.168.1.255)
return array('firstIP' => $start, 'lastIP' => $end );
}
function getEachIpInRange ( $cidr) {
$ips = array();
$range = getIpRange($cidr);
for ($ip = $range['firstIP']; $ip <= $range['lastIP']; $ip++) {
$ips[] = long2ip($ip);
}
return $ips;
}
$cidr = $netaddress'/'$subnet; // max. 30 ips
print_r(getEachIpInRange ( $cidr));
/* output:
Array
(
[0] => 172.16.0.1
[1] => 172.16.0.2
[2] => 172.16.0.3
...
[27] => 172.16.0.28
[28] => 172.16.0.29
[29] => 172.16.0.30
)
*/
我不需要帮助将其放入SQL数据库,但是将一个IP显示为网关,然后将其余的IP放入下拉框中,这就是我遇到问题的地方。我使用过这段代码,似乎无法让它做我需要的事情。我已经使用PHP / HTML一段时间了,但不是在这个级别。
我对此代码中的任何代码都不太满意,但目前我处于亏损状态。感谢您对此提供任何帮助。
答案 0 :(得分:1)
我不确定你是否必须使用ajax。对于下拉列表,您可以执行以下操作:
Var1 = as.numeric(match(Var1, c(LETTERS, 2:8)))