數(shù)據(jù)庫(kù)的設(shè)計(jì) 設(shè)計(jì)三張表:投票結(jié)果統(tǒng)計(jì)表(count_voting),投票人記錄表(ip_votes),用戶表(user) 投票結(jié)果統(tǒng)計(jì)表用于統(tǒng)計(jì) " /> 午夜日本,99精品欧美一区二区三区综合在线,一级女性黄 色生活片

一区二区久久-一区二区三区www-一区二区三区久久-一区二区三区久久精品-麻豆国产一区二区在线观看-麻豆国产视频

PHP+MySQL投票系統(tǒng)的設(shè)計(jì)和實(shí)現(xiàn)分享

系統(tǒng)不大,完成這個(gè)系統(tǒng)的過(guò)程我分了三個(gè)步驟
•數(shù)據(jù)庫(kù)設(shè)計(jì)
•系統(tǒng)框架設(shè)計(jì)
•前端美化

數(shù)據(jù)庫(kù)的設(shè)計(jì)
設(shè)計(jì)三張表:投票結(jié)果統(tǒng)計(jì)表(count_voting),投票人記錄表(ip_votes),用戶表(user)
投票結(jié)果統(tǒng)計(jì)表用于統(tǒng)計(jì)最后的投票記錄,我給它弄了4個(gè)字段:被投票項(xiàng)的名稱(SelectName),被投票項(xiàng)標(biāo)簽名(LabelName)(起到分類的作用),票數(shù)(CountVotes)。

投票人記錄表用于登記投票人的ip(IP),地理位置(Location),投票時(shí)間(VoteTime),被投票項(xiàng)名稱(SelectName)。然后我還給它加一個(gè)ID。

用戶表主要用于給管理員用的,包含用戶名(name)和密碼(passwd)。

生成表的sql腳本如下:
復(fù)制代碼 代碼如下:
--
-- 表的結(jié)構(gòu) `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='投票統(tǒng)計(jì)表';
-- --------------------------------------------------------
--
-- 表的結(jié)構(gòu) `ip_votes`
--
DROP TABLE IF EXISTS `ip_votes`;
CREATE TABLE IF NOT EXISTS `ip_votes` (
`ID` bigint(20) unsigned NOT NULL auto_increment COMMENT '投票人序號(hào):自增',
`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 ;
--
-- 觸發(fā)器 `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 ;
-- --------------------------------------------------------
--
-- 表的結(jié)構(gòu) `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='用戶表';
--
-- 轉(zhuǎn)存表中的數(shù)據(jù) `user`
--
INSERT INTO `user` (`name`, `passwd`) VALUES
('ttxi', '700469ca1555900b18c641bf7b0a1fa1'),
('jitttanwa', 'adac5659956d68bcbc6f40aa5cd00d5c');
--
-- 限制導(dǎo)出的表
--
--
-- 限制表 `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;

從腳本中可以看出,我創(chuàng)建了一個(gè)觸發(fā)器,當(dāng)往ip_votes表中插入數(shù)據(jù)的時(shí)候就給count_voting表中的CountVotes字段加1。還能后出最后一句是設(shè)置外部關(guān)聯(lián)字。
框架設(shè)計(jì)
OperatorDB類用于操作數(shù)據(jù)庫(kù),OperatorVotingDB類用于該系統(tǒng)特定的操作集合。
使用PDO操作數(shù)據(jù)庫(kù),我它簡(jiǎn)單的封裝一下:
復(fù)制代碼 代碼如下:
/**
* 操作數(shù)據(jù)庫(kù)
* 封裝PDO,使其方便自己的操作
*/
class OperatorDB
{
//連接數(shù)據(jù)庫(kù)的基本信息
private $dbms='mysql'; //數(shù)據(jù)庫(kù)類型,對(duì)于開發(fā)者來(lái)說(shuō),使用不同的數(shù)據(jù)庫(kù),只要改這個(gè).
private $host='localhost'; //數(shù)據(jù)庫(kù)主機(jī)名
private $dbName='voting'; //使用的數(shù)據(jù)庫(kù)
private $user='voting'; //數(shù)據(jù)庫(kù)連接用戶名
private $passwd='voting'; //對(duì)應(yīng)的密碼
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);//初始化一個(gè)PDO對(duì)象,就是創(chuàng)建了數(shù)據(jù)庫(kù)連接對(duì)象$db
}
catch(PDOException $e)
{
die("<br/>數(shù)據(jù)庫(kù)連接失敗(creater PDO Error!): ".$e->getMessage()."<br/>");
}
}
public function __destruct()
{
$this->pdo = null;
}
public function exec($sql)
{
}
public function query($sql)
{
}
}

把連接數(shù)據(jù)庫(kù)的信息封裝進(jìn)去方便后續(xù)的操作。
復(fù)制代碼 代碼如下:
<?php
require_once 'OperatorDB.php';
class OperatorVotingDB
{
private $odb;
public function __construct()
{
$this->odb = new OperatorDB();
}
public function __destruct()
{
$this->odb = null;
}
/**
* 清空Voting數(shù)據(jù)中的所有表
*
* 調(diào)用數(shù)據(jù)庫(kù)操作類,執(zhí)行clear數(shù)據(jù)庫(kù)的操作
*/
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計(jì)算出的today時(shí)間
// echo $time."<br>";
// echo $row[0][0];
if ($time-$row[0][0]<1)//表中最大的時(shí)間和現(xiàn)在的時(shí)間$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);
}
/**
* 獲取總投票情況,按票數(shù)排序的結(jié)果
*
* 按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);
}
/**
* 獲取投票情況,按票數(shù)排序并按標(biāo)簽分組的結(jié)果
*
* 按CountVotes字段排序并按LabelName字段分組,返回count_voting表
*/
public function getVotesGroupByLabel()
{
$sql = "SELECT * FROM count_voting ORDER BY LabelName DESC;";
// echo $sql;
return $this->odb->query($sql);
}
}
?>

下面還有需要的函數(shù)
復(fù)制代碼 代碼如下:
<?php
/**
* 頁(yè)面跳轉(zhuǎn)函數(shù)
* 使用js實(shí)現(xiàn)
* @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 = '/(?<=本站主數(shù)據(jù):<//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;
}
?>

然后就是后臺(tái)管理員的操作怎么弄了,主要是添加投票項(xiàng)的功能,操作數(shù)據(jù)庫(kù)上面已經(jīng)實(shí)現(xiàn)。后面的基本上是頁(yè)面怎么設(shè)置,關(guān)系到j(luò)s。添加投票項(xiàng)的頁(yè)面是動(dòng)態(tài)的,如下:
復(fù)制代碼 代碼如下:
function addVote()
{
right.innerHTML="<h2>添加投票項(xiàng)</h2>";
right.innerHTML+="<label>投票項(xiàng)標(biāo)簽<label>";
addInput("right","cLabelName","地區(qū)名");
right.innerHTML+="<br><label>投票項(xiàng)名稱<label>";
addInput("right","cSelectName","學(xué)校名");
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)
{
//創(chuàng)建input
var input = document.createElement("input");
input.type = "text";
input.id = id;
input.placeholder = pla;
document.getElementById(parent).appendChild(input);
}

效果:

image

清空投票項(xiàng)也差不多,下過(guò)如下:

image

添加投票項(xiàng)是通過(guò)url傳遞變量到add.php頁(yè)面的。
復(fù)制代碼 代碼如下:
<?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=添加成功");
?>

下面是兩個(gè)跳轉(zhuǎn)頁(yè)面的函數(shù),js的(上面func.php中的跳轉(zhuǎn)頁(yè)面函數(shù)也是通過(guò)js實(shí)現(xiàn)的)。
復(fù)制代碼 代碼如下:
//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;
}

還有修改刪除功能沒(méi)有實(shí)現(xiàn)。我應(yīng)該不會(huì)去實(shí)現(xiàn)那個(gè)了吧,js的話和添加功能差不多。

登錄模塊的話網(wǎng)上很多,模仿的。就是提交表單,查找數(shù)據(jù)庫(kù),返回結(jié)果。成功則設(shè)置cookie,后臺(tái)的每個(gè)頁(yè)面都添加了檢測(cè)cookie的功能的。

前端美化
index.php頁(yè)面首先操作數(shù)據(jù)庫(kù)獲取投票項(xiàng)和票數(shù),然后顯示出來(lái)(通過(guò)css+div美化一下框架界面什么的),最后點(diǎn)擊投票按鈕就提交表單,跳轉(zhuǎn)到vote.php頁(yè)面。

css的話我都是抄網(wǎng)上的。我弄的效果如下:

image

這個(gè)東西算是個(gè)很小的信息管理系統(tǒng)吧,我已經(jīng)把這個(gè)東西的源代碼放到github(https://github.com/hanxi/voting)上去了,可以隨意下載修改也可以到腳本之家下載(點(diǎn)擊下載)。歡迎讀者回復(fù)交流,這方面不是我的強(qiáng)項(xiàng),有很多不足之處還望指教。

作者:涵曦(涵曦的技術(shù)博客 - 博客園)
微博:t.qq.com/hanxi1203
出處:hanxi.cnblogs.com

php技術(shù)PHP+MySQL投票系統(tǒng)的設(shè)計(jì)和實(shí)現(xiàn)分享,轉(zhuǎn)載需保留來(lái)源!

鄭重聲明:本文版權(quán)歸原作者所有,轉(zhuǎn)載文章僅為傳播更多信息之目的,如作者信息標(biāo)記有誤,請(qǐng)第一時(shí)間聯(lián)系我們修改或刪除,多謝。

主站蜘蛛池模板: 国产一区二区免费在线 | 久久久久久精 | 亚洲国产一级a毛片 | 一菊综合网成人综合网 | 欧美国产亚洲精品a第一页 欧美国产一区二区二区 | 另类视频综合 | 99精品视频在线视频免费观看 | 久久国产影视免费精品 | 色久优优 | 国产精品网站 夜色 | 免费国产h视频在线观看 | 国产日韩欧美综合一区二区三区 | 性欧美video另类bd | 欧美日韩一区二区三区视频 | 亚洲三级天堂 | 大香网伊人久久综合网2020 | 成人福利在线视频 | 青草视频国产 | 国产精品亚洲欧美一区麻豆 | 国内精自线一二三四2021小说 | 久久麻豆亚洲精品 | 一区二区三区四 | 91精品自在拍精选久久 | 国产精品网红女主播久久久 | 国产精品美女在线观看 | 久热精品视频在线观看99小说 | 91频视| 色哟哟网站在线观看 | 日本大片免a费观看视频+播放器 | 久久久久久久国产精品 | 久久国产一区二区 | 天天插伊人 | 美女视频黄频大全免费视频 | 2022久久免费精品国产72精品 | 国产精品极品美女免费观看 | 久久免费视频3 | 久久综合中文字幕 | 婷婷久久综合九色综合绿巨人 | 女色窝777777 | 亚洲国产精品免费在线观看 | 丁香七月婷婷 |