"Как преобразовать IP в число integer и обратно?" (комментарии)

Prolix

Новичок
"Как преобразовать IP в число integer и обратно?" (комментарии)

Почитал тут материал на php.spb.ru "Как преобразовать IP в число integer и обратно?", в общем, работает он вовсе не на ура. Если преобразованный IP окажется больше чем число 2 147 483 648, то соответственно в базу, если в ней поле IP прописано как integer, запишется только это максимальное значение.

Цитата:
"В PHP 4 есть встроенные функции ip2long (аналог моей ip2int) и logn2ip, но они почему-то глючат (переводят ИП в отрицательные числа)!"

Я не совсем понял, почему они глючат - отрицательное число не есть показатель глюкавости. Просто диапазон другой. В этом случае с числами, большими 2 147 483 648, проблем как раз-таки не возникнет - большое число примет отрицательное значение.

В общем итоге, ИМХО, рекомендую для этих целей использовать как раз таки ip2long и наоборот.
 

tony2001

TeaM PHPClub
>отрицательное число не есть показатель глюкавости. Просто диапазон >другой. В этом случае с числами, большими 2 147 483 648, проблем как раз->таки не возникнет - большое число примет отрицательное значение.

очень оригинально, конечно.

я тут как раз долбался с ip2long, long2ip (поиск по форуму - мы тут обсуждали это), так вот они именно глючат!

обьясню почему я так считаю:

для чего нужны эти функции? - в основном для хранения IP в базе.
а ты пробовал забить в LONGINT отрицательное число?
получилось?
а назад пробовал конвертнуть из отрицательного?
получилось?

У МЕНЯ НЕТ!!!

поэтому пришлось взять пример с php.spb.ru.
не знаю, чем он вам обоим так не нравится (а слабо свой написать?!), но мне он очень помог.

не надо умничать на словах! покажите это на деле, приведите РАБОЧИЙ пример, выложите его на общий доступ, как это сделал DiMA, наконец.

to smalex:
>есть всё таки умные люди на этом форуме... ;)
а ты думал, что ты один? боюсь, что ты жестоко ошибался....


З.Ы. не считаю свое мнение истиной в последней инстанции - если сможешь, обьясни в чем я ошибался, когда получил отрицательное число как результат ip2long и long2ip его не поняло.
 

tony2001

TeaM PHPClub
>То что у тебя что-то не получилось это целиком твои проблемы..
..........
>и опять получаются отрицательные числа, ну уж простите

гениально!
просто прекрасно!
а теперь расскажи, зачем ты функции свои писал, если есть "библиотечные" ?

и попути обьясни почему в виндозовском калькуляторе мне один вариант выдает, на РНР 4.0RC1 под Линухом - второй, на PHP 4.04 от Антонио под Вин32 - третий.
 

tony2001

TeaM PHPClub
>И какая тебе разница положительное это число или отрицательное,
>если оно ip -> int -> ip преобразовывается без ошибок?
понимаешь, я тебе у же двух мессаджах написал, но ты так суть и не понял...
попробую еще раз:

1.РЕЗУЛЬТАТ ip2long НЕ ПОНИМАЕТСЯ long2ip.
2.РЕЗУЛЬТАТ ip2long НЕЛЬЗЯ ХРАНИТЬ В БАЗЕ, ПОТОМУ ЧТО ОН - ОТРИЦАТЕЛЬНЫЙ.

СПРАШИВАЕТСЯ ГДЕ ГЛЮК, ЕСЛИ Я ИСПОЛЬЗУЮ *библиотечные функции* ?

так понятней?

Кстати:
>конечно легче всё свалить на глюки в языках программирования
.............
>потому был глюк, его исправили.
=))))))))) но проблемы это не отменяет - у меня под Вин32 не RC1 стоит.


>мне хватает php с php.net, не понимаю чем он хуже чем от Антонио.
Под Вин32 глючит. в некоторых местах. если надо, могу рассказать в каких.
 

Prolix

Новичок
Н-да...

Я тут немножко отвечу...

TONY2001
>>>для чего нужны эти функции? - в основном для хранения IP в >>>базе.
Солидарен

>>> а ты пробовал забить в LONGINT отрицательное число?
>>>не то чтобы в longint, а даже в int (если имеется в виду БД)
>>>получилось?
ДА

>>>а назад пробовал конвертнуть из отрицательного?
>>>получилось?
Именно так

>>>поэтому пришлось взять пример с php.spb.ru.
>>>не знаю, чем он вам обоим так не нравится, но мне он очень >>>помог.

пример прежде всего не нравится - да не то что не нравится, просто некорректно работает - именно потому, что, как верно уточнил smalex, "нельзя хранить число длинной 32 бита используя только 31." Создается такое ощущение, будто вы использовали эти функции, и вам не разу не попался "неверный" IP, ну так просто подставьте значение 255.255.255.255 вручную и посмотрите, что будет.
 

tony2001

TeaM PHPClub
ты хранишь в базе отрицательные значения?

а если не отрицательные, то как ты их получаешь?

кстати, я изначально допускал, что проблема в РНР, но тут мне некоторые сказали, что пенять на ошибки в языках программирования нехорошо...

еще вопрос:
>The function ip2long() generates an IPv4 Internet network address from its >Internet standard format (dotted string) representation. Example 1. Ip2long() >Example

><?
>$ip = gethostbyname("www.php.net");
>$out = "The following URLs are equivalent:<br>\n";
>$out .= "http://www.php.net/, http://".$ip."/, and http://".ip2long($ip)."/<br>\n";
>echo $out;
>?>

Может ли быть "IPv4 Internet network address" отрицательным ?
 

Prolix

Новичок
"1.РЕЗУЛЬТАТ ip2long НЕ ПОНИМАЕТСЯ long2ip."

ДА ЧТО ВЫ, наоборот - прекрасно все работает!

"2.РЕЗУЛЬТАТ ip2long НЕЛЬЗЯ ХРАНИТЬ В БАЗЕ, ПОТОМУ ЧТО ОН - ОТРИЦАТЕЛЬНЫЙ."

Я вам могу сделать dump базы, в поле int которой хранятся эти отрицательные значения, и все работает замечательно. Access, к сожалению, дать не могу :D

"Под Вин32 глючит. в некоторых местах. если надо, могу рассказать в каких."

А Вин32 вообще не для этих целей создан. Там не токмо PHP глючит.
 

tony2001

TeaM PHPClub
>"1.РЕЗУЛЬТАТ ip2long НЕ ПОНИМАЕТСЯ long2ip."
>ДА ЧТО ВЫ, наоборот - прекрасно все работает!

у меня - нет.

повторюсь:

>кстати, я изначально допускал, что проблема в РНР, но тут мне некоторые >сказали, что пенять на ошибки в языках программирования нехорошо...
 

tony2001

TeaM PHPClub
да нет, я не обижаюсь =)
но меня ввел в заблуждение не кто-нибудь, а манул.

ладно, будем конвертить ручками, если так не работает =)
 

si

Administrator
create table test(
id int
);

insert into test values(-1),(-2),(-3),(-4),(-5);

select * from test;
 

DiMA

php.spb.ru
Команда форума
Отвечать тормозу, бред которого я успел начитаться в http://phptalk.unet.ru/p/read.php?f=1&i=15629&t=15629&v=f , думаю смысла нет. Тут тоже высказывались в основном бредовые мысли. Далее, смелая мысля на счет того, а не пробовал ли я проверить функцию на разных числах? Пробовал. Писал тест, в цикле герерируется строка ИП-адреса и преобразовывается туда и обратно, затем результат сравнивается. Другим людям, видимо, мысля тестировать свой брейд перед выдачай в форум, не приходила. Что ж, бывает. Думаю, следующие дебаты с наездом состоятся тогда, когда очередной .. :) .. додумается хранить ИП не в виде чисел, а побайтно в колонке типа char ;-) , типа посмотрите на мою гениальную идею.
 

tony2001

TeaM PHPClub
ОБЬЯСНЯЮ ПРИЧИНУ ПОЧЕМУ Я СЧИТАЮ, ЧТО ЭТИ ФУНКЦИИ ГЛЮЧАТ:
цитата из мануала:
__________________________________________________
>The function ip2long() generates an IPv4 Internet network address from its
>Internet standard format (dotted string) representation. Example 1. Ip2long()
>Example
><?
>$ip = gethostbyname("www.php.net");
>$out = "The following URLs are equivalent:<br>\n";
>$out .= "http://www.php.net/, http://".$ip."/, and http://".ip2long($ip)."/<br>\n";
>echo $out;
>?>
__________________________________________________

Я могу ошибаться (это вообще людям свойственно =)), но НЕ МОГУ ПОНЯТЬ:
1. как может быть IP-адрес отрицательным? (The following URLs are equivalent!)
2. почему эти функции у меня не работают? Отрицательный результат функции ip2long НЕ воспринимается long2ip - пишет 127.0.0.0. Если я подсовываю ей результат обработки руками - все ок.

у меня версия 4.0.4 от Антонио под Вин32.
на сервере стоит под Линухом 4.0RC1 (с ней, похоже разобрались - глюк)


С уважением,
tony2001
 
Сверху