- ubuntu12.04环境下使用kvm ioctl接口实现最简单的虚拟机
- Ubuntu 通过无线网络安装Ubuntu Server启动系统后连接无线网络的方法
- 在Ubuntu上搭建网桥的方法
- ubuntu 虚拟机上网方式及相关配置详解
CFSDN坚持开源创造价值,我们致力于搭建一个资源共享平台,让每一个IT人在这里找到属于你的精彩世界.
这篇CFSDN的博客文章PHP+MySQL投票系统的设计和实现分享由作者收集整理,如果你对这篇文章有兴趣,记得点赞哟.
系统不大,完成这个系统的过程我分了三个步骤 •数据库设计 •系统框架设计 •前端美化 数据库的设计 设计三张表:投票结果统计表(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("<br/>数据库连接失败(creater PDO Error!): ".$e->getMessage()."<br/>"); } } public function __destruct() { $this->pdo = null; } public function exec($sql) { } public function query($sql) { } } 。
把连接数据库的信息封装进去方便后续的操作。 。
复制代码代码如下
<?php 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."<br>"; // echo $row[0][0]; if ($time-$row[0][0]<1)//表中最大的时间和现在的时间$time比较 { 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); } } ?> 。
下面还有需要的函数 。
复制代码代码如下
<?php /** * 页面跳转函数 * 使用js实现 * @param string $url */ function goToPgae($url) { echo "<script language='javascript' type='text/javascript'>"; echo "window.location.href='$url'"; echo "</script>"; } function jsFunc($fun, $arg=null) { echo "<script language='javascript' type='text/javascript'>"; echo $fun."('$arg');"; echo "</script>"; } function jsFunc3($fun, $arg1=null,$arg2=null,$arg3=null) { echo "<script language='javascript' type='text/javascript'>"; echo $fun."('$arg1','$arg2','$arg3');"; echo "</script>"; //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 = '/(?<=本站主数据:<\/li><li style=\"width:450px;\">)(.*)(?=<\/li>)/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 = '/(?<=<p class=\"op_ip_detail\">)(.*)(?=<\/p>)/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="<h2>添加投票项</h2>"; right.innerHTML+="<label>投票项标签<label>"; addInput("right","cLabelName","地区名"); right.innerHTML+="<br><label>投票项名称<label>"; addInput("right","cSelectName","学校名"); right.innerHTML+="<br>"; var args = '\'./add.php\',\'cSelectName\',\'cLabelName\''; var str = '<input type=button value="\u6dfb加" onclick="goToPage('+args+');"/>'; right.innerHTML+=str; } //添加文本框 function addInput(parent,id,pla) { //创建input var input = document.createElement("input"); input.type = "text"; input.id = id; input.placeholder = pla; document.getElementById(parent).appendChild(input); } 。
效果: 。
清空投票项也差不多,下过如下:
添加投票项是通过url传递变量到add.php页面的。 。
复制代码代码如下
<?php require_once '../api/func.php'; if (!isLoginNow()) { goToPgae("./index.php"); } $name = $_GET["cSelectName"]; $label = $_GET["cLabelName"]; //echo $name."<br>".$label; require_once '../api/OperatorVotingDB.php'; $ovdb=new OperatorVotingDB(); $ovdb->addSelectName($name,$label); require './header.htm'; goToPgae("./admin.php?page=add&auto="."$label"."&id=cLabelName&foc=cSelectName&msg=添加成功"); ?> 。
下面是两个跳转页面的函数,js的(上面func.php中的跳转页面函数也是通过js实现的)。 。
复制代码代码如下
//js function goToPage(url,arg1,arg2) { var a = document.getElementById(arg1).value; var b = document.getElementById(arg2).value; url += '?'+arg1+'='+a; url += '&'+arg2+'='+b; window.location.href=url; } function goToPage1(url) { window.location.href=url; } 。
还有修改删除功能没有实现。我应该不会去实现那个了吧,js的话和添加功能差不多。 登录模块的话网上很多,模仿的。就是提交表单,查找数据库,返回结果。成功则设置cookie,后台的每个页面都添加了检测cookie的功能的。 前端美化 index.php页面首先操作数据库获取投票项和票数,然后显示出来(通过css+div美化一下框架界面什么的),最后点击投票按钮就提交表单,跳转到vote.php页面。 css的话我都是抄网上的。我弄的效果如下: 。
这个东西算是个很小的信息管理系统吧,我已经把这个东西的源代码放到github(https://github.com/hanxi/voting)上去了,可以随意下载修改也可以到我下载(点击下载)。欢迎读者回复交流,这方面不是我的强项,有很多不足之处还望指教。 作者:涵曦(涵曦的技术博客 - 博客园) 微博:t.qq.com/hanxi1203 出处:hanxi.cnblogs.com 。
最后此篇关于PHP+MySQL投票系统的设计和实现分享的文章就讲到这里了,如果你想了解更多关于PHP+MySQL投票系统的设计和实现分享的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
目前我正在构建相当大的网络系统,我需要强大的 SQL 数据库解决方案。我选择 Mysql 而不是 Postgres,因为一些任务需要只读(MyISAM 引擎)而其他任务需要大量写入(InnoDB)。
我在 mysql 中使用如下命令。当它显示表格数据时,它被格式化为一个非常干净的表格,间距均匀且 |作为列分隔符。 SELECT * FROM TABLE_NAME; 当我从 CLI 运行命令时,如下
我知道这个问题之前已经被问过好几次了,我已经解决了很多问题,但到目前为止没有任何效果。 MySQL 试图将自身安装到的目录 (usr/local/mysql) 肯定有问题。关于我的错误的奇怪之处在于我
以下是我的 SQL 数据结构,我正在尝试如下两个查询: Select Wrk_ID, Wrk_LastName, Skill_Desc from Worker, Skill where
我们有一个本地 mysql 服务器(不在公共(public)域上),并希望将该服务器复制到我们拥有的 google 云 sql 实例。我的问题是:1.这可能吗?2.我们的本地服务器只能在本地网络上访问
我有一个表(test_table),其中一些字段值(例如字段 A、B 和 C)是从外部应用程序插入的,还有一个字段(字段 D),我想从现有表(store_table)插入其值,但在插入前者(A、B 和
我想创建一个 AWS RDS 实例,然后使用 terraform 管理数据库用户。因此,首先,我创建了一个 RDS 实例,然后使用创建的 RDS 实例初始化 mysql 提供程序,以进一步将其用于用户
当用户在我的网站上注册时,他们会在我的一个数据库中创建自己的表格。该表存储用户发布的所有帖子。我还想做的是也为他们生成自己的 MySql 用户——该用户仅有权从他们的表中读取、写入和删除。 创建它应该
我有一个关于 ColdFusion 和 Mysql 的问题。我有两个表:PRODUCT 和 PRODUCT_CAT。我想列出包含一些标记为:IS_EXTRANET=1 的特殊产品的类别。所以我写了这个
我想获取 recipes_id 列的值,以获取包含 ingredient_id 的 2,17 和 26 条目的值。 假设 ingredient_id 2 丢失则不获取记录。 我已经尝试过 IN 运算符
在 Ubuntu 中,我通常安装两者,但 MySQL 的客户端和服务器之间有什么区别。 作为奖励,当一个新语句提到它需要 MySQL 5.x 时,它是指客户端、服务器还是两者兼而有之。例如这个链接ht
我重新访问了我的数据库并注意到我有一些 INT 类型的主键。 这还不够独特,所以我想我会有一个指导。 我来自微软 sql 背景,在 ssms 中你可以 选择类型为“uniqeidentifier”并自
我的系统上有 MySQL,我正在尝试确定它是 Oracle MySQL 还是 MySQL。 Oracle MySQL 有区别吗: http://www.oracle.com/us/products/m
我是在生产 MySQL 中运行的应用程序的新维护者。之前的维护者已经离开,留下的文档很少,而且联系不上了。 我面临的问题是执行以下请求大约需要 10 秒: SELECT COUNT(*) FROM `
我有两个位于不同机器上的 MySQL 数据库。我想自动将数据从一台服务器传输到另一台服务器。比方说,我希望每天早上 4:00 进行数据传输。 可以吗?是否有任何 MySQL 内置功能可以让我们做到这一
有什么方法可以使用 jdbc 查询位于 mysql 根目录之外的目录中的 mysql 表,还是必须将它们移动到 mysql 根目录内的数据库文件夹中?我在 Google 上搜索时没有找到任何东西。 最
我在 mysql 数据库中有两个表。成员和 ClassNumbers。两个表都有一个付费年份字段,都有一个代码字段。我想用代码数字表中的值更新成员表中的付费年份,其中成员中的代码与 ClassNumb
情况:我有 2 台服务器,其中一台当前托管一个实时 WordPress 站点,我希望能够将该站点转移到另一台服务器,以防第一台服务器出现故障。传输源文件很容易;传输数据库是我需要弄清楚如何做的。两台服
Phpmyadmin 有一个功能是“复制数据库到”..有没有mysql查询来写这个函数?类似于将 db A 复制到新的 db B。 最佳答案 首先创建复制数据库: CREATE DATABASE du
我有一个使用 mySQL 作为后端的库存软件。我已经在我的计算机上对其进行了测试,并且运行良好。 当我在计算机上安装我的软件时,我必须执行以下步骤: 安装 mySQL 服务器 将用户名指定为“root
我是一名优秀的程序员,十分优秀!