Возникла проблема с хранением IP-адреса в таблице базы данных MySQL. - PullRequest
0 голосов
/ 30 августа 2011

Получение IP-адреса пользователей с помощью этого куска кода.У меня есть неподписанное поле int для ip в моей таблице базы данных

   <?php
    if (!empty($_SERVER['HTTP_CLIENT_IP'])){
      $ip=$_SERVER['HTTP_CLIENT_IP'];
    //proxy check
    }elseif (!empty($_SERVER['HTTP_X_FORWARDED_FOR'])){
      $ip=$_SERVER['HTTP_X_FORWARDED_FOR'];
    }else{
      $ip=$_SERVER['REMOTE_ADDR'];
    }
    $ip = ip2long($ip);
    ?>

Тестирование веб-сайта на локальном сервере.Проблема в том, что после конвертации в ip2long вы получаете 63177408abbad957ed13ae1a2dd3e0b3ed47bd0b48ffcb362.Пробовал

    $ip=$_SERVER['REMOTE_ADDR'];
    $ip = ip2long($ip);

тоже.Все еще безуспешно.Как я могу это исправить?

1 Ответ

5 голосов
/ 30 августа 2011

Скорее всего, вы используете 32-битную версию PHP, которая портит IP-адрес. Попробуйте выполнить преобразование внутри mysql, в котором проблема не возникает:

$ip = mysql_real_escape_string('127.0.0.1');
$sql = "INSERT INTO yourtable (ip) VALUES (INET_ATON('$ip'));";

Другая альтернатива состоит в том, чтобы заставить PHP обрабатывать его как целое число без знака, как указано в примечаниях на справочной странице ip2long : $ip = sprintf('%u', ip2long($ip));

Также помните, что IPv6 будет широко распространен "в любой день", и вам нужно будет использовать 128-битное целое число для хранения этих значений (которые MySQL не поддерживает - это должны быть две 64-битные сигнатуры в как минимум).

...