2010-10-13 95 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。