国产片侵犯亲女视频播放_亚洲精品二区_在线免费国产视频_欧美精品一区二区三区在线_少妇久久久_在线观看av不卡

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術|正則表達式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務器之家 - 編程語言 - PHP教程 - PHP+MySQL投票系統的設計和實現分享

PHP+MySQL投票系統的設計和實現分享

2020-01-12 17:43涵曦 PHP教程

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("<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); 


效果: 

PHP+MySQL投票系統的設計和實現分享

清空投票項也差不多,下過如下:

PHP+MySQL投票系統的設計和實現分享

添加投票項是通過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的話我都是抄網上的。我弄的效果如下: 

PHP+MySQL投票系統的設計和實現分享

這個東西算是個很小的信息管理系統吧,我已經把這個東西的源代碼放到github(https://github.com/hanxi/voting)上去了,可以隨意下載修改也可以到服務器之家下載(點擊下載)。歡迎讀者回復交流,這方面不是我的強項,有很多不足之處還望指教。 

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

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 午夜午夜精品一区二区三区文 | 91精品国产91久久久久久黑人 | 成人激情免费视频 | 国产在线观 | 狠狠干2024| 在线看国产 | wwwav在线播放| 最新国产在线视频 | 免费观看黄色大片 | 久久久国产精品入口麻豆 | 国产精品片aa在线观看 | 国产在线播放91 | av不卡在线 | 国产精品一二三区 | 日韩欧美在线一区 | 日韩电影一区二区三区 | 可以免费看黄的网站 | 在线国产小视频 | 中文字幕在线电影观看 | 国产亚洲一区二区三区 | 成人午夜精品一区二区三区 | 久草中文在线 | 久久国内| 日韩高清在线一区 | 免费观看国产视频在线 | 日产精品一区二区三区在线观看 | 久久免费视频9 | 欧美 日韩 国产 一区 | 成人免费视频网站在线观看 | 亚洲专区 变态 另类 | 精品国产一区探花在线观看 | 久操资源 | 日日日操 | 日韩一二三区视频 | 亚洲电影一区二区 | 丁香久久 | 欧美激情五月 | 欧美片网站免费 | 亚洲精品在线中文字幕 | 欧美在线综合 | 国产欧美日韩专区 |