1

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

抽奖表格脚本未附加到投票脚本。抽奖输入表单脚本中的所有输入都经过验证,并将信息发送到平面文件。这是一项仅持续 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 />

提交后,“谢谢”页面会告知访问者,他们的详细信息将抽奖活动中用于礼篮。换句话说,访客可以返回并再次填写表格并提交,要求我在完成随机数抽奖之前检查并清除平面文件中的多个条目!

问题有没有一种简单的方法可以安装一些东西来阻止访问者尝试多次进入抽奖?

4

7 回答 7

1

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

另一种方法可能是 cookie。

于 2011-11-11T20:20:56.300 回答
1

我同意@David Barker 的观点,除非您将他们登录并拥有他们的用户 ID,否则人们可能会找到解决您放置的任何内容的方法。但是,我不同意他的答案是“是”。我认为答案是否定的。

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

因此,您可能不得不接受人们可能有多次参加抽签或放弃抽签的事实。

很抱歉给出否定的答案,但如果没有大量资源可供您使用,我真的看不出如何实现您想要的。

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

1 - 使用名称作为过滤器

我有一个简单的名字“Paul White”,有成千上万甚至数百万的 Paul Whites,因此仅限于一个是不现实的。

2 - 使用 IP 地址

我所要做的就是断开我的路由器与我的 ISP 的连接,然后重新连接。你好,新IP,第二次进入抽奖。或者登录到我老妈妈的电脑——同样的结果。您不能阻止多个条目,句号。

3 - 使用电话号码

我还有两部手机,一个固定电话号码和一个 Skype 号码(我经常出差),每次都可以使用不同的手机。

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

在英国(我不知道其他任何地方,但怀疑它是相似的)一个邮政编码适用于许多房屋。但是,假设我的门牌号是 16,我可以提交一个 16、16a、16b 的条目......并且地址仍然有效,并且邮寄给它的任何东西仍然会到达我的手中。

5 - 与你能想到的任何其他事情的小操作有关的类似论点

于 2011-11-11T20:38:21.477 回答
0

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

于 2011-11-11T20:19:38.397 回答
0

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

于 2011-11-11T20:21:33.490 回答
0

答案是肯定的,但你只能用你提供的数据来阻止人们。人们(如果愿意)会找到一种方法让自己多次参加比赛。

如果关键输入数据与文件中已保存的数据匹配,我将有一个从平面文件中读取并返回 true 的脚本。

例如

$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.
// }

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

于 2011-11-11T20:26:29.370 回答
0

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

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

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

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

于 2011-11-11T20:30:55.713 回答
-1

如果您在 onclick 事件中禁用提交按钮,访问者将不得不刷新页面以重新提交您的表单。

您可以执行以下操作:

var btn = document.getElementById("button-id");
btn.onclick = function() {
    btn.disabled = 'disabled';
}
于 2011-11-11T20:15:13.203 回答