PHP+MySQL投票系统的设计和实现分享_PHP
系统不大,完成这个系统的过程我分了三个步骤
•数据库设计
•系统框架设计
•前端美化
数据库的设计
设计三张表:投票结果统计表(count_voting),投票人记录表(ip_votes),用户表(user)
投票结果统计表用于统计最后的投票记录,我给它弄了4个字段:被投票项的名称(SelectName),被投票项标签名(LabelName)(起到分类的作用),票数(CountVotes)。
投票人记录表用于登记投票人的ip(IP),地理位置(Location),投票时间(VoteTime),被投票项名称(SelectName)。然后我还给它加一个ID。
用户表主要用于给管理员用的,包含用户名(name)和密码(passwd)。
生成表的sql脚本如下:
复制代码 代码如下:
--
-- 表的结构 `count_voting`
--
DROP TABLE IF EXISTS `count_voting`;
CREATE TABLE IF NOT EXISTS `count_voting` (
`SelectName` varchar(40) NOT NULL,
`LabelName` varchar(40) NOT NULL,
`CountVotes` bigint(20) unsigned NOT NULL,
UNIQUE KEY `SelectName` (`SelectName`),
KEY `CountVotes` (`CountVotes`),
KEY `CountVotes_2` (`CountVotes`),
KEY `CountVotes_3` (`CountVotes`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='投票统计表';
-- --------------------------------------------------------
--
-- 表的结构 `ip_votes`
--
DROP TABLE IF EXISTS `ip_votes`;
CREATE TABLE IF NOT EXISTS `ip_votes` (
`ID` bigint(20) unsigned NOT NULL auto_increment COMMENT '投票人序号:自增',
`IP` varchar(15) NOT NULL COMMENT '投票人IP',
`Location` varchar(40) NOT NULL COMMENT '投票人位置',
`VoteTime` datetime NOT NULL,
`SelectName` varchar(40) NOT NULL,
PRIMARY KEY (`ID`),
KEY `ID` (`ID`),
KEY `SelectName` (`SelectName`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=4 ;
--
-- 触发器 `ip_votes`
--
DROP TRIGGER IF EXISTS `vote_count_after_insert_tr`;
DELIMITER //
CREATE TRIGGER `vote_count_after_insert_tr` AFTER INSERT ON `ip_votes`
FOR EACH ROW UPDATE count_voting SET CountVotes = CountVotes + 1 WHERE SelectName = NEW.SelectName
//
DELIMITER ;
-- --------------------------------------------------------
--
-- 表的结构 `user`
--
DROP TABLE IF EXISTS `user`;
CREATE TABLE IF NOT EXISTS `user` (
`name` varchar(10) NOT NULL COMMENT '管理员用户名',
`passwd` char(32) NOT NULL COMMENT '登录密码MD5值'
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='用户表';
--
-- 转存表中的数据 `user`
--
INSERT INTO `user` (`name`, `passwd`) VALUES
('ttxi', '700469ca1555900b18c641bf7b0a1fa1'),
('jitttanwa', 'adac5659956d68bcbc6f40aa5cd00d5c');
--
-- 限制导出的表
--
--
-- 限制表 `ip_votes`
--
ALTER TABLE `ip_votes`
ADD CONSTRAINT `ip_votes_ibfk_1` FOREIGN KEY (`SelectName`) REFERENCES `count_voting` (`SelectName`) ON DELETE CASCADE ON UPDATE CASCADE;
从脚本中可以看出,我创建了一个触发器,当往ip_votes表中插入数据的时候就给count_voting表中的CountVotes字段加1。还能后出最后一句是设置外部关联字。
框架设计
OperatorDB类用于操作数据库,OperatorVotingDB类用于该系统特定的操作集合。
使用PDO操作数据库,我它简单的封装一下:
复制代码 代码如下:
/**
* 操作数据库
* 封装PDO,使其方便自己的操作
*/
class OperatorDB
{
//连接数据库的基本信息
private $dbms='mysql'; //数据库类型,对于开发者来说,使用不同的数据库,只要改这个.
private $host='localhost'; //数据库主机名
private $dbName='voting'; //使用的数据库
private $user='voting'; //数据库连接用户名
private $passwd='voting'; //对应的密码
private $pdo=null;
public function __construct()
{
//dl("php_pdo.dll");
//dl("php_pdo_mysql.dll");
$this->dsn="$this->dbms:host=$this->host;dbname=$this->dbName";
try
{
$this->conn=new PDO($this->dsn,$this->user,$this->passwd);//初始化一个PDO对象,就是创建了数据库连接对象$db
}
catch(PDOException $e)
{
die("
数据库连接失败(creater PDO Error!): ".$e->getMessage()."
");
}
}
public function __destruct()
{
$this->pdo = null;
}
public function exec($sql)
{
}
public function query($sql)
{
}
}
把连接数据库的信息封装进去方便后续的操作。
复制代码 代码如下:
require_once 'OperatorDB.php';
class OperatorVotingDB
{
private $odb;
public function __construct()
{
$this->odb = new OperatorDB();
}
public function __destruct()
{
$this->odb = null;
}
/**
* 清空Voting数据中的所有表
*
* 调用数据库操作类,执行clear数据库的操作
*/
public function clearTables()
{
$sqls = array("TRUNCATE ip_votes;","TRUNCATE count_voting;");
$this->odb->exec($sqls[0]);
$this->odb->exec($sqls[1]);
}
/**
* 重置count_voting表中的CountValues字段为0
*
*/
public function resetCountValues()
{
$sql = "UPDATE count_voting SET CountVotes = 0;";
$this->odb->exec($sql);
}
/**
* 投票
* 将信息写入ip_votes表
* @param type $ip
* @param type $loc
* @param type $time
* @param type $name
*/
public function vote($ip,$loc,$name)
{
$sql = "INSERT INTO ip_votes VALUES (NULL, '$ip', '$loc', NOW(), '$name')";
$subsql = "SELECT MAX(to_days(VoteTime)) FROM ip_votes WHERE IP='$ip'";
$stm = $this->odb->query($subsql);
if (count($row=$stm->fetchAll())==1)
{
$now = date("Y-m-d H:i:s");
$subsql = "SELECT to_days('$now');";
$stm = $this->odb->query($subsql)->fetch();
$time = $stm[0];//使用mysql计算出的today时间
// echo $time."
";
// echo $row[0][0];
if ($time-$row[0][0]{
echo "投票失败,相同ip需要隔一天才能投票";
return;
}
}
// echo $sql;
echo "投票成功!";
$this->odb->exec($sql);
}
/**
* 添加SelectName字段的行
*
* @param string $name
* @param string $label
* @param int $count
*/
public function addSelectName($name, $label, $count=0)
{
$sql = "INSERT INTO count_voting VALUES ('$name', '$label', $count);";
$this->odb->exec($sql);
}
/**
* 获取总投票情况,按票数排序的结果
*
* 按CountVotes字段排序,返回count_voting表
*
* @param int $n
*
*/
public function getVotesSortByCount($n=-1)
{
$sql = "SELECT * FROM count_voting ORDER BY CountVotes DESC LIMIT 0 , $n;";
if (-1 == $n)
{
$sql = "SELECT * FROM count_voting ORDER BY CountVotes DESC;";
}
// echo $sql;
return $this->odb->query($sql);
}
/**
* 获取投票情况,按票数排序并按标签分组的结果
*
* 按CountVotes字段排序并按LabelName字段分组,返回count_voting表
*/
public function getVotesGroupByLabel()
{
$sql = "SELECT * FROM count_voting ORDER BY LabelName DESC;";
// echo $sql;
return $this->odb->query($sql);
}
}
?>
下面还有需要的函数
复制代码 代码如下:
/**
* 页面跳转函数
* 使用js实现
* @param string $url
*/
function goToPgae($url)
{
echo "";
}
function jsFunc($fun, $arg=null)
{
echo "";
}
function jsFunc3($fun, $arg1=null,$arg2=null,$arg3=null)
{
echo "";
//echo $fun."('$arg1','$arg2','$arg3');";
}
function isLoginNow()
{
if ($_COOKIE["user"]=='')
{
return false;
}
return true;
}
function getClientIP()
{
if ($_SERVER["HTTP_X_FORWARDED_FOR"])
{
if ($_SERVER["HTTP_CLIENT_IP"])
{
$proxy = $_SERVER["HTTP_CLIENT_IP"];
}
else
{
$proxy = $_SERVER["REMOTE_ADDR"];
}
$ip = $_SERVER["HTTP_X_FORWARDED_FOR"];
}
else
{
if ($_SERVER["HTTP_CLIENT_IP"])
{
$ip = $_SERVER["HTTP_CLIENT_IP"];
}
else
{
$ip = $_SERVER["REMOTE_ADDR"];
}
}
return $ip;
}
//从123查获取ip
function getIpfrom123cha($ip) {
$url = 'http://www.123cha.com/ip/?q='.$ip;
$content = file_get_contents($url);
$preg = '/(?
preg_match_all($preg, $content, $mb);
$str = strip_tags($mb[0][0]);
//$str = str_replace(' ', '', $str);
$address = $str;
if($address == '') {
$address = '未明';
}
return $address;
}
//从百度获取ip所在地
function getIpfromBaidu($ip) {
$url = 'http://www.baidu.com/s?wd='.$ip;
$content = file_get_contents($url);
$preg = '/(?)(.*)(?=)/isU';
preg_match_all($preg, $content, $mb);
$str = strip_tags($mb[0][1]);
$str = str_replace(' ', '', $str);
$address = substr($str, 7);
if($address == '') {
$address = '未明';
}
return $address;
}
?>
然后就是后台管理员的操作怎么弄了,主要是添加投票项的功能,操作数据库上面已经实现。后面的基本上是页面怎么设置,关系到js。添加投票项的页面是动态的,如下:
复制代码 代码如下:
function addVote()
{
right.innerHTML="
添加投票项
";right.innerHTML+="

핫 AI 도구

Undresser.AI Undress
사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover
사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool
무료로 이미지를 벗다

Clothoff.io
AI 옷 제거제

Video Face Swap
완전히 무료인 AI 얼굴 교환 도구를 사용하여 모든 비디오의 얼굴을 쉽게 바꾸세요!

인기 기사

뜨거운 도구

메모장++7.3.1
사용하기 쉬운 무료 코드 편집기

SublimeText3 중국어 버전
중국어 버전, 사용하기 매우 쉽습니다.

스튜디오 13.0.1 보내기
강력한 PHP 통합 개발 환경

드림위버 CS6
시각적 웹 개발 도구

SublimeText3 Mac 버전
신 수준의 코드 편집 소프트웨어(SublimeText3)

뜨거운 주제











JavaScript를 사용하여 웹 투표 시스템 개발 개요: 인터넷의 급속한 발전으로 인해 온라인 투표는 대중의 의견을 수집하고 의사결정을 내리는 편리하고 빠른 방법이 되었습니다. 이 기사에서는 JavaScript를 사용하여 사용자가 옵션을 선택하고 투표를 제출할 수 있는 간단한 웹 투표 시스템을 개발하는 방법을 소개합니다. 소개: 웹 투표 시스템은 웹 페이지에 여러 옵션을 표시하고 사용자가 선택할 수 있도록 하는 프로그램입니다. 선거 투표, 제품 설문 조사, 의견 수집 등 다양한 시나리오에서 사용할 수 있습니다. 이 기사

PHP로 구현된 다중 사용자 온라인 투표 시스템 소개: 인터넷 기술의 지속적인 발전으로 민주적 의사 결정에 참여하는 대중의 인식이 높아지고 있습니다. 온라인 투표 시스템은 대중에게 편리하고, 빠르고, 투명한 투표 방법을 제공하기 위해 탄생했습니다. 이 기사에서는 PHP를 사용하여 다중 사용자 온라인 투표 시스템을 작성하는 방법을 소개하고 해당 코드 예제를 제공합니다. 1. 시스템 요구사항 분석 코드 작성을 시작하기 전에 투표 시스템의 요구사항과 기능을 명확히 해야 합니다. 일반적인 투표 시스템의 특성에 따라 시스템 기능을 다음과 같이 나눌 수 있습니다.

MySQL 및 Ruby를 사용하여 간단한 투표 시스템을 구현하는 방법 투표 시스템은 문제나 주제에 대한 사용자 의견을 수집하는 데 사용되는 일반적인 온라인 애플리케이션입니다. 이 기사에서는 MySQL 데이터베이스와 Ruby 프로그래밍 언어를 사용하여 간단한 투표 시스템을 구현하는 방법을 소개합니다. 먼저 환경을 준비해야 합니다. MySQL 데이터베이스를 설치했고 Ruby 프로그래밍 환경을 갖추고 있는지 확인하세요. 아직 설치되지 않은 경우 공식 홈페이지에서 다운로드한 후 안내에 따라 설치하시면 됩니다. 다음으로 우리는 필요합니다

Laravel을 사용하여 온라인 투표 시스템을 개발하는 방법 소개: 인터넷의 발전으로 투표를 포함하여 점점 더 많은 일을 온라인으로 수행할 수 있습니다. 온라인 투표 시스템은 다수의 사용자로부터 편리하고 효율적으로 의견과 피드백을 수집할 수 있습니다. 이 글에서는 Laravel 프레임워크를 사용하여 기본 온라인 투표 시스템을 개발하는 방법을 소개하고 구체적인 코드 예제를 제공합니다. 1. 환경 설정 및 Laravel 설치: 컴퓨터에 PHP와 Composer가 설치되어 있는지 확인하세요. 그렇지 않은 경우 먼저 설치하십시오. 열린 생활

PHP 온라인 투표 시스템의 사용자 인터페이스 설계 및 최적화 소개: 인터넷의 발전으로 다양한 온라인 투표 시스템이 점점 더 널리 사용되고 있습니다. 오픈 소스의 풍부한 기능을 갖춘 서버 측 스크립팅 언어인 PHP는 온라인 투표 시스템 구축에 선호되는 언어 중 하나가 되었습니다. 이 기사에서는 PHP에서 온라인 투표 시스템의 사용자 인터페이스를 디자인하고 최적화하는 방법을 살펴보겠습니다. 1. 인터페이스 디자인 간단하고 명확한 레이아웃 디자인 좋은 사용자 인터페이스 디자인은 사용자 친화적인 경험을 제공할 수 있습니다. 투표 시스템의 사용자 인터페이스를 디자인할 때 레이아웃에 주의해야 합니다.

C++로 간단한 투표 시스템을 작성하는 방법은 무엇입니까? 기술의 발달로 투표 시스템은 현대 사회에서 널리 사용되는 도구가 되었습니다. 투표 시스템은 선거, 설문조사, 의사결정 등 다양한 시나리오에서 사용될 수 있습니다. 이 기사에서는 C++로 간단한 투표 시스템을 작성하는 방법을 보여줍니다. 먼저, 투표 시스템의 기본 기능을 명확히 할 필요가 있습니다. 간단한 투표 시스템은 다음과 같은 기능을 갖추어야 합니다. 유권자 등록: 시스템은 사용자가 투표에 참여할 수 있도록 유권자로 등록할 수 있도록 허용해야 합니다. 설문조사 생성: 시스템은 관리자가 설문조사를 생성할 수 있도록 허용해야 합니다.

PHP를 사용하여 WeChat 공개 계정용 투표 시스템을 개발하는 방법 소개: 모바일 인터넷의 급속한 발전으로 WeChat 공개 계정은 마케팅 및 홍보를 위한 중요한 플랫폼 중 하나가 되었습니다. 공개 계정에서 투표 활동은 사용자 충성도와 참여도를 높일 수 있는 일반적인 대화형 방법입니다. 이 기사에서는 PHP를 사용하여 WeChat 공개 계정에 대한 투표 시스템을 개발하는 방법을 소개하고 구체적인 코드 예제를 제공합니다. 1. 준비 작업 개발하기 전에 다음 자료를 준비해야 합니다: WeChat 공식 계정을 위한 개발자 계정. PHP 코드 배포에 사용 가능한 서버입니다.

블록체인 기술이 계속 발전함에 따라 선거, 투표 등의 분야에서 블록체인의 적용이 점점 더 광범위해지고 있습니다. 이 기사에서는 PHP 언어를 사용하여 블록체인 기반 투표 시스템을 개발하는 방법을 소개합니다. 1. 블록체인의 기본 지식 블록체인은 분산형 데이터베이스로, 데이터 구조는 체인 구조를 채택하고 있으며, 각 블록에는 이전 블록의 해시도 포함되어 있습니다. 각 블록의 해시 값은 이전 블록의 해시 값과 관련되어 있으므로 블록 중 하나의 데이터를 수정하면 전체 체인에 해시가 발생합니다.
