- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个正在尝试修改的 php/mysql 轮询。
如果您已经投票,它会设置一个唯一的 cookie,如果设置了 cookie,它会阻止您在同一个民意调查中投票两次。如果已设置,则您只能看到结果。
我想做的是阻止用户多次投票,如果他们的 IP 也在数据库中(我知道 session 会更好,但对我的情况来说不可能)。
我已经设法获取 IP 并将其存储在数据库中,但我无法弄清楚告诉轮询它是否在数据库中的逻辑。
有人能指出我正确的方向吗?
cookie 检测在构造函数和投票方法中。 cookie 在投票方法的末尾设置。
<?php
# don't display errors
ini_set('display_errors',0);
error_reporting(E_ALL|E_STRICT);
class webPoll {
# makes some things more readable later
const POLL = true;
const VOTES = false;
# number of pixels for 1% on display bars
public $scale = 2;
public $question = '';
public $answers = array();
private $header = '<form class="webPoll" method="post" action="%src%">
<input type="hidden" name="QID" value="%qid%"/>
<h4>%question%</h4>
<fieldset><ul>';
private $center = '';
private $footer = "\n</ul></fieldset>%button%\n%totalvotes%\n</form>\n";
private $button = '<p class="buttons"><button type="submit" class="vote">Vote!</button></p>';
private $totalvotes = '';
private $md5 = '';
private $id = '';
/**
* ---
* Takes an array containing the question and list of answers as an
* argument. Creates the HTML for either the poll or the results depending
* on if the user has already voted
*/
public function __construct($params) {
$this->id = array_shift($params);
$this->question = array_shift($params);
$this->answers = $params;
$this->md5 = md5($this->id);
$this->header = str_replace('%src%', $_SERVER['SCRIPT_NAME'], $this->header);
$this->header = str_replace('%qid%', $this->md5, $this->header);
$this->header = str_replace('%question%', $this->question, $this->header);
# seperate cookie for each individual poll (has the user voted yet?)
# if cookie is set then show results(VOTES), if not then let user vote(POLL)
isset($_COOKIE[$this->md5]) ? $this->poll(self::VOTES) : $this->poll(self::POLL);
}
private function poll($show_poll) {
$replace_btn = $show_poll ? $this->button : '';
$get_results = webPoll::getData($this->md5);
$total_votes = array_sum($get_results);
$replace_votes = $show_poll ? $this->totalvotes : '<small>Total Votes: '.$total_votes.'</small>';
$this->footer = str_replace('%button%', $replace_btn, $this->footer);
$this->footer = str_replace('%totalvotes%', $replace_votes, $this->footer);
# static function doesn't have access to instance variable
if(!$show_poll) {
$results = webPoll::getData($this->md5);
$votes = array_sum($results);
}
for( $x=0; $x<count($this->answers); $x++ ) {
$this->center .= $show_poll ? $this->pollLine($x) : $this->voteLine($this->answers[$x],$results[$x],$votes);
}
echo $this->header, $this->center, $this->footer;
}
private function pollLine($x) {
isset($this->answers[$x+1]) ? $class = 'bordered' : $class = '';
return "
<li class='$class'>
<label class='poll_active'>
<input type='radio' name='AID' value='$x' />
{$this->answers[$x]}
</label>
</li>
";
}
private function voteLine($answer,$result,$votes) {
$result = isset($result) ? $result : 0;
$percent = round(($result/$votes)*100);
$width = $percent * $this->scale;
return "
<li>
<div class='result' style='width:{$width}px;'> </div>{$percent}%
<label class='poll_results'>
$answer
</label>
</li>
";
}
/**
* processes incoming votes. votes are identified in the database by a combination
* of the question's MD5 hash, and the answer # ( an int 0 or greater ).
*/
static function vote() {
if(!isset($_POST['QID']) || !isset($_POST['AID']) || isset($_COOKIE[$_POST['QID']])) {
# leave vote method if any of the above are true
return;
}
$dbh = new PDO('mysql:host=????;dbname=????', '????', '');
$dbh->setAttribute( PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION );
try {
# add vote info to 'tally' table
$sth = $dbh->prepare("INSERT INTO tally (QID,AID,votes,created_at) values (?, ?, 1, NOW())");
$ex = array($_POST['QID'],$_POST['AID']);
$sth->execute($ex);
# add ip info to 'ips' table
$sth2 = $dbh->prepare("INSERT INTO ips (ips,QID,AID) values (?,?,?)");
$ex2 = array($_SERVER['REMOTE_ADDR'],$_POST['QID'],$_POST['AID']);
$sth2->execute($ex2);
}
catch(PDOException $e) {
# 23000 error code means the key already exists, so UPDATE!
if($e->getCode() == 23000) {
try {
# update number of votes for answers in 'tally' table
$sth = $dbh->prepare("UPDATE tally SET votes = votes+1 WHERE QID=? AND AID=?");
$sth->execute(array($_POST['QID'],$_POST['AID']));
# add ip info to 'ips' table
$sth2 = $dbh->prepare("INSERT INTO ips (ips,QID,AID) values (?,?,?)");
$ex2 = array($_SERVER['REMOTE_ADDR'],$_POST['QID'],$_POST['AID']);
$sth2->execute($ex2);
}
catch(PDOException $e) {
webPoll::db_error($e->getMessage());
}
}
else {
webPoll::db_error($e->getMessage());
}
}
# entry in $_COOKIE to signify the user has voted, if he has
if($sth->rowCount() == 1) {
setcookie($_POST['QID'], 1, time()+60*60*24*365, '/', '', FALSE, TRUE);
$_COOKIE[$_POST['QID']] = 1;
}
}
static function getData($question_id) {
try {
$dbh = new PDO('mysql:host=????;dbname=????', '????', '');
$dbh->setAttribute( PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION );
$STH = $dbh->prepare('SELECT AID, votes FROM tally WHERE QID = ?');
$STH->execute(array($question_id));
}
catch(PDOException $e) {
# Error getting data, just send empty data set
return array(0);
}
while($row = $STH->fetch()) {
$results[$row['AID']] = $row['votes'];
}
return $results;
}
/*
* You can do something with the error message if you like. Email yourself
* so you know something happened, or make an entry in a log
*/
static function db_error($error) {
echo "A database error has occurred. $error";
exit;
}
}
?>
下面是民意调查的实现方式:
<?php
ini_set('display_errors',1);
error_reporting(E_ALL|E_STRICT);
include('webPoll-hiddenMD5.class.php');
webPoll::vote();
?>
<html>
<head>
<title>Poll Test</title>
<link rel="stylesheet" href="poll.css" type="text/css" />
<!--[if IE]>
<style> body { behavior: url("res/hover.htc"); } </style>
<![endif]-->
</head>
<body>
<?php
$a1 = new webPoll(array(
'March 16, 2012 What subjects would you like to learn more about?',
'What subjects would you like to learn more about?',
'HTML & CSS',
'Javascript',
'JS Frameworks (Jquery, etc)',
'Ruby/Ruby on Rails',
'PHP',
'mySQL'));
?>
</body>
</html>
最佳答案
看起来好像所有的逻辑都在构造函数中,只需针对用户 ip 和 qid 查询 ip 表,看看结果数是否大于 0。如果是,则只需更改最后一行构造函数 isset($_COOKIE[$this->md5] || count($res)>0 ) ? $this->poll(self::VOTES) : $this->poll(self::POLL);
关于PHP/MySQL 投票 - 不重复基于 IP 的投票,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9841352/
我在网站上实现了一个简单的向上/向下投票系统,并且我会跟踪个人投票以及投票时间和唯一用户 ID(散列 IP)。 我的问题不是如何计算投票的百分比或总和 - 但更多的是,根据投票确定好分数的好算法是什么
已关闭。此问题需要 debugging details 。目前不接受答案。 编辑问题以包含 desired behavior, a specific problem or error, and t
我有一个 Rails 应用程序,其中我的 Posts 模型有评论并且评论是可投票的。我正在使用 acts_as_votable。 我目前正在对评论进行投票。现在我正在尝试实现一些 javascript
几天前我刚刚开始使用 SQLAlchemy,现在我遇到了一个问题,我希望任何人都可以在我失去所有头发之前弄清楚。 当我运行单元测试时,请参阅下面的代码片段,只有序列中的第一个测试通过。测试 testP
有没有办法以编程方式访问Outlook电子邮件的“投票”功能?我希望能够发送启用了投票的电子邮件,并获得答复(最好是不进行投票)。 谢谢! 最佳答案 听起来您想使用Outlook对象模型中的MailI
我正在使用这个JQuery Ajax Voting system guide作为一个粗略的引用,但我对此的安全性有点担心。现在这个指南基本上存储了一些东西的ID和它的投票统计数据。 我想提出类似的想法
我正在使用 disqus 2012。我已经在我的网站上实现了评级系统,所以希望删除评论右上角的星号,因为它有点困惑。当我将鼠标悬停在上面时,它会显示“投票”。无论如何要从我的评论中删除它? 最佳答案
我有一个 PHP 系统,允许用户以 1 - 5 的范围对照片进行投票,我想要做的是突出显示两个人给彼此相同的投票/分数的地方。我目前无法弄清楚我的 PHP 函数的 SQL。 数据库看起来像这样 id,
tasker 等应用如何捕获上下文。假设我想捕捉当 wifi 打开时做某事的上下文。是否可以为 isWifiEnabled() 附加回调?或者在没有轮询的情况下启用 wifi 时执行处理程序。示例代码
Python(以及 StackOverflow)新手。试图弄清楚如何让它正确执行。虽然程序本身执行得很好,但我希望它没有额外的步骤。我的意思是,如果第一个语句失败,我想终止并打印与 else 语句相关
有什么方法可以制作一个安全的 php 投票系统吗?我会尝试存储 IP 地址,但有动态 IP。聪明的人可以重新连接并投票两次。 Cookie 也很容易破解。 最佳答案 任何跟踪用户的方式:cookies
我正在处理 Django tutorials ,现在我正在创建一个民意调查。 在我想创建选择之前,下面的代码工作正常,但出于某种原因,我总是收到此错误消息: line 22, in __unicode
我正在实现一些需要公共(public)轮询才能从服务器获取新值的对话框。我正在尝试使用 p:poll,但不幸的是我无法阻止它。我在用户单击一个对话框中的按钮时开始投票,并在用户单击子对话框中的按钮时尝
嘿,我需要手动将投票系统实现到模型中。 我从 Mike DeSimone 那里得到了巨大的帮助,首先完成了这项工作,但我需要扩展他的工作。 这是我当前的代码 查看 def show_game(requ
我正在实现一个投票系统,当我想使用 AJAX 更新投票数时,我会刷新所有出版物的计数。但我不能只刷新一份出版物。查看我的 HTML: @foreach($publications as $public
目前我正在投票 SCM H H(0-8) * * 5 我的意思是:周五午夜到早上 8 点之间进行民意调查。 我想要的是每隔一个星期五进行一次投票。 最佳答案 接受的答案在 Jenkins 中不起作用:
function vote() { = 1) { ?> alert("
我有一个大数据文件,该文件会不断地(同步地)被现场的测量设备附加到该文件中。我需要将最新的数据同步传送到这个文件到在线仪表板。我说等时是因为“仪表板”不关心显示数据流(高延迟情况),它只关心发送给它的
我正在学习 djangoproject.com 教程。我使用 pyCharm 设置了一个虚拟项目。在我的终端命令行上,我 cd 进入包含 manage.py 的文件夹,然后运行该行。python ma
我有一个正在尝试修改的 php/mysql 轮询。 如果您已经投票,它会设置一个唯一的 cookie,如果设置了 cookie,它会阻止您在同一个民意调查中投票两次。如果已设置,则您只能看到结果。 我
我是一名优秀的程序员,十分优秀!