За последние 24 часа нас посетили 17526 программистов и 1723 робота. Сейчас ищет 1651 программист ...

вопрос по IP и БД

Тема в разделе "PHP и базы данных", создана пользователем Mil-ast, 8 июн 2006.

  1. Mil-ast

    Mil-ast Активный пользователь

    С нами с:
    7 июн 2006
    Сообщения:
    6
    Симпатии:
    0
    Какой-то бред получается. Скрипт почему-то вместо того, чтобы записать в БД IP посетителя, он постоянно записывает IP сервера. Хотя $REMOTE_ADDR работает нормально ИП показывает, но с БД проблемы. Почему он записывает ИП сервака??? Где-то мне приходилось слышать, что если не включены глобальные переменные, то $REMOTE_ADDR не фурычит. Так ли это??? Васпче запутался.

    mysql_db_query($db, "INSERT INTO Online VALUES ('$t_stamp','$REMOTE_ADDR','')") or die("INSERT Error");
     
  2. vasa_c

    vasa_c Активный пользователь

    С нами с:
    22 мар 2006
    Сообщения:
    1.760
    Симпатии:
    0
    Адрес:
    гор.Ленинград
    Это так. Используй $_SERVER[ 'REMOTE_ADDR' ];
    Хотя если он ИП показывает нормальный, то это тут не причем.
    А про IP сервака это вообще бред какой-то. Ты в этом уверен?
     
  3. 440Hz

    440Hz Старожил
    Команда форума Модератор

    С нами с:
    21 дек 2012
    Сообщения:
    8.003
    Симпатии:
    1
    Адрес:
    Оттуда
    PHP:
    1. <?
    2. # строка с IP юзера
    3. function OOPSGetIP() {
    4.     global $HTTP_SERVER_VARS;
    5.  
    6.     $IP = $HTTP_SERVER_VARS["REMOTE_ADDR"];
    7.     if(isset($HTTP_SERVER_VARS["HTTP_X_FORWARDED_FOR"])) {
    8.         $IP .= " ".$HTTP_SERVER_VARS["HTTP_X_FORWARDED_FOR"];
    9.     }
    10.  
    11.     $IPS = split("[ ;,]+",$IP);
    12.     $IP = "";
    13.     while(list($i,$VAL) = each($IPS)) $IP .= $VAL.",";
    14.     $IP = substr($IP,0,strlen($IP)-1);
    15.  
    16.     return $IP;
    17. }?>
    для новых PHP подставить нужные масивы
     
  4. 440Hz

    440Hz Старожил
    Команда форума Модератор

    С нами с:
    21 дек 2012
    Сообщения:
    8.003
    Симпатии:
    1
    Адрес:
    Оттуда
    $IP = substr($IP,0,strlen($IP)-1);

    можно

    $IP = trim($IP,',');
     
  5. Mil-ast

    Mil-ast Активный пользователь

    С нами с:
    7 июн 2006
    Сообщения:
    6
    Симпатии:
    0
    Использовал $_SERVER[ 'REMOTE_ADDR' ]; Пробовал на отдельной страничке, мой ип показывает, но вот при добавлении в БД всё-равно вместо ИП посетителя вписывает ИП сервака. В службе поддержке ничего по этому поводу не могут сказать.
     
  6. vasa_c

    vasa_c Активный пользователь

    С нами с:
    22 мар 2006
    Сообщения:
    1.760
    Симпатии:
    0
    Адрес:
    гор.Ленинград
    Mil-ast, а ты проверь на той страничке на которой записывается в БД.
    Выведи REMOTE_ADDR.
    Выведи запрос свой
    Код (Text):
    1. "INSERT INTO Online VALUES ('$t_stamp','$REMOTE_ADDR','')"
    А потом смотри в базу.
    Если в запросе и в базе будут различные ипы, то тогда это уже чудеса.
     
  7. Mil-ast

    Mil-ast Активный пользователь

    С нами с:
    7 июн 2006
    Сообщения:
    6
    Симпатии:
    0
    Пробовал и продолжаю пробовать все известные мне способы. Вот еще.

    if (getenv('HTTP_CLIENT_IP')) {
    $ip = getenv('HTTP_CLIENT_IP');
    }
    elseif (getenv('HTTP_X_FORWARDED_FOR')) {
    $ip = getenv('HTTP_X_FORWARDED_FOR');
    }
    elseif (getenv('HTTP_X_FORWARDED')) {
    $ip = getenv('HTTP_X_FORWARDED');
    }
    elseif (getenv('HTTP_FORWARDED_FOR')) {
    $ip = getenv('HTTP_FORWARDED_FOR');
    }
    elseif (getenv('HTTP_FORWARDED')) {
    $ip = getenv('HTTP_FORWARDED');
    }
    else {
    $ip = $_SERVER['REMOTE_ADDR'];
    }

    mysql_db_query($db, "INSERT INTO Online VALUES ('$t_stamp','$IP','')") or die("INSERT Error");

    echo "<b>$IP</b>";

    Да, выводит он мой ИП, но в БД уперто пихает своё. В общем ИП он определяет верно, но что тогда с БД? Ладно, если сумею разобраться, сообщу!!
     
  8. 440Hz

    440Hz Старожил
    Команда форума Модератор

    С нами с:
    21 дек 2012
    Сообщения:
    8.003
    Симпатии:
    1
    Адрес:
    Оттуда
    это ты туда пихаешь. 8) покажи зпрос?
     
  9. Mil-ast

    Mil-ast Активный пользователь

    С нами с:
    7 июн 2006
    Сообщения:
    6
    Симпатии:
    0
    Всё, я разобрался. Интересно получилось. Но глюк один есть. Скрипт полностью рабочий. Вот он:

    PHP:
    1. <?
    2. include "config.php";
    3.  
    4. $t_stamp = time();
    5. $timeout = $t_stamp - $to_secs;
    6.  
    7. mysql_connect($server, $db_user, $db_pass) or die ("CONNECT Error");
    8. mysql_db_query($db, "INSERT INTO Online VALUES ('$t_stamp','$REMOTE_ADDR','')") or die("INSERT Error");
    9. mysql_db_query($db, "DELETE FROM Online WHERE timestamp<$timeout") or die("DELETE Error");
    10. $result = mysql_db_query($db, "SELECT DISTINCT ip FROM UsersOnline") or die("SELECT Error");
    11. $user = mysql_num_rows($result);
    12. echo "<b>$user</b>";
    13. ?>
    Вся проблема в том, что если запустить файл с этим скриптом, всё работает и записывает в БД нужный IP, однако если вставлять этот файл в другие страницы сайта <? include "etotfile.php";>, то и возникает эта канитель. В этом случае он и вписывает не мой IP, а IP сервака. Почему такое происходит мне до сих пор не понятно.
    У кого есть соображения по этому поводу?
     
  10. Mil-ast

    Mil-ast Активный пользователь

    С нами с:
    7 июн 2006
    Сообщения:
    6
    Симпатии:
    0
    ... во всяком случае у меня так и получается. Для примера можно глянуть на моей страничке
    http://www.hono.ru/s.php - сначала смотреть эту страницу! Здесь этот файл вставлен через include (в самом низу цифра). Здесь он и записывает ИП сервака, а не ваш.
    http://www.hono.ru/online/users.php - а это и есть тот самый исходный файл. Здесь он и запишет ваш IP и покажет цифру на еденицу больше, т.е. тут всё в порядке.