| |
автор: Zebra (18.09.2004 в 23:10) |
|
| | Суть №1
в проекте "PowerCounter 2.1.0 " на вкладке IP-адреса
хочу сделать
IP-адрес |Хост| Всего посещений | Последнее обращение | Провайдер | Город
т.е. добавить Провайдер и Город чтобы знать из какого города происходят запросы.
<tr><td class=headtable><p>IP-адрес</td><td class=headtable><p>Хост</td><td class=headtable><p>Всего<br>посещений</td><td class=headtable><p>Последнее обращение</td><td class=headtable><p>Провайдер</td><td class=headtable><p>Город</td></tr>
|
Есть база (count) в ней есть таблица provaider 8 полей:
prov gorod ip1_1 ip1_2 ip1_3 ip1_4 ip2_1 ip2_2 ip2_3 ip2_4
в prov имя провайдера gorod-город
есть диапазон ip например 127.0.0.0 - 127.0.0.255 тогда :
ip1_1=127
ip1_2=0
ip1_3=0
ip1_4=0
ip2_1=127
ip2_2=0
ip2_3=0
ip2_4=255
заполняется эта таблица на n-ой странице что не столь важно
СУТЬ №2 в том что есть к примеру 2 провайдера со своими диапазонами ip и мне нужно сравнить переменную $ip['ip'] (из файла addresses.php) с этим диапазоном ай-пи.
Саму переменная $ip['ip'] "разбивается на куски" и заносится в массив
<?php
$array = split ("\." $ip['ip']);
?>
|
| |
| |
|
|
| |
|
|
| |
для: Zebra
(18.09.2004 в 23:10)
| | | Что мне всегда в PowerCounter не нравилось, так это то, что IP-адреса хранятся в текстовом формате. Это сложилось исторически, так как помимо самого IP-адреса, необходимо было через / хранить маску подсети, чтобы более полно учитывать хосты. Поэтому в поле ip таблицы ip за здорово живёшь можно встретить значение вроде
213.177.119.238/192.168.3.106, 10.0.0.1
|
Т.е. перед разбиением необходимо проверить налчие слеша, и, если он имеется удалить всё что имеется в строке после него
<?php
$pos = strpos($ip['ip'],"/");
$ip['ip'] = substr($ip['ip'],0,$pos);
?>
|
Так как число кусков разбиения известно заранее, лучше использовать функцию list:
<?php
list($id1, $ip2, $ip3, $ip4) = split ("\." $ip['ip']);
?>
|
Тогда выяснить к какому провайдеру и городу принадлежит IP-адрес можно при помощи кода
<?php
$query = "SELECT prov, gorod
FROM provider
WHERE $id1 > ip1_1 AND
$id1 < ip2_1 AND
$ip2 > ip1_2 AND
$ip2 < ip2_2 AND
$ip3 > ip1_3 AND
$ip3 < ip2_3 AND
$ip4 > ip1_4 AND
$ip4 < ip2_4";
$ipprov = mysql_query($query);
if(!$ipprov) puterror("Ошибка при обращении к таблице провайдеров...");
if(mysql_num_rows($ipprov)>0)
{
$prov = mysql_fetch_array($ipprov);
echo "Провайдер - ".$prov['prov']."<br>";
echo "Город - ".$prov['gorod']."<br>";
}
else
{
echo "Информация отсутсвует";
}
?>
|
PS Вообще по уму следует IP-адреса и в таблице ip перевести в 4хTINYINT формат, тогда можно будет осушествить многотабличный запрос, что в данной ситуации сильно увеличит производительность. | |
| |
|
|
| |
|
|
| |
для: cheops
(19.09.2004 в 11:16)
| | | что то этот код не хочет работать
$pos = strpos($ip['ip'],"/");
$ip['ip'] = substr($ip['ip'],0,$pos);
|
ну а так пара мелких ошибочек которые я нашел и все в принципе то зработало
FROM provider => FROM provaider
split ("\." $ip['ip']); => split ("\." ,$ip['ip']);
кидаю архив кто хочет посматрите на предварительный результат
в папке powercounter21
лежит update_provaider.sql для добавления таблицы provaider
собственно пока все. | |
| |
|
|