2010-10-13 88 views
1

你好,所以我剛剛設置了這個基本的民意調查,我從我發現的東西中激發了自己,這只是一個基本的ajax民意調查,結果在文本文件中波動。小幫助保存到txt文件

雖然我想知道,因爲我不想讓用戶簡單地通過大量點擊來優化/劣化結果,我想添加一個新的文本文件,可以簡單地保存IP,每行一個,然後檢查是否已經記錄,如果是,則顯示結果,如果沒有,則顯示輪詢。

我的代碼保存結果的線路有:

<?php 
$vote = $_REQUEST['vote']; 

$filename = "votes.txt"; 
$content = file($filename); 

$array = explode("-", $content[0]); 
$yes = $array[0]; 
$no = $array[1]; 

if ($vote == 0) 
    { 
    $yes = $yes + 1; 
    } 
if ($vote == 1) 
    { 
    $no = $no + 1; 
    } 

$insert = $yes."-".$no; 
$fp = fopen($filename,"w"); 
fputs($fp,$insert); 
fclose($fp); 
?> 

所以我想知道我怎麼能檢查出IP地址,在它基本上以同樣的方式。

而且我對數據庫不感興趣,即使是安全措施,我也無所謂。

感謝任何幫助!

+1

數據庫不會因爲速度而出於安全考慮。想象一下,你有一個民意測驗,有1000人投票。所以你的文件中有1000個ip。所以對於每一個新的投票你必須打開你的文件,閱讀它,並在閱讀時必須將每個ip與給定的ip進行比較。這將增長得相當快。 – ITroubs 2010-10-13 15:56:38

+0

我認爲你需要硬着頭皮迎接這個問題的數據庫驅動解決方案;另外,您正在對此文本文件進行排序或搜索,以搜索數千條條目 - 某種數據庫經過優化,可以做得比您做得更好。 (我不是想衝你的夢想,只是真實)。 – Gav 2010-10-13 16:02:20

+0

您不必在[PHP]前加問題,因爲Stack Overflow有標籤。 – systemovich 2010-10-13 16:02:46

回答

2

最簡單的方法是將數據寫入到文件從文件

file_put_contents($filename, $data) 

和讀取數據

file_get_contents($filename); 

,以獲取用戶 $ _ SERVER [ 'REMOTE_ADDR']的IP地址

參見php manual for file_put_contents for more informationfile_get_contents

H ERE是示例代碼

<?php 

// File path 
$file = 'votedips.txt'; 

// Get User's IP Address 
$ip = $_SERVER['REMOTE_ADDR']; 

// Get data from file (if it exists) or initialize to empty string 
$votedIps = file_exists($file) ? file_get_contents($file) : ''; 

// 
$ips = explode("\n", $votedIps); 
if (array_search($ip, $ips)) { 
    // USER VOTED 
} else { 
    $ips[] = $ip; 
} 

// Write data to file 
$data = implode("\n", $ips); 
file_put_contents($file, $data); 

?> 
+0

好吧生病了試試看,但我也可以嘗試cookie方法,最簡單的方法是什麼? – 2010-10-13 16:04:33

+0

file_get_contents($ file,null,$ data)存在問題;我試圖找到它,也許它的內部使用不正確,甚至$ ips,但我找不到,這是報告,file_get_contents()期望參數3是資源 – 2010-10-13 16:15:28

+0

對不起哥們,我有一個愚蠢的代碼中的錯誤...我修復並更新了代碼。它現在完全正常運作。如果你想使用cookie看看''setcookie($ name,$ value,$ expires)的php文檔''http://us.php.net/manual/en/function.setcookie.php – Alex 2010-10-13 17:30:40

0

您可以使用file_get_contents該文件的內容保存到一個變量,然後使用strpos功能檢查,如果該變量的IP存在。
例如:

$ipfile=file_get_contents('ip.txt'); 
if (strpos($ipfile, $_SERVER['REMOTE_ADDR'])!==FALSE) // show the results 
else // show the poll 
+0

非常感謝,我可能會檢查cookie解決方案,因爲它是真的,它可能會開始花費大量的時間來加載。我會記住這個方法,再次感謝 – 2010-10-13 16:03:55

2

要停止多張選票,我會設置一個cookie一旦用戶投票。如果用戶使用投票表單重新載入頁面並且有Cookie,則可以只顯示結果或「您已投票」。信息。請注意,這不會阻止那些技術嫺熟的雙重投票人 - 他們只需要移除已保存的cookie,然後重新投票即可。

請記住,雖然可以共享IP,所以您存儲IP的想法可能會適得其反,人們在共享的面向外部的IP上將無法投票,因爲您的系統將會註冊以前的投票,相同的IP地址。

+0

你對這個IP是正確的,但關於cookie的想法並不是很好。我從我自己的經歷中瞭解到 - 我曾經創建過一個民意調查,它使用cookies來防止用戶進行雙重投票。這是一個失敗,因爲許多用戶剛剛關閉了對我的域的Cookie支持,並且他們投了多少次他們想要的。 – rhino 2010-10-13 16:00:42

+0

好吧,我可能會嘗試,實際上,可能會節省加載時間,謝謝! – 2010-10-13 16:05:12

+0

還應該有一個檢查是否有人啓動了cookie,如果不是僅僅禁止參與投票 – ITroubs 2010-10-13 16:10:09

0

小心將IP存儲在文本文件中,然後使用file_get_contents()和類似的函數來加載數據/解析。作爲絕對最差的情況,假設您的系統可以使用每個可能的IP地址進行投票,您最終將得到一個文件大小爲幾GB的文本文件,並且您將很快超過PHP的memory_limit。