IP проблемна ф-ция

dakata__92

Super Moderator
Здравейте ! Имам проблем с една функция на локалния ! Искам д азапаметявам в едно поле IP адресите с които се е логвал даден абонат и желая когато фигурира в базата да не се записва отново ! Та на локалния се получава така :

PHP:
function VerifyMemberIp($ip) 
{        
$member_chek =  mysql_query("SELECT * FROM `members` WHERE `ip` LIKE '%{$ip}%' AND user='$user' AND pass='$compare' ")or die(mysql_error());         
return mysql_num_rows($member_chek)? 1 : 0; 
}

$ip = addslashes(htmlspecialchars($_SERVER['REMOTE_ADDR']));


//Проверяваме дали ип-то на абоната фигурира в базата като логвал се с него.
if(VerifyMemberIp($ip) == 1)
{
//Ако фигурира, тук ъпдейтваме без да добавяме ип то в колоната.
$update = mysql_query("UPDATE users SET last_login='$last_login'WHERE user='$user' AND pass='$compare' LIMIT 1")or die(mysql_error());
}
else
{
//Тук ип-то на абоната не фигурира в колоната и го добавям, като запазвам и старото.
$update = mysql_query("UPDATE users SET last_login='$last_login',ip=CONCAT(`ip`,' $ip') WHERE user='$user' AND pass='$compare' LIMIT 1")or die(mysql_error());
				}

В базата се получава така :
::1 ::1 ::1 ::1 ::1 ::1 ::1 ::1 ::1 ::1 ::1 ::1 ::1 ::1 ::1
а от начало ми се струваше, че работи правилно ! Предполагам грешката е в заявката за проверка във функцията, но незнам как да я поправя :

WHERE `ip` LIKE '%{$ip}%'

За повече инфо в тази тема :
http://web-tourist.net/forum/viewtopic.php?t=120669
 
critrate каза:
това мисля ,че ти е от локалхоста. т.е. от твоето ИП
И аз мисля, че е от локалния, но все пак е едно и също ::1 и като сравнява не би трябвало да въвежда пак ::1 и да стане в колоната |::1 ::1|
 
PHP:
function VerifyMemberIp($ip) 
{        
$member_chek =  mysql_query("SELECT * FROM `members` WHERE `ip` LIKE '%{$ip}%' AND user='$user' AND pass='$compare' ")or die(mysql_error());         
return mysql_num_rows($member_chek)? 1 : 0; 
}

Не можеш да използваш променливи във функция без да са глобализирани или да ги пращаш като параметър:

function VerifyMemberIp($ip)
{
global $user, $compare;
$member_chek = mysql_query("SELECT * FROM `members` WHERE `ip` LIKE '%{$ip}%' AND user='$user' AND pass='$compare' ")or die(mysql_error());
return mysql_num_rows($member_chek)? 1 : 0;
}

Маркираното в зелено е правилно, с червено съм маркирал 2те променливи, които използваш без да са глобализирани, а червения ред подчертания е реда който глобализира 2те променливи :)

Така ще ти връща правилен резултат тази ф-я.

а за базата, не е нормално да се записва ип-то така, може би имаш проблем с типа на полето `ip` или дължината на символите, ако е varchar(255) ще запълниш много бързо 255 символа като записваш тези ип-та
 
трябва да влезеш във хост файла и да го настойш това.
C:\Windows\System32\drivers\etc
 
global $user, $compare;
Защо трябва да ги задам като глобални ? Те си имат стойности и си записват където трябва ?
 
Е как защо :D Всяка променлива, която не е декларирана в блока на функция, не може да се използва във функцията, освен ако не я извикаш глобално с global или не я подадеш като параметър.


Пробвай следното нещо:

PHP:
$var = "something";

function test(){
       return $var;
}

echo test();

function test1(){
           global $var;
           return $var;
}

echo "<br />" . test1();
 
user='$user' AND pass='$compare' са подадени като стойности доста над въпростана функция !

PHP:
$user = blabla;
$compare = blabla;

function blabla()
{

//Защо ми е глобална ?
}

Интересува ме ако WHERE `ip` LIKE '%{$ip}%' на тази проверка има стойности в полето :
127.57.02 127.57.18 127.57.20
и аз влезна с ип 127.57.30 трябва да го запише в базата, но ако се логна с 127.57.20 вече фигурира и не трябва да го запише :)
 
Абе, човек, как така защо ти е нужна :D Защото външни променливи не могат да се ползват в блока на функцията, освен ако не ги извикаш с global.
Пробвай примерите, които ти дадох и виж разликата, за да не се повтарям.
Въвеждам те в основите, не искам да правя спор за нещо, при положение, че съм дал примери за тест.


Относно въпроса ти: използвай регулярни изрази в самата заявка или извеждай цялото поле, отделяй IP-тата и ги проверявай с in_array() дали съществуват.
 
То и така ще си работи заявката, няма да има проблем, но е твърда глава и винаги така неуверено гледа на хорта, които се опитват да му помогнат...

Проблема му е, че полето `ip` нещо не е наред и не записва правилни данни, опитай се да го ъпдейтнеш ръчно от phpmyqdmin като си добавиш ръчно няколко ип-адреса, за да видиш дали ще ги запише правилно, ако ги запише правилно значи проблема ти е в кода.

А друг е въпроса, че ф-ята която ползваш за проверка винаги ще ти връща грешен резултат, заради НЕ-дефинираните променливи.
 
1. @dakata какъв тип ти е полето IP в базата данни ?
2. Докато не вкараш по някакъв начин $user и $compare в блока на функцията дали чрез параметри, или чрез global, самата функция няма да ти работи коректно.
3. За какво, аджеба, ескейпваш IP-то ? Просто го валидирай, няма смисъл да го забозяваш с тези глупости.
4. Защо, аджеба, лимитираш UPDATE заявката. Няма смисъл.
 
TryMe каза:
1. @dakata какъв тип ти е полето IP в базата данни ?
2. Докато не вкараш по някакъв начин $user и $compare в блока на функцията дали чрез параметри, или чрез global, самата функция няма да ти работи коректно.
3. За какво, аджеба, ескейпваш IP-то ? Просто го валидирай, няма смисъл да го забозяваш с тези глупости.
4. Защо, аджеба, лимитираш UPDATE заявката. Няма смисъл.

1.VARCHAR(255)
2.Изпълнено
3.Валидиране с регулярен израз ли ?
4.Защото преобразувах един селект и съм забравил да махна лимита

Щом ми връща функцията постоянно резултат заради недефинираните променливи постоянно применава към else {}. Нямам втора проверка If(VerifyMemberIp($ip) == 0) за да се осетя, че там е проблема реално . Ориентирах се по това, че си записва коректно при точния абонат и парола на които съответства :)
 
dakata__92 каза:
TryMe каза:
1. @dakata какъв тип ти е полето IP в базата данни ?
2. Докато не вкараш по някакъв начин $user и $compare в блока на функцията дали чрез параметри, или чрез global, самата функция няма да ти работи коректно.
3. За какво, аджеба, ескейпваш IP-то ? Просто го валидирай, няма смисъл да го забозяваш с тези глупости.
4. Защо, аджеба, лимитираш UPDATE заявката. Няма смисъл.

1.VARCHAR(255)
2.Изпълнено
3.Валидиране с регулярен израз ли ?
4.Защото преобразувах един селект и съм забравил да махна лимита

Щом ми връща функцията постоянно резултат заради недефинираните променливи постоянно применава към else {}. Нямам втора проверка If(VerifyMemberIp($ip) == 0) за да се осетя, че там е проблема реално . Ориентирах се по това, че си записва коректно при точния абонат и парола на които съответства :)

1. Промени го на text. Някой с динамично IP ще му се натрупат IP-та и ще ти се секне varchar-a.
3. Ами да, най-простия начин за мен.
 
1.Готово вече е text
2.Можеш ли да ми дадеш такъв готов шаблон, защото знам, че ип адресите са винаги различни и незнам как да го валидирам правилно :)

if(preg_match("/[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\:[0-9]{1,5}/",$ip_addr))

Този код валидира и порта до колкото виждам, май не е правилно да го ползвам нали ? Иначе са му подадени границите {1,3}
Май ето така ще трябва да е :

if(preg_match("/[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}/",$ip_addr))
 
Може би това

PHP:
^(2[0-5]{2}\.|1?[0-9]{1,2}\.){3}(2[0-5]{2}|1?[0-9]{1,2})$

Невалидни IP-та от рода 111.222.333.444 не ги отчита, но примерно 192.168.1.103 ще го счете за валидно. В рамките от 0.0.0.0 до 255.255.255.255 e.
 
Защо не си направиш отделна таблица за адресите? Примерно:
[sql]Id INT(11),
UserId INT(11),
IpAddr VARCHAR(15)
[/sql]
Ще си спещиш доста главоболия.

А за този адрес: ::1 e IPv6 еквивалента на 127.0.0.1. Пробвай да влезнеш в сайта чрез локалния IPv4 адрес.
 
http://regexr.com?31i6a
Има ли малко по-сигорно филтриране, защото това нещо не матчва всички възможни видове адреси с които може да е абоната .

http://regexr.com?31i6a
 
HerpaMoTeH каза:
Кой адрес не съвпада ? Защото не мога да се сетя за такъв
91.22.523.14
Там където са 3 цифри според регулярния израз трябва да са 2 или 1 за да съвпадне :)
 
dakata__92 каза:
HerpaMoTeH каза:
Кой адрес не съвпада ? Защото не мога да се сетя за такъв
91.22.523.14
Там където са 3 цифри според регулярния израз трябва да са 2 или 1 за да съвпадне :)
Примерът ти е грешен. Валидни биха били адресите в този интервал: 0.0.0.0/255.255.255.255.
 

Back
Горе