2011-11-09 4 views
0

나는 내 웹 사이트에 폴링 시스템을 설치했다. 그러나 사람들이 다시 투표 할 수 없도록하기 위해, 나는 그들의 IP를 수집하고 그들이 다시 투표하지 않도록하는 메커니즘을 찾는 IP를 가지고 있습니다.PHP - strpos와 문자열 비교

내가하는 방식은 IP를 수집 한 다음 IP가있는 텍스트 파일과 비교하는 것입니다. 각 IP를 구분하는 쉼표가 있습니다.

function getUserIP() 
{ 
//check ip from share internet 
if (!empty($_SERVER['HTTP_CLIENT_IP'])) 
{ 
    $ip=$_SERVER['HTTP_CLIENT_IP']; 
} 
//to check ip is pass from proxy 
elseif (!empty($_SERVER['HTTP_X_FORWARDED_FOR'])) 
{ 
    $ip=$_SERVER['HTTP_X_FORWARDED_FOR']; 
} 
else 
{ 
    $ip=$_SERVER['REMOTE_ADDR']; 
} 
return $ip; 
} 

$visitorIp = getUserIP(); 
$myFile = "ip_polllist.txt"; 
$fh = fopen($myFile, 'r'); 
$theData = fread($fh, 200); 
fclose($fh); 
$findme = $visitorIp.","; 
$mystring = $theData; 
echo $mystring; 
echo $findme; 
$pos = strpos($mystring, $findme); 
if($pos === true) 
{ 
    die(); 
} 
if($pos == true) 
{ 
die(); 
} 

코드에 어떤 문제가 있으며 왜 $pos = false입니까?

+0

출력 또는 오류 메시지가 있습니까? – ComFreek

+0

없음 무엇이든지 ... 내가 mystring하고 findme 할 때 그들은 같은 결과를냅니다. –

+2

당신은 "1 인당 1 표"를 제한하지 않습니다. 이것은 "회사/기관/사무실/inet 카페/이동 통신사/등 당 1 표"를 제한하는 것입니다. –

답변

0

나는 당신의 접근 방식은 정말 좋은 생각하지 않는다 :

1)을 파일로보고하는 스크립트의 성능이 저하 될 수 있기 때문에 여러 요청에서 하나의 파일에 쓸 정말 좋은하지 않습니다. 데이터베이스 시스템에 액세스 할 수 없습니까?

2) 페이지에 계정 시스템이 있습니까? 그렇다면 IP 주소 대신 계정을 기준으로 두 번째 투표를 제한하는 것이 좋습니다.

3) 두 번째 설문 조사를 시작할 때 무엇을합니까? 두 번째 파일을 만드시겠습니까?

4) fread($fh, 200) : 잠긴 사용자 (IP)가 100 명인 경우 어떻게됩니까? 스크립트는 처음 200 바이트 만 읽습니다.

5) if($pos == true) : 저는 PHP의 "자동 피처"기능에 의존하는 것을 정말 좋아하지 않습니다. FALSE 또는 번호가 있으니 FALSE>= 0을 확인하십시오.

0

함수 strpos()는 needle이 발견되면 정수로 위치를 반환합니다. 바늘이 발견되지 않으면 부울 FALSE를 반환합니다.

$ pos! == false를 사용하는 것이 좋습니다. 유효한 INT 위치가 0으로 반환되면! == 대신! =를 사용하면 false로 해석 될 수 있습니다.

0

대신

$fh = fopen($myFile, 'r'); 
$theData = fread($fh, 200); 
fclose($fh); 

당신이 file_get_contents($myFile)을 사용할 수 있습니다;

또는 IP를 데이터베이스에 더 잘 저장하십시오!