2011-11-09 81 views
0

我在我的網站上建立了一個輪詢系統。但爲了確保人們不能再投票,我有知識產權發現機制來收集他們的知識產權並確保他們不會再投票。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票」 –

回答

0

我不認爲你的做法是真正的好:

1)這是不是真的好寫從多個請求一個文件,因爲文件的期待可能會降低腳本的性能。你沒有訪問任何數據庫系統嗎?

2)您的網頁上是否有帳戶系統?如果是,我寧願限制基於帳戶而不是IP地址的第二次投票。

3)當你開始第二輪民意測驗時,你會做什麼?創建第二個文件?

4)fread($fh, 200):如果您有100個鎖定用戶(IP)會發生什麼?您的腳本只能讀取前200個字節。

5)if($pos == true):我真的不喜歡依靠PHP的autocasting「功能」。您正在等待FALSE或一個號碼,因此請檢查FALSE>= 0

0

函數strpos()如果找到指針,則以整數形式返回該位置。如果找不到指針,它將返回布爾值FALSE。

我會推薦使用$ pos!== false,因爲如果您要使用!=而不是!==,返回的有效INT位置0可能會被解釋爲false。

0

而不是

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

你可以使用file_get_contents($myFile);

或者更好地將IP存儲在數據庫中!