php投票系統簡單實現源碼(1/3)_PHP教程

來源:互聯網
上載者:User
本文章詳細的介紹了關於投票系統實現原理與實現代碼,有需要的朋友可參考一下。

資料庫的設計
設計三張表:投票結果統計表(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]<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);
}
}
?>

1 2 3

http://www.bkjia.com/PHPjc/444675.htmlwww.bkjia.comtruehttp://www.bkjia.com/PHPjc/444675.htmlTechArticle本文章詳細的介紹了關於投票系統實現原理與實現代碼,有需要的朋友可參考一下。 資料庫的設計 設計三張表:投票結果統計表(count_vo...

  • 聯繫我們

    該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

    如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

    A Free Trial That Lets You Build Big!

    Start building with 50+ products and up to 12 months usage for Elastic Compute Service

    • Sales Support

      1 on 1 presale consultation

    • After-Sales Support

      24/7 Technical Support 6 Free Tickets per Quarter Faster Response

    • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.