使用PHP防止多个条目

时间:2011-11-11 20:12:28

标签: php forms flat-file multiple-entries

在网页上与投票设施一起呈现的是以下输入字段,使访问者(选民)能够在抽奖中输入他们的详细信息以作为他们参与投票的奖励。

抽奖条目表格脚本未附加到投票脚本。验证抽奖条目表单脚本中的所有输入,并将信息发送到flatfile。这是一个针对小城镇论坛可能不时出现的不同主题仅持续7天的简短民意调查。 (也收集了IP)

Name  :<input type="text" name="visitor" /><br /><br />
Email :<input type="text" name="visitormail" /><br /><br />
Phone :<input type="text" name="visitorphone"/><br /><br />

提交时,'谢谢你'页面会告知访问者他们的详细信息将在抽奖活动中一次使用。换句话说,访问者可以返回并再次填写表单并提交,要求我在完成随机数抽奖之前检查并清除flatfile中的多个条目!

问题是否有一种简单的方法来安装阻止访问者尝试多次参与抽奖的内容?

7 个答案:

答案 0 :(得分:1)

我也会记录IP(参见$_SERVER变量)。然后,您可以通过IP缩小重复项。并不总是最简单的方法。

另一种方法可能是cookie。

答案 1 :(得分:1)

我同意@David Barker的观点,人们可能会找到解决方法,除非您登录并拥有用户ID。但是,我不同意他的答案是'是'。我认为答案是'不'。

我看不出任何方法可以阻止访问者在多个条目中提交略有不同的信息。除非您要求并验证其社会保障,护照或驾驶执照号码。事实上,同样可能会避免在记录人员的系统上避免多个帐户。

所以,你可能不得不接受人们可能会在抽奖中有多个条目或放弃它。

对于否定的答案感到抱歉,但我真的看不出如何在没有巨额资源的情况下实现您的目标。

编辑以进一步解释我的论点:

1 - 使用名称作为过滤器

我有一个简单的名字'保罗怀特',保罗怀特有数千甚至数百万,所以限制一个是不现实的。

2 - 使用IP地址

我所要做的就是从我的ISP连接我的路由器,然后重新连接。你好,新IP,第二次进入抽奖活动。或者登录我老妈妈的电脑 - 结果相同。您无法阻止多个条目,期间。

3 - 使用电话号码

我还有2部手机号码和一个Skype号码(我经常旅行),我每次都可以使用不同的手机。

4 - 使用门牌号码加邮政编码

在英国(我不知道其他任何地方,但怀疑它是相似的)一个邮政编码适用于许多房屋。但是,如果我的房屋号码是16,我可以提交16,16a,16b的条目......地址仍然有效,任何邮寄给它仍然会找到我。

5 - 类似的论点涉及对你可以想到的任何其他事情的轻微操纵

答案 2 :(得分:0)

我认为您将数据存储到数据库中。然后你可以选择一个必须是唯一的项目(我推荐一个电话#)并使其列成为一个单独的键。因此,对数据库的多次插入将失败(您必须事先检查手机#格式并在实际插入之前将其标准化,但这是完全不同的问题。)

答案 3 :(得分:0)

如果用户必须登录投票,那么您可以保存user_id并检查他们是否已经投票。或者,如果他们是匿名的,您可以进行IP号码检查$_SERVER['REMOTE_ADDR ']。或者,您可以在提交时保存cookie。

答案 4 :(得分:0)

答案是肯定的,但是你只能用你给出的数据把人们拉回来。人们会(如果倾向于)找到一种让自己多次参加比赛的方法。

我会有一个从flatfile读取的脚本,如果键输入数据与已存档的数据相匹配,则返回true。

e.g。

$input = $_REQUEST['post_data'];

$fp = fopen("poll.txt","r");

while ($ln = fgetcsv($fp, 1000, "\t") !== FALSE) {
    if ($ln[4] == $input['post_data']) {

        // Set exists to true
        $exists = TRUE;
    }
}

// Check if $exists == TRUE {
//     return false;
// Else {
//     write new data to file.
// }

这认为对于每个“单元格”,您的flatfile被/t分隔。 还要考虑:$ ln [x],其中x =文件每一行数据的位置。

答案 5 :(得分:0)

您可以使用电子邮件轻松解决此问题。如果您正在使用数据库,则可以快速检查电子邮件是否存在,例如

"SELECT COUNT(visitoremail) FROM users WHERE LOWER(visitoremail) = '" . strtolower($_REQUEST['visitormail']) . "';

如果结果大于零,则不会将它们添加到数据库中。同样,如果计数等于零,那么您将使用新数据执行INSERT。

另一种方法是将所有条目存储在数据库中。然后,"SELECT DISTINCT visitoremail FROM users ...“或者将所有电子邮件选择到PHP数组中,然后执行array_unique(visitoremails)以获取唯一的电子邮件。

答案 6 :(得分:-1)

如果您在onclick事件中禁用了提交按钮,则访问者必须刷新页面才能重新提交表单。

您可以执行以下操作:

var btn = document.getElementById("button-id");
btn.onclick = function() {
    btn.disabled = 'disabled';
}