Как поправить Notice: Undefined variable?

Подскажите как поправить ошибку?

Notice: Undefined variable: u_id in /var/www/www-root/data/www/ad-click.ru/inc/top.php on line 32

Именно в этой строке:

mysqli_query($connect_db, "INSERT INTO t_online (uid,ip,last) VALUES ('".$u_id."','".$ip."','".$time."')"); }
<?php
include('conf.php');
ini_set('session.use_cookies', 'On');
ini_set('session.use_trans_sid', 'Off');
session_set_cookie_params(604800000, "/", SITE, false, false);
session_start();
if(!empty($_SESSION['uid']) && !empty($_SESSION['login']) && !empty($_SESSION['pass'])) {
    define('USER_LOGGED',true);
    if(!isset($u_id)){
        $u_id = 'Varaible age is not set';
    }
    $u_id=intval($_SESSION['uid']);
    $u_login=mysqli_real_escape_string($connect_db, $_SESSION['login']);
} else {
    define('USER_LOGGED',false);
}
if(getenv('HTTP_CLIENT_IP') && strcasecmp(getenv('HTTP_CLIENT_IP'),'unknown'))
    $ip=getenv('HTTP_CLIENT_IP');
elseif(getenv('HTTP_X_FORWARDED_FOR') && strcasecmp(getenv('HTTP_X_FORWARDED_FOR'), 'unknown'))
    $ip=getenv('HTTP_X_FORWARDED_FOR');
elseif(getenv('REMOTE_ADDR') && strcasecmp(getenv("REMOTE_ADDR"), 'unknown'))
    $ip=getenv('REMOTE_ADDR');
elseif(!empty($_SERVER['REMOTE_ADDR']) && strcasecmp($_SERVER['REMOTE_ADDR'], 'unknown'))
    $ip=$_SERVER['REMOTE_ADDR'];
else{
    $ip='unknown';
}
if($ip!='unknown'){
    $ip=preg_replace("#[^0-9]+#i",'',$ip);
    $time=time();
    $past=time()-600;
    $result=mysqli_query($connect_db, "SELECT last FROM t_online WHERE ip='".$ip."'");
    if(mysqli_num_rows($result)!=0){
        mysqli_query($connect_db, "UPDATE t_online SET last='".$time."', uid='".$u_id."' WHERE ip='".$ip."' LIMIT 1"); 
    }else{
        mysqli_query($connect_db, "INSERT INTO t_online (uid,ip,last) VALUES ('".$u_id."','".$ip."','".$time."')");
    }
    if(substr($time,9,1)==0){
        mysqli_query($connect_db, 'DELETE FROM t_online WHERE last<'.$past);
    }
}
?>

Ответы (1 шт):

Автор решения: Solt

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

<?php
include('conf.php');
ini_set('session.use_cookies', 'On');
ini_set('session.use_trans_sid', 'Off');
session_set_cookie_params(604800000, "/", SITE, false, false);
session_start();

if(!empty($_SESSION['uid'] && !empty($_SESSION['login']) && !empty($_SESSION['pass'])){
    define('USER_LOGGED',true);
    //Тут что-то странное. Во-первых $u_id раньше не инициализирована,
    //а во-вторых следом сразу переопределяется. Так что это убираем
    //if(!isset($u_id)){$u_id = 'Varaible age is not set';}
    $u_id=intval($_SESSION['uid']);
    $u_login=mysqli_real_escape_string($connect_db, $_SESSION['login']);
} else {
    define('USER_LOGGED',false);
    //А вот тут надо чем-то переменную инициализировать.
    //Я не знаю правил формирования ID, так что сами впишите что надо.
    $u_id= 0;
}

//Не думаю, что используется какая-то экзотическая среда, 
//где все переменные выставляются в значение 'unknown'.
//Если их нет - их просто нет.
//Кроме того, все эти переменные есть в $_SERVER, так зачем из окружения их доставать?
$ip=$_SERVER['HTTP_CLIENT_IP'] ?? $_SERVER['HTTP_X_FORWARDED_FOR'] ?? $_SERVER['REMOTE_ADDR'];

//Если ваш скрипт выполняется из среды веб-сервера (апач, нгинкс),
//То это условие в принципе не нужно, ибо REMOTE_ADDR есть всегда.
if($ip){
    $ip=preg_replace("#[^0-9]+#i",'',$ip);
    $time=time();
    
    //Если записей 100500, а надо проверить только наличие,
    //добавьте LIMIT, чтобы не грузить БД
    $result=mysqli_query($connect_db, "SELECT last FROM t_online WHERE ip='".$ip."' LIMIT 1");
    if(mysqli_num_rows($result)!=0){
        mysqli_query($connect_db, "UPDATE t_online SET last='".$time."', uid='".$u_id."' WHERE ip='".$ip."' LIMIT 1"); 
    }else{
        mysqli_query($connect_db, "INSERT INTO t_online (uid,ip,last) VALUES ('".$u_id."','".$ip."','".$time."')");
    }
}

//А это что за загадочное действие? Попытка рэндомно подчищать БД?
//Во-первых числовые операции быстрее и лучше тогда $time % 10==0
//А во-вторых вероятность попадать в эти числа может оказаться слишком маленькой
//я бы сделал с random
//и, думаю, оно не должно быть внутри проверки $ip
$past=time()-600;
if(rand(0,9)==0){ //Вероятность можно варьировать вторым числом
    mysqli_query($connect_db, 'DELETE FROM t_online WHERE last<'.$past);
}

?>

→ Ссылка