《php+mysql经典案例剖析版2011.doc》由会员分享,可在线阅读,更多相关《php+mysql经典案例剖析版2011.doc(35页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、【精品文档】如有侵权,请联系网站删除,仅供学习与交流php+mysql经典案例剖析版2011.精品文档.111最新版 2011第 第 章章导读投票系统(PHP+MySQL)动态链接库: 投票添加功能: 区域统计: 图形显示: IP来源判断投票系统是一般网站常用的一种系统。它是一种在网站上提出调查题目,由用户在线投票并对调查投票的统计结果直接显示的调查工具。网站可以通过投票系统统计的数据来了解用户对一些热点问题的看法。通常可以用投票系统来了解用户对网站的态度,对网站服务的评价或对网站新推出的新产品或服务的反映等。通过投票系统搜集的信息可以对网站做出相应改进。1.1 系 统 分 析本节通过系统背景
2、、系统模块分析和系统流程图3个方面来对系统进行分析。1.1.1 系统背景从国际互联网到校园网、企业局域网,各种网上投票系统随处可见。意见调查、用户信息统计、经营情况调查都可以作为投票的内容。网上投票系统凭借其方便快捷等特点,已经成为互联网资源中不可缺少的一部分。网上投票系统是网站搜集用户需求并有效地实施市场策略的重要手段之一。通过开展问卷调查,可以迅速了解不同行业、不同区域用户的需求,客观地搜集需求信息,及时调整网站的营销策略以满足不同的需求。随着网络技术的发展,网上投票系统的作用将会越来越大。1.1.2 系统模块分析为了更合理地设计投票系统,需要从以下3点进行分析。1投票的形式网上投票系统是
3、网站搜集用户需求信息的一个途径,可以根据网站的需要设置一个或多个调查。不同的调查需要设置不同的选项,不同的调查要求,选项的形式也是不同的(单选或多选),不同时间段又会有不同的调查。既然网站要通过投票系统搜集信息,那么投票就必须有结果和对用户信息的统计。2投票的特点由于互联网本身的开放性,使网上投票面临种种危险,也由此提出了相应的安全控制要求。q 信息保密性:投票者有保密的要求。如果用户名及投票内容被人知悉,就对用户的隐私权构成了侵害。因此在网上投票系统中一般均有匿名投票的要求。q 投票唯一性:一个投票者,其投票次数应当只有一次。若投票者可进行多次投票,这将对调查内容的可靠性构成严重的威胁。有了
4、这些特殊性的要求,就需要对用户的信息和投票进行检查和处理,以保证投票的客观和有效性。针对用户信息,如果无特殊的要求(例如只允许注册会员参加),那么系统就只需要记录的IP、投票时间、用户所在区域。投票结果的显示是非常重要的,一是用户希望自己的投票能够及时反映出来;二是投票的结果也是给希望投票的用户的一个参考。3投票系统结构根据投票系统对形式的需求和投票系统自身的特点,需要包含以下几个模块。q 投票管理模块:该模块可以添加、编辑和删除调查选项,设置调查选项为多选或单选,设置调查的时间期限,设置此调查是否启用,调查结果的统计显示。q 调查显示模块:该模块的功能是显示已启用、未过期的调查。q 投票处理
5、模块:该模块需要对投票进行有效性检查,并将投票结果和用户信息写入数据库。q 调查结果显示模块:该模块主要是计算每个调查选项统计结果的百分比并以图表的形式显示 出来。q 数据库操作的基础模块:该模块定义了连接数据库、表的查询,数据的插入、更新和删除操作。该模块作为一个通用模块将会在后面的章节用到。1.1.3 系统流程图根据以上分析,系统的流程如图1.1所示。在该流程中,网站管理员在投票管理里面添加调查数据,然后在调查显示模块里面显示出来。用户通过调查显示的“投票”按钮投票,数据被传递到投票处理模块,处理之后转到调查结果显示页面。用户也可以通过调查显示的“查看结果”按钮直接转到调查结果显示页面。图
6、1.1 系统流程图1.2 数据库建立通过1.1节对投票系统功能的分析可知,需要存储的信息有调查信息、调查选项信息和用户信息。因此,本系统需要建立调查信息表、调查选项信息表和用户信息表。先从图1.2来分析这几个表之间的 关系。从图1.2可以看出调查信息、调查选项信息和用户信息都是1对多的关系,并通过调查信息ID关联。构架的投票系统数据库vote(采用MySQL数据库)如表1.1表1.3所示。图1.2 数据表关系图表1.1 调查信息表:EM_VOTE_INFO用于存储调查内容字 段 名类型(长度)描 述主 键是否为空默认值备 注F_IDINT(10)表ID(唯一)是否自动增加F_VOTE_TITL
7、EVARCHAR(255)调查标题否否F_VOTE_STARTINT(10)TIMESTAMP调查开始时间否是F_VOTE_ENDINT(10)TIMESTAMP调查结束时间否是F_VOTE_ITEM_TYPETINYINT调查选项类型否否11为单选(默认)2为多选F_VOTE_IS_DISPLAYTINYINT是否启用否否11为启用(默认)0为禁用表1.2 调查选项信息表:EE_ITEM_INFO用于存储调查的选项信息字 段 名类型(长度)描 述主 键是否为空默认值备 注F_IDINT(10)表ID(唯一)是否自动增加F_ID_VOTE_INFOINT(10)调查表ID否否与调查表关联F_I
8、TEM_TITLEVARCHAR(50)选项标题否否F_ITEM_COUNTINT(10)统计数量否否0F_ITEM_ORDERTINYINT选项排列顺序否否01为单选(默认)表1.3 调查用户信息表:EE_VOTE_USER用于存储用户信息字 段 名类型(长度)描 述主 键是否为空默认值备 注F_IDINT(10)表ID(唯一)是否自动增加F_ID_VOTE_INFOINT(10)调查表ID否否与调查表关联F_USER_IPINT(15)用户IP否否续表字 段 名类型(长度)描 述主 键是否为空默认值备 注F_USER_TIMEINT(10)TIMESTAMP统计时间否否F_USER_ARE
9、AVARCHAR(20)用户所在区域否否1.3 数据库操作基础模块数据操作基础模块主要实现数据库连接以及对数据库表的一些基本操作功能。它包括配置文件和数据库操作文件。下面分别对它们做详细讲解。1.3.1 配置文件config.inc.php建立配置文件是系统构架需要考虑的重点。因为在一个系统里会有一些常用的参数在很多地方可以用到,如果到使用的时候才定义,那么需要修改的时候就会相当的麻烦,而且容易出错,代码的可读性也很差。在配置文件里放的主要是数据库连接用的参数和一些全局变量。代码如下:?php define(UserName, root);/数据库连接用户名define(PassWord, r
10、oot);/数据库连接密码define(ServerName, localhost);/数据库服务器的名称define(DBName,Languagevote);/数据库名称define(ERRFILE,err.php);/错误处理显示文件define(ROOT_PATH, dirname(_FILE_) . /);/定义根目录路径define(INCLUDE_PATH, ROOT_PATH . include/);/定义包含文件目录路径1.3.2 数据操作文件db.inc.phpPHP是一种面向对象的编程语言。这个数据操作文件主要用于建立一个类。该类的初始化构造函数可以连接数据库和表。其他的
11、方法包括对表的查询、数据的插入、更新、删除操作和事务处理。事务处理是用在执行多个更新或删除操作时为了保证数据完整性而使用的。把这些基本操作封装在一个模块里面对于代码的可读性、系统的扩展性和健壮性都有好处。代码如下:CONN = $conn; * 功能:数据库查询函数 * 参数:$sql SQL语句 * 返回:二维数组或falsepublic function select($sql = )if (empty($sql) return false;/如果SQL语句为空则返回falseif (empty($this-CONN) return false;/如果连接为空则返回falsetry/捕获数
12、据库选择错误并显示错误文件$results = mysql_query($sql,$this-CONN);catch (Exception $e)$msg = $e;include(ERRFILE);if (!$results) or (empty($results) /如果查询结果为空则释放结果并返回falsemysql_free_result($results);return false;$count = 0;$data = array();while ($row = mysql_fetch_array($results) /把查询结果重组成一个二维数组$data$count = $row
13、;$count+;mysql_free_result($results);return $data; * 功能:数据插入函数 * 参数:$sql SQL语句 * 返回:0或新插入数据的IDpublic function insert($sql = )if (empty($sql) return 0;/如果SQL语句为空则返回falseif (empty($this-CONN) return 0;/如果连接为空则返回falsetry/捕获数据库选择错误并显示错误文件$results = mysql_query($sql,$this-CONN);catch(Exception $e)$msg =
14、$e;include(ERRFILE);if (!$results) /如果插入失败就返回0,否则返回当前插入数据IDreturn 0;elsereturn mysql_insert_id($this-CONN); * 功能:数据更新函数 * 参数:$sql SQL语句 * 返回:TRUE OR FALSEpublic function update($sql = )if(empty($sql) return false;/如果SQL语句为空则返回falseif(empty($this-CONN) return false;/如果连接为空则返回falsetry/捕获数据库选择错误并显示错误文件
15、$result = mysql_query($sql,$this-CONN);catch(Exception $e)$msg = $e;include(ERRFILE);return $result; * 功能:数据删除函数 * 参数:$sql SQL语句 * 返回:TRUE OR FALSEpublic function delete($sql = )if(empty($sql) return false;/如果SQL语句为空则返回falseif(empty($this-CONN) return false;/如果连接为空则返回falsetry$result = mysql_query($s
16、ql,$this-CONN);catch(Exception $e)$msg = $e;include(ERRFILE);return $result; * 功能:定义事务public function begintransaction()mysql_query(SET AUTOCOMMIT=0);/设置为不自动提交,因为MySQL默认立即执行mysql_query(BEGIN);/开始事务定义 * 功能:回滚public function rollback()mysql_query(ROOLBACK); * 功能:提交执行public function commit()mysql_query
17、(COMMIT);1.4 投票管理模块投票管理模块用于实现网站管理员对投票数据的管理,可以添加、编辑、删除调查选项,还可以查看调查统计的信息。该模块包括调查类文件、调查列表文件、添加调查文件、编辑调查文件、删除调查文件以及用户统计文件。下面对这几个文件分别进行讲解。1.4.1 调查类文件vote.inc.php该文件是一个类文件。它的功能主要是对调查信息、表1.2和表1.3的操作,除一些基本操作外,在开发的过程中还可以根据需要添加其他的操作。调查类文件作为一个包含文件被调用。代码如下:单选,/定义选项类型2=多选);public $_display = array(0=禁用,/定义调查启用显示
18、1=启用);private function _construct()parent:_construct();* 功能:提取调查列表* 返回:数组public function getVoteList()$sql = SELECT * FROM . $this-_name;return $this-select($sql); * 功能:提取指定表的指定ID的记录 * 参数:$id 表ID,$name 表名称 * 返回:数组public function getInfo($id,$name)$sql = SELECT * FROM . $name . WHERE F_ID = $id;$r =
19、$this-select($sql);return $r0; * 功能:向指定表中插入数据 * 参数:$name 表名称,$data 数组(格式:$data字段名 = 值) * 返回:插入记录IDpublic function insertData($name,$data)$field = implode(,array_keys($data);/定义SQL语句的字段部分foreach($data as $key = $val)/组合SQL语句的值部分$value .= . $val . ;if($key insert($sql);* 功能:更新指定表指定ID的调查表记录* 参数:$name 表
20、名称,$id 表ID,$data 数组(格式:$data字段名 = 值)* 返回:TRUE OR FALSEpublic function updateData($name,$id,$data) $col = array();foreach ($data as $key = $value)$col = $key . = . $value . ;$sql = UPDATE . $name . SET . implode(,$col) . WHERE F_ID = $id;return $this-update($sql);* 功能:删除指定ID的调查表记录及相关表记录* 参数:$id 调查表ID
21、* 返回:TRUE OR FALSEpublic function delData($id)$this-begintransaction();try$sql = DELETE FROM . $this-_item . WHERE F_ID_VOTE_INFO = . $id;$this-delete($sql);/删除调查选项里面的相关数据$sql = DELETE FROM . $this-_user . WHERE F_ID_VOTE_INFO = . $id;$this-delete($sql);/删除用户统计表里面的相关数据$sql = DELETE FROM . $this-_nam
22、e . WHERE F_ID = . $id;$this-delete($sql);catch(Exception $e)$this-rollback();return false;$this-commit();return true; * 功能:提取指定调查ID的选项 * 参数:$vote_id 调查ID * 返回:数组public function getItemList($vote_id)$sql = SELECT * FROM . $this-_item . WHERE F_ID_VOTE_INFO = $vote_id;return $this-select($sql); * 功能:
23、删除指定ID的选项表记录 * 参数:$id 表ID * 返回:TRUE OR FALSEpublic function delItemData($id)$sql = DELETE FROM . $this-_item . WHERE F_ID = $id;return $this-delete($sql);$sql .= “ ORDER BY F_ITEM_ORDER”; * 功能:提取指定调查ID的用户统计信息 * 参数:$vote_id 调查ID,$page 当前页码 * 返回:数组public function getUserList($vote_id,$page=1)$start =
24、($page - 1) * $this-_pagesize;$sql = SELECT * FROM . $this-_user . WHERE F_ID_VOTE_INFO = $vote_id;$sql .= LIMIT $start,$this-_pagesize;return $this-select($sql); * 功能:提取指定调查ID用户统计记录的条数 * 参数:$vote_id 调查ID * 返回:记录条数public function getUserCount($vote_id)$sql = SELECT COUNT(F_ID) FROM . $this-_user . W
25、HERE F_ID_VOTE_INFO = $vote_id;$r = $this-select($sql);return $r00; * 功能:删除指定ID的用户统计记录 * 参数:$id 用户统计表ID * 返回:TRUE OR FALSEpublic function delUserData($id)$sql = DELETE FROM . $this-_user . WHERE F_ID = $id;return $this-delete($sql);对单个表进行查询、插入、更新和删除时的代码很相似,唯一不同的是操作表的名称。这里可以把这些对单个表的基本操作放到基础类文件db.inc.
26、php里面。加入如下代码: * 功能:提取指定表的指定ID的记录 * 参数:$id 表ID,$name 表名称 * 返回:数组public function getInfo($id,$name)$sql = SELECT * FROM . $name . WHERE F_ID = $id;$r = $this-select($sql);return $r0; * 功能:向指定表中插入数据 * 参数:$name 表名称,$data 数组(格式:$data字段名 = 值) * 返回:插入记录IDpublic function insertData($name,$data)$field = impl
27、ode(,array_keys($data);/定义SQL语句的字段部分$i = 0;foreach($data as $key = $val)/组合SQL语句的值部分$value .= . $val . ;if($i insert($sql);* 功能:更新指定表指定ID的调查表记录* 参数:$name 表名称,$id 表ID,$data 数组(格式:$data字段名 = 值)* 返回:TRUE OR FALSEpublic function updateData($name,$id,$data) $col = array();foreach ($data as $key = $value)
28、$col = $key . = . $value . ;$sql = UPDATE . $name . SET . implode(,$col) . WHERE F_ID = $id;return $this-update($sql); * 功能:删除指定ID的表记录 * 参数:$id表ID,$name 表名称 * 返回:TRUE OR FALSEpublic function delData($id,$name)$sql = DELETE FROM . $name . WHERE F_ID = $id;return $this-delete($sql);1.4.2 调查列表文件VoteLis
29、t.php该文件的功能是显示调查信息表1.1中的数据列表。该文件包含配置文件调查类文件。提取列表的数据是通过调查类文件里面的提取列表方法来实现的。首先声明一个调查类Vote的对象,通过这个对象来调用类的提取列表方法getVoteList()。通过这个页面连接到添加、编辑、选项管理、用户统计及删除操作页面。界面如图1.3所示。图1.3 调查列表代码如下:getVoteList();$time = time(); 序号 调查标题 开始时间 结束时间 选项类型 是否过期 是否启用 操作 $value) _type$valueF_VOTE_ITEM_TYPE? $time) echo 未过期;else
30、 echo 已过期;? _display$valueF_VOTE_IS_DISPLAY? a href=EditVote.php?id=编辑 a href= ItemList.php?id=选项管理 a href=UserList.php?id=用户统计信息 a href=DelVote.php?id=删除 ?php 1.4.3 添加调查文件AddVote.php该文件的功能是添加新调查,将数据写入表1.1中。该文件由图1.3中调查列表页面的“添加调查”按钮连接过来。用户填写完表单后单击“提交”按钮进行处理。表单提交给自身,通过判断是否为提交操作进行数据处理。数据的处理通过调查类Vote的对象调用父类DBSQL的insertData()方法实现的,界面如图1.4所示。图1.4 添加调查1主程序部分该部分代码用于实现提交数据的处理和操作界面的显示。代码如下:insertData($vote-_name,$data)/判断是否操作成功echo 操作成功; elseecho 操作失败;echo 返回;exit(); 调查标题: 所属类型: _type as $key = $value)/循环显示类型选择下拉列表框echo $value; tr cla