搜索
首页后端开发php教程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 = '/(?

  • )(.*)(?=)/isU';
    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+="
  • 声明
    本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
    使用JavaScript开发网页投票系统使用JavaScript开发网页投票系统Aug 09, 2023 pm 01:30 PM

    使用JavaScript开发网页投票系统摘要:随着互联网的飞速发展,网上投票成为了一种方便快捷的方式,用于收集公众的意见和做出决策。本文将介绍使用JavaScript开发一个简单的网页投票系统,实现了用户可以选择选项并提交投票的功能。介绍:网页投票系统是一个在网页上显示多个选项并允许用户选择的程序。它可以用于许多场景,例如选举投票、产品调查、意见收集等。本文

    PHP实现的多用户在线投票系统PHP实现的多用户在线投票系统Aug 10, 2023 pm 05:49 PM

    PHP实现的多用户在线投票系统引言:随着互联网技术的不断发展,公众参与民主决策的意识日益增强。在线投票系统应运而生,为公众提供了一种方便、快捷、透明的投票方式。本文将介绍如何使用PHP编写一个多用户在线投票系统,并提供相应的代码示例。一、系统需求分析在开始编写代码之前,我们需要明确投票系统的需求和功能。根据常见的投票系统特点,我们可以将系统功能划分为以下几个

    如何使用MySQL和Ruby实现一个简单的投票系统如何使用MySQL和Ruby实现一个简单的投票系统Sep 20, 2023 pm 12:37 PM

    如何使用MySQL和Ruby实现一个简单的投票系统投票系统是一种常见的在线应用程序,用于收集用户对某个问题或主题的意见。在本文中,将介绍如何使用MySQL数据库和Ruby编程语言来实现一个简单的投票系统。首先,我们需要准备环境。确保已经安装了MySQL数据库并且已经具备了Ruby编程环境。如果还没有安装,可以到官方网站上下载并按照指示进行安装。接下来,我们需

    如何使用Laravel开发一个在线投票系统如何使用Laravel开发一个在线投票系统Nov 02, 2023 pm 06:31 PM

    如何使用Laravel开发一个在线投票系统引言:随着互联网的发展,越来越多的事物都可以在线完成,其中包括投票。在线投票系统可以方便、高效地收集大量用户的意见和反馈。本文将介绍如何使用Laravel框架来开发一个基本的在线投票系统,并提供具体代码示例。一、环境搭建与Laravel安装:确保您的机器上已经安装了PHP和Composer。如果没有,请先安装。打开命

    PHP在线投票系统的用户界面设计与优化PHP在线投票系统的用户界面设计与优化Aug 09, 2023 pm 08:45 PM

    PHP在线投票系统的用户界面设计与优化引言:随着互联网的发展,各种在线投票系统的使用越来越广泛。作为一个开源的、功能丰富的服务器端脚本语言,PHP成为了构建在线投票系统的首选语言之一。在本文中,我们将探讨如何设计和优化PHP在线投票系统的用户界面。一、界面设计简洁明了的布局设计好的用户界面设计能够提供用户友好的体验。在设计投票系统的用户界面时,我们应该注重布

    如何通过C++编写一个简单的投票系统?如何通过C++编写一个简单的投票系统?Nov 04, 2023 am 11:24 AM

    如何通过C++编写一个简单的投票系统?随着科技的发展,投票系统已经成为了现代社会中广泛使用的工具。投票系统可以用于选举、调查、决策等许多场景。本文将向您介绍如何通过C++编写一个简单的投票系统。首先,我们需要明确投票系统的基本功能。一个简单的投票系统应该具有以下功能:注册选民:系统应该允许用户注册成为选民,以便可以参与投票。创建投票:系统应该允许管理员创建投

    如何利用PHP开发微信公众号的投票系统如何利用PHP开发微信公众号的投票系统Oct 27, 2023 pm 12:12 PM

    如何利用PHP开发微信公众号的投票系统引言:随着移动互联网的快速发展,微信公众号成为了营销推广的重要平台之一。而在公众号中,投票活动是一种常见的互动方式,可以增加用户粘性和参与度。本文将介绍如何利用PHP开发微信公众号的投票系统,并提供具体的代码示例。一、准备工作在开发之前,需要准备以下材料:一个微信公众号的开发者账号。一个可用的服务器,用于部署PHP代码。

    PHP中的区块链投票系统PHP中的区块链投票系统Jun 11, 2023 pm 12:03 PM

    随着区块链技术的不断发展,其在选举和投票等领域中的应用也越来越广泛。本文将介绍如何使用PHP语言开发一款基于区块链的投票系统。一、区块链基础知识区块链是一种去中心化的分布式数据库,其数据结构采用链式结构,每个区块包含了若干个交易,同时还包含了上一个区块的哈希值。由于每个区块的哈希值都和上一个区块的哈希值相关,因此修改其中任意一个区块的数据都会导致整个链上的哈

    See all articles

    热AI工具

    Undresser.AI Undress

    Undresser.AI Undress

    人工智能驱动的应用程序,用于创建逼真的裸体照片

    AI Clothes Remover

    AI Clothes Remover

    用于从照片中去除衣服的在线人工智能工具。

    Undress AI Tool

    Undress AI Tool

    免费脱衣服图片

    Clothoff.io

    Clothoff.io

    AI脱衣机

    AI Hentai Generator

    AI Hentai Generator

    免费生成ai无尽的。

    热门文章

    R.E.P.O.能量晶体解释及其做什么(黄色晶体)
    3 周前By尊渡假赌尊渡假赌尊渡假赌
    R.E.P.O.最佳图形设置
    3 周前By尊渡假赌尊渡假赌尊渡假赌
    R.E.P.O.如果您听不到任何人,如何修复音频
    3 周前By尊渡假赌尊渡假赌尊渡假赌

    热工具

    WebStorm Mac版

    WebStorm Mac版

    好用的JavaScript开发工具

    mPDF

    mPDF

    mPDF是一个PHP库,可以从UTF-8编码的HTML生成PDF文件。原作者Ian Back编写mPDF以从他的网站上“即时”输出PDF文件,并处理不同的语言。与原始脚本如HTML2FPDF相比,它的速度较慢,并且在使用Unicode字体时生成的文件较大,但支持CSS样式等,并进行了大量增强。支持几乎所有语言,包括RTL(阿拉伯语和希伯来语)和CJK(中日韩)。支持嵌套的块级元素(如P、DIV),

    Dreamweaver CS6

    Dreamweaver CS6

    视觉化网页开发工具

    PhpStorm Mac 版本

    PhpStorm Mac 版本

    最新(2018.2.1 )专业的PHP集成开发工具

    MinGW - 适用于 Windows 的极简 GNU

    MinGW - 适用于 Windows 的极简 GNU

    这个项目正在迁移到osdn.net/projects/mingw的过程中,你可以继续在那里关注我们。MinGW:GNU编译器集合(GCC)的本地Windows移植版本,可自由分发的导入库和用于构建本地Windows应用程序的头文件;包括对MSVC运行时的扩展,以支持C99功能。MinGW的所有软件都可以在64位Windows平台上运行。