需求:
1.使用者訪問votesys.com可以顯示投票的項目的列表資訊,可以進行投票,可以限制投票的次數。
2.後台可以對投票的項目進行增加,增加的時候有驗證(伺服器的驗證)
3.後台可以添加禁用的IP,被禁用的Ip不可以進行投票。
建立資料庫:votedb
資料庫表的建立:
--選項表,MyISAM和InnoDB區別是InnoDB有外鍵,MyISAM運行快。create table item(--選項編號id bigint unsigned primary key auto_increment,--選項名稱name varchar(64) not null,--選項描述description varchar(128) not null,--投票次數vote_count bigint unsigned)engine MyISAM;--投票日誌表create table vote_log(--投票日誌IDid bigint unsigned primary key auto_increment,--投票者IP地址ip varchar(20) not null,--投票者日期vote_date bigint not null,--對哪個投的item_id bigint not null)engine MyISAM;--過濾IP表create table filter(id bigint unsigned primary key auto_increment,ip varchar(20))engine MyISAM;
在DOS建立項目:
zf.bat create project d:/myvotesys
在zs中建立空項目votesys並copy已經建立好的專案檔。
然後在hosts檔案中加入:
127.0.0.1 votesys.com
然後配置虛擬機器主機:
在httpd-vhosts.conf檔案中加入
#投票系統
<VirtualHost *:80>
DocumentRoot "C:/myenv/apache/htdocs/votesys/public"
ServerName votesys.com
DirectoryIndex index.php
<Directory />
Options FollowSymLinks
AllowOverride None
Order allow,deny
Allow from all
</Directory>
</VirtualHost>
application.ini
[production]phpSettings.display_startup_errors = 0phpSettings.display_errors = 0includePaths.library = APPLICATION_PATH "/../library"bootstrap.path = APPLICATION_PATH "/Bootstrap.php"bootstrap.class = "Bootstrap"appnamespace = "Application"resources.frontController.controllerDirectory = APPLICATION_PATH "/controllers"resources.frontController.params.displayExceptions = 0[mysql]db.adapter=PDO_MYSQLdb.params.host=localhostdb.params.username=rootdb.params.password=rootdb.params.dbname=votedb
AdminController.php
<?php//如果檔案在同一級目錄下,直接寫入檔案名稱引入即可//如果檔案不再同一級的目錄下面,需要用絕對路徑進行引入require_once 'BaseController.php';require_once APPLICATION_PATH . '/models/Item.php';require_once APPLICATION_PATH . '/models/Filter.php';/** * * @author Administrator *這個控制器專門用來管理後台 */class AdminController extends BaseController {/** * 跳轉到index.php頁面的Action * index.php是首頁顯示頭片項目列表 * 以及投票的投票次數,投票操作的首頁面 */public function indexAction() {// action body}/** * 進入到後台增加投票選項的頁面 *用於添加需要投票的項目 *如蘋果,鴨梨...... */public function additemuiAction() {//如果action中什麼都沒有寫,相當於$this->render ( 'additemui' );}/** * 處理投票項目添加的請求 * 通過這個方法可以向資料庫中的item表中插入 *新的投票項目 */public function additemAction() {//擷取使用者輸入的內容$name = $this->getRequest ()->getParam ( 'name' );if ($name == "") {$this->view->info = '您輸入的名字為空白';//顯示資訊$this->_forward ( 'error', 'global' );return;}$description = $this->getRequest ()->getParam ( 'description' );//$vote_count = $this->getRequest ()->getParam ( 'vote_count' );//使用$vote_count = empty ( $_REQUEST ['vote_count'] ) ? 0 : $_REQUEST ['vote_count'];//在伺服器對輸入的資料進行驗證//echo $name.'--'.$description.'--'.$vote_count;//exit();//數組$data = array ('name' => $name, 'description' => $description, 'vote_count' => $vote_count );//建立一個表模型對象$itemModel = new Item ();$itemModel->insert ( $data );//插入資料記錄成功,跳轉到$this->render ( 'ok' );}/** * 用於處理增加過濾ip超連結請求的action * 通過render跳轉到添加過濾ip頁面 */public function addfilteripuiAction() {$this->render ( 'addfilterip' );}/** * 響應增加ip的請求 * 用於向資料庫中添加一個封殺的ip地址 */public function addfilteripAction() {//擷取使用者輸入的ip是多少$ip = $this->getRequest ()->getParam ( 'ip' );$filterModel = new Filter ();//添加到資料庫中一個記錄$data = array ('ip' => $ip );if ($filterModel->insert ( $data ) > 0) {//說明在資料庫中添加資料成功,跳轉到全域視圖//跳轉到globalController下的okAction方法對應的視圖ok.phtml//添加返回的資訊$this->view->info = '增加過濾IP成功!';$this->_forward ( 'ok', 'global' );} else {$this->view->info = '增加過濾IP失敗!';$this->_forward ( 'error', 'global' );}}}
BaseController.php
<?php//做一個父類,專門供其它的controller來繼承class BaseController extends Zend_Controller_Action {public function init() {//初始化我們的資料庫適配器$url = constant ( "APPLICATION_PATH" ) . DIRECTORY_SEPARATOR . 'configs' . DIRECTORY_SEPARATOR . 'application.ini';$dbconfig = new Zend_Config_Ini ( $url, "mysql" );$db = Zend_Db::factory ( $dbconfig->db );$db->query ( 'SET NAMES UTF8' );Zend_Db_Table::setDefaultAdapter ( $db );}}?>
GlobalController.php
<?phprequire_once 'BaseController.php';/** * * @author Administrator */class GlobalController extends BaseController {//跳轉到ok介面public function okAction() {}//跳轉到error介面public function errorAction() {}}
IndexController.php
<?phprequire_once 'BaseController.php';require_once APPLICATION_PATH . '/models/Item.php';class IndexController extends BaseController {public function indexAction() {//建立一個item表模型$itemModel = new Item ();$items = $itemModel->fetchAll ()->toArray ();//echo "<pre>";//print_r($items);//echo "</pre>";//exit();$this->view->items = $items;}}
VoteController.php
<?phprequire_once 'BaseController.php';require_once APPLICATION_PATH . '/models/Item.php';require_once APPLICATION_PATH . '/models/VoteLog.php';require_once APPLICATION_PATH . '/models/Filter.php';/** * * @author Administrator *這個控制器專門用來處理投票請求 */class VoteController extends BaseController {/** * 跳轉到index.php頁面的Action */public function voteAction() {//echo "oooook";//exit();//擷取使用者投票的Id$item_id = $this->getRequest ()->getParam ( 'itemid', 'no' );//擷取ip地址//$_SERVER ['REMOTE_ADDR'];$ip = $this->getRequest ()->getServer ( 'REMOTE_ADDR' );//看看該使用者的ip是否被禁用$filterModel=new Filter();$filters=$filterModel->fetchAll("ip='$ip'")->toArray();if(count($filters)>=1){$this->view->info='您的IP被禁用了!您不能投票了!'; $this->_forward('error','global'); return ;}//echo $item_id . "--" . $ip;//exit();//擷取當前日期$today = date ( 'Ymd' );//先看看vote_log表中是否投過一次//建立votelog執行個體$voteLogModel = new VoteLog ();//條件陳述式$where = "ip='$ip' AND vote_date=$today";$res = $voteLogModel->fetchAll ( $where )->toArray ();if (count ( $res ) > 5) {//提示一句話$this->render ( 'error' );return;} else {//更新vote_count,添加投票日誌$data = array ('ip' => $ip, 'vote_date' => $today, 'item_id' => $item_id );if ($voteLogModel->insert ( $data ) > 0) {//如果返回的數值大於0,添加成功//更新$itemModel = new Item ();//通過主鍵擷取對應的記錄$item = $itemModel->find ( $item_id )->toArray ();$newvote = $item [0] ['vote_count'] + 1;$set = array ('vote_count' => $newvote );$where = "id=$item_id";$itemModel->update ( $set, $where );}$this->render ( 'ok' );}}}
Filter.php
<?php/** * 這裡必須繼承zend_db_table 否則就不是表模型 */class Filter extends Zend_Db_Table {//預設的主鍵為IDprotected $_name = 'filter';}?>
Item.php
<?php/** * 這裡必須繼承zend_db_table 否則就不是表模型 */class Item extends Zend_Db_Table {//預設的主鍵為IDprotected $_name = 'item';}?>
VoteLog.php
<?php/** * 這裡必須繼承zend_db_table 否則就不是表模型 */class VoteLog extends Zend_Db_Table {//預設的主鍵為ID,設定和對應的表關聯protected $_name = 'vote_log';}?>
addfilterip.phtml
<h1>增加過濾ip</h1><form action='/admin/addfilterip' method='post'><table><tr><td>ip地址</td><td><input type='text' name='ip' /></td></tr><tr><td><input type='submit' value='增加' /></td><td><input type='reset' value='重填' /></td></tr></table></form>
additemui.phtml
<h1>增加投票選項</h1><form action='/admin/additem' method='post'><table><tr><td>名稱</td><td><input type='text' name='name' /></td></tr><tr><td>描述</td><td><textarea rows="5" cols="30" name="description"></textarea></td></tr><tr><td>初始化投票數</td><td><input type='text' name='vote_count' /></td></tr><tr><td><input type='submit' value='增加' /></td><td><input type='reset' value='重填' /></td></tr></table></form>
index.phtml
<h1>投票的後台管理程式</h1><ul><li><a href='/admin/additemui'>增加投票選項</a></li><li><a href="/admin/addfilteripui">增加過濾IP</a></li></ul>
ok.phtml
<script type="text/javascript">alert('投票操作成功!');history.back();</script>
error.phtml
<script type="text/javascript">alert('<?phpecho $this->info?>');history.back();</script>
ok.phtml
<script type="text/javascript">alert('<?phpecho $this->info?>');history.back();</script>
index.phtml
<link href="/css/mycss.css" type="text/css" rel="stylesheet" /><script type="text/javascript" src="/js/myjs.js"></script><h1>請你投票</h1><div id="img"><img src="/images/logo.gif" width="640px" height="480px" /></div><table border="1" cellspacing="0" bordercolor="green" width="500px"height="200px"><tr bgcolor="yellow"><td>name</td><td>description</td><td>vote_count</td><td>vote</td></tr><?phpforeach ( $this->items as $item ) {?><tr><td><?phpecho $item ["name"]?></td><td><?phpecho $item ['description']?></td><td><?phpecho $item ['vote_count']?></td><td><a href="/vote/vote?itemid=<?phpecho $item ['id']?>">投票</a></td></tr><?php}?></table>
error.phtml
<script type="text/javascript">alert('您今天投票的次數已經木有了,不能再進行投票了^v^~');history.back();</script>
ok.phtml
<script type="text/javascript">alert('投票操作成功!');history.back();</script>
目錄:
檔案按照目錄的順序書寫。
訪問後台:
超級個性的首頁面:
項目資源檔:http://download.csdn.net/detail/u010653050/5977835