• PHP与MYSQL配合完成IP的存取


    如何存储IP

    程序设计要在功能实现的基础上最大限度的优化性能。而数据库设计是程序设计中不可忽略的重要部分,巧存IP地址可以一定程度提升性能。

    利用函数算法处理

    MySQL没有直接提供IP类型字段,但有两个函数可以把IP与最大长度为10位数字类型互转,所以使用int类型存储IP比varchar类型存储IP地址性能要提升很多,更节省存储空间。varchar是可变长类型,需要多余的一个字节长度。另外int型在逻辑运算上要比varchar速度快。

    IP转数字函数inet_aton()

    我们转换下几个常用的IP地址

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    mysql> select inet_aton('255.255.255.255');
    +------------------------------+
    | inet_aton('255.255.255.255') |
    +------------------------------+
    |                   4294967295 |
    +------------------------------+
    1 row in set (0.00 sec)
     
    mysql> select inet_aton('192.168.1.1');   
    +--------------------------+
    | inet_aton('192.168.1.1') |
    +--------------------------+
    |               3232235777 |
    +--------------------------+
    1 row in set (0.00 sec)
     
    mysql> select inet_aton('10.10.10.10');
    +--------------------------+
    | inet_aton('10.10.10.10') |
    +--------------------------+
    |                168430090 |
    +--------------------------+
    1 row in set (0.00 sec)

    所以IP的表字段可以设置为INT(10)就好,如果IP获取不到可以直接存0代表获取不到IP的意思

    数字转IP函数inet_ntoa()

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    mysql> select inet_ntoa(4294967295);
    +-----------------------+
    | inet_ntoa(4294967295) |
    +-----------------------+
    | 255.255.255.255       |
    +-----------------------+
    1 row in set (0.00 sec)
     
    mysql> select inet_ntoa(3232235777);
    +-----------------------+
    | inet_ntoa(3232235777) |
    +-----------------------+
    | 192.168.1.1           |
    +-----------------------+
    1 row in set (0.00 sec)
     
    mysql> select inet_ntoa(168430090);
    +----------------------+
    | inet_ntoa(168430090) |
    +----------------------+
    | 10.10.10.10          |
    +----------------------+
    1 row in set (0.00 sec)
     
    mysql> select inet_ntoa(0);       
    +--------------+
    | inet_ntoa(0) |
    +--------------+
    | 0.0.0.0      |
    +--------------+
    1 row in set (0.00 sec)

    注意,0转换为 0.0.0.0

    *******************华丽分割***********************

    以上为原文内容,实际使用中,换了一台IP地址较大的机器登陆后,发现数据库中竟存入了一个负值...

    环境PHP+MYSQL+32位WIN7

    于是查找原因...此处省略3000字

    结果如下:

      原因:PHP自带的ip2logng('192.168.1.17'),转换IP地址后,其值超出了32位系统INT的取值范围,导致溢出,结果为负

      解决方案:将MYSQL存储IP的字段设置为bigint类型,否则会溢出

           存储IP之前,将ip2long转换过的值处理为2进制,再处理回10进制,示例:bindec(decbin(ip2long('192.168.1.17')));  //3232235793

    至此问题解决,后遗症暂未发现,发现再纠正...

    from:http://www.qttc.net/201208193.html 修正:Faddei

  • 相关阅读:
    Sikulix 多个相似图片的选择
    Sikulix选取相对位置的图片或对象
    Sikulix 实用方法
    两个Excel内容比较
    SIkulix在Eclipse中的使用
    Sikulix IDE简介
    安装Sikulix
    Sikuli简介
    建立连接ALM的xml config文件
    XML序列化成对象
  • 原文地址:https://www.cnblogs.com/feiblog/p/4334518.html
Copyright © 2020-2023  润新知