Как поправить 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);
}
?>