程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 網頁編程 >> PHP編程 >> 關於PHP編程 >> php投票系統簡單實現源碼(1/3)

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

編輯:關於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);
    }
}
?>

1 2 3

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved