+ -
当前位置:首页 → 问答吧 → 读第十二章留言簿后的看法

读第十二章留言簿后的看法

时间:2008-04-04

来源:互联网

看完了第十二章后个人感觉这一章在体系上分的挺清,也讲的挺明白的,让读者明白做留言簿要实现的是什么功能,项目划分为几个模块,各个模块的联系是怎么样的,还有数据库的设计上讲的也比较到位.总体来讲对于读者在项目的设计体系把握上能有较大补益.不过作者在最后面说的一句:本章留言板实例可以方便的扩充成功能强大的网络论坛.这句话不是很赞同.个人认为这个留言簿如果用于向读者介绍如何做一个项目,实现这留言簿功能来讲应该还算可以的,基本功能都讲到了.但如果说要做成功能强大的网络论坛的话似乎还差一点.

就比如说留言方面的bbcode,正则表达式之类在文中并未提及,如果为了方便功能扩展,我个人建议是把MYSQL的操作写成一个类文件,直接调用里面的方法,这样对于今后的扩展或许更好些,比如说可以写一个db.inc.php文件,代码可以写成如下:
复制PHP内容到剪贴板
PHP代码:

<?php
/**
功能:数据库的基础操作类
**/
class DBSQL{
 private $CONN = "";         //定义数据库连接变量
 /**
  * 功能:初始化构造函数,连接数据库
  */
 public function __construct(){
  try {           //捕获连接错误并显示错误文件
   $conn = mysql_connect(ServerName,UserName,PassWord);
  }catch (Exception $e)
  {
   $msg = $e;
   include(ERRFILE);
  }
  try {           //捕获数据库选择错误并显示错误文件
   mysql_select_db(DBName,$conn);
  }catch (Exception $e)
  {
   $msg = $e;
   include(ERRFILE);
  }
  $this->CONN = $conn;
 }
 /**
  * 功能:数据库查询函数
  * 参数:$sql SQL语句
  * 返回:二唯数组或false
  */
 public function select($sql = ""){ 
  if (empty($sql)) return false;     //如果SQL语句为空则返回FALSE
  if (empty($this->CONN)) return false;   //如果连接为空则返回FALSE
  try{           //捕获数据库选择错误并显示错误文件
   $results = mysql_query($sql,$this->CONN);
  }catch (Exception $e){
   $msg = $e;
   include(ERRFILE);
  }  
  if ((!$results) or (empty($results))) {   //如果查询结果为空则释放结果并返回FALSE
   @mysql_free_result($results);
   return false;
  }
  
  $count = 0;
  $data = array();
  
  while ($row = @mysql_fetch_array($results)) { //把查询结果重组成一个二维数组
   $data[$count] = $row;
   $count++;
  }
  
  @mysql_free_result($results);
  
  return $data;
 }
 /**
  * 功能:数据插入函数
  * 参数:$sql SQL语句
  * 返回:0或新插入数据的ID
  */
 public function insert($sql = ""){
  if (empty($sql)) return 0;      //如果SQL语句为空则返回FALSE
  if (empty($this->CONN)) return 0;    //如果连接为空则返回FALSE
  try{           //捕获数据库选择错误并显示错误文件
   $results = mysql_query($sql,$this->CONN);
  }catch(Exception $e){
   $msg = $e;
   include(ERRFILE);
  }
  if (!$results)          //如果插入失败返回0,否则返回当前插入数据ID
   return 0;
  else
   return @mysql_insert_id($this->CONN);
 }
 
 /**
  * 功能:数据更新函数
  * 参数:$sql SQL语句
  * 返回:TRUE OR FALSE
  */
 public function update($sql = ""){
  if(empty($sql)) return false;     //如果SQL语句为空则返回FALSE
  if(empty($this->CONN)) return false;   //如果连接为空则返回FALSE
  try{           //捕获数据库选择错误并显示错误文件
   $result = mysql_query($sql,$this->CONN);
  }catch(Exception $e){
   $msg = $e;
   include(ERRFILE);
  }
  return $result;
 }
 /**
  * 功能:数据删除函数
  * 参数:$sql SQL语句
  * 返回:TRUE OR FALSE
  */
 public function delete($sql = ""){
  if(empty($sql)) return false;     //如果SQL语句为空则返回FALSE
  if(empty($this->CONN)) return false;   //如果连接为空则返回FALSE
  try{
   $result = mysql_query($sql,$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("COMMIT");
 }
 /**
  * 功能:提取指定表的指定ID的记录
  * 参数:$id 表ID,$name 表名称
  * 返回:数组
  */
 public function getInfo($id,$name)
 {
  $sql = "SELECT * FROM " . $name . " WHERE F_ID = $id";
  $r = $this->select($sql);
  return $r[0];
 }
 /**
  * 功能:向指定表中插入数据
  * 参数:$name 表名称,$data 数组(格式:$data['字段名'] = 值)
  * 返回:插入记录ID
  */
 public function insertData($name,$data)
 {
  $field = implode(',',array_keys($data));   //定义sql语句的字段部分
  $i = 0;
  foreach($data as $key => $val)      //组合sql语句的值部分
  {
   $value .= "'" . $val . "'";
   if($i < count($data) - 1)      //判断是否到数组的最后一个值
    $value .= ",";
   $i++;
  }
  $sql = "INSERT INTO " . $name . "(" . $field . ") VALUES(" . $value . ")";
  return $this->insert($sql);
 }
 /**
 * 功能:更新指定表指定ID的调查表记录
 * 参数:$name 表名称,$id 表ID,$data 数组(格式:$data['字段名'] = 值)
 * 返回:TRUE OR FALSE
 */
 public 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,$name 表名称
  * 返回:TRUE OR FALSE
  */
 public function delData($id,$name)
 {
  $sql = "DELETE FROM " . $name . " WHERE F_ID = $id";
  return $this->delete($sql);
 }
}
?>

这样在需要调用数据库的地方只需require或者include这个文件,然后建立一个实例去调用里面的方法就好,这样对于代码的精简和今后的扩展或许更好些.

另外看后我觉得在以下方面也还可以进行改进:
1.email的js检测部分可以用正则表达式来进行检测:
   这样可以精简一些代码而且也可以让读者更多的看到新技术的应用.email的JS检测方面可以写成这样:
复制内容到剪贴板
代码:

var emailStr=msgform.email.value;
var emailPat=/^(.+)@(.+)$/;
var matchArray=emailStr.match(emailPat);
if (matchArray==null) {
alert("电子邮件地址必须包括 ( @ 和 . )")
return false;
这样就可以精简不少代码了,而且可以把上面的这些表单检测的直接放入一个js文件,在所需要进行检测的将这个js文件引入就可以了.

2.部分文件代码可以合二为一.如签写留言和保存留言的文件完全可以合为一个文件,只需要程序里去判断是否有变量传递了,如果有变量传递则认为是保存留言.还有就是可以把管理员查看留言和用户查看留言的代码放入一个文件里.只需用session来控制是否是管理员,如果是则显示相关的管理选项:如删除,修改之类.

3.在browse.php查看留言列表里,在显示留言标题时,文中用到的是
<a href=display.php?mesid=$row[MesID]>$row[title]($len字节)</a>

个人觉得为了防止因为标题过长使页面布局被打乱,可以改写成以下形式:
<a href=display.php?mesid=$row[MesID] title=$row[title]><?php
if $len>15
echo substr($row[title],,0,15);
else
echo $row[title]."..."
?></a>

这样写或许更好些.

基本写这些吧,累死了,呵呵.
总体感觉这一章对于初学者或者没有项目经验的人来说应该说是有挺大帮助的.但是如果想要程序今后有较好的扩展,可能还需要在一些方面改进下.以上仅为个人看法,如果有说的不对的还请各位老大谅解.

作者: 独孤剑   发布时间: 2008-04-03

呵呵不好意思刚刚写时有点急了,上面有点错误,应该是
<a href=display.php?mesid=$row[MesID] title=$row[title]><?php
if $len>15
echo substr($row[title],,0,15)."...";
else
echo $row[title]
?></a>

作者: 独孤剑   发布时间: 2008-04-03

谢谢LZ

作者: 疯狂小猫   发布时间: 2008-04-11

作者: 125231896   发布时间: 2008-05-08

站在巨人的肩膀。。。一起展望吧

作者: chinahuhai   发布时间: 2008-05-15

热门下载

更多