【PHP+MySQL】投票系统的设计和实现

您所在的位置:网站首页 投票网页 【PHP+MySQL】投票系统的设计和实现

【PHP+MySQL】投票系统的设计和实现

2023-12-31 13:38| 来源: 网络整理| 查看: 265

系统不大,完成这个系统的过程我分了三个步骤

数据库设计 系统框架设计 前端美化 数据库的设计

设计三张表:投票结果统计表(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) { } }

把连接数据库的信息封装进去方便后续的操作。



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3