+ -
当前位置:首页 → 问答吧 → Smarty结合Ajax实现无刷新留言本实例

Smarty结合Ajax实现无刷新留言本实例

时间:2006-12-18

来源:互联网

看了标题你也许要说,留言本,很基本的东东啊!谁不会啊,还要用Smarty,这不找累吗?别急,我要表达的是一种编程的思想和结构,而不是证明我做的东西多有意义,通过它相信对初学者学习Smarty和ajax有些启发。原本用ajax做的,可惜始终调试不成功,只好用手写JS来弄了,不过不要紧,还是有一定价值的。站点结构大家下了源代码自己看,代码不长,应该不会看烦^_^,听我慢慢道来。
     现在都PHP5了OO(面向对象)很流行了都,这里也不错过,首先来看下我们用OO来实现数据库操作和连接:
复制PHP内容到剪贴板
PHP代码:

<?php
/**************************
   
  页面:dbclass.php
  作者:辉老大
  功能:定义数据库操作类
**************************/
class db{
       //创建构造函数,作用:数据库连接并选择相应数据库
       public function __construct(){
     require('config.inc.php');
           mysql_connect($dbhost,$dbuser,$dbpassword) or die("error!");
     mysql_query("SET NAMES 'GBK'");
           mysql_select_db($dbname);
       }
    //执行SQL语句函数
    public function query($sql){
        return mysql_query($sql);
    }
    //取得结果集数组函数
    public function loop_query($result){
        return mysql_fetch_array($result);
    }
    //创建析构函数,作用:关闭数据库连接
    public function __destruct(){
     return mysql_close();
    }
   }
?>

这个类有什么特点呢?首先介绍下__construct()是构造函数,啥是构造函数?通俗点讲就是类被实例化后就自动执行的函数,__destruct()是啥?是析构函数,它的作用就是在没有任何方法指向这个对象时,便自动销毁对象,里面一般包含一些收尾的操作,比如关闭文件,关闭数据库连接之类的方法,看到这你是不是明白一些了?没错!在类实例化的时候自动执行带有数据库连接方法的构造函数,在实例销毁的时候执行关闭数据库连接的析构函数,对于一些基本数据操作我们只要new一个$db对象,然后$db->query()...是不是很方便,当然,这只是一个简单的例子,你还可以继续扩展。来看看 config.inc.php里面是什么:
复制PHP内容到剪贴板
PHP代码:

<?php
/*************************
  
   页面:config.inc.php
   作者:辉老大
   功能:数据库参数变量设定
   $dbhost:主机名
   $dbuser:连接帐户
   $dbpassword:连接密码
   $dbname:数据库名
*************************/
   $dbhost     = "localhost";
   $dbuser     = "root";
   $dbpassword = "7529639";
   $dbname     = "testdb";
?>

很容易对不对,感兴趣就接着看吧^_^,来看下模板文件:
复制内容到剪贴板
代码:
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gbk" />
<title><{$title}></title>
<style type="text/css">
<!--
.username {
height: 20px;
width: 250px;
}
.comment {
height: 100px;
width: 660px;
}
body,td,tr {
font-size: 9pt;
}
-->
</style>
<script language="javascript" src="./inc/ajax.js"></script>
</head>
<body>
<div align="right" id="check"></div>
<div id="result"><{*这里显示留言内容*}>
<{section name=loop loop=$bookinfo}><{*循环显示留言*}>
用户名:<{$bookinfo[loop].username}> 内容:<{$bookinfo[loop].comment}><p>
<{/section}>
</div>
<form method="post" name="book" id="book">
  <table width="760" border="1" cellpadding="0" cellspacing="0">
    <tr>
      <td width="80" height="30" align="center">用户名:</td>
      <td height="30"> <input name="username" type="text" class="username" id="username"></td>
    </tr>
    <tr>
      <td width="80" height="120" align="center">留言内容:</td>
      <td height="120"> <textarea name="comment" class="comment" id="comment"></textarea></td>
    </tr>
  </table>
  <input type="button" name="button" value="发布" onClick="send('result');">
  </form>
</body>
</html>
模板中的内容在<{}>中的一会会被PHP替换掉,这就实现了美工和程序员的分工,不错吧有关Smarty的内容还请参考手册,这里就不便多说。来看下页面是怎么输出模板的吧:
复制PHP内容到剪贴板
PHP代码:

<?php
  /*****************************************
   Title :Smarty结合Ajax留言板实例
   Author:leehui1983(辉老大)
   Page Name:index.php
   Finish Date  :2006-12-17
  *****************************************/
  
  require('./libs/Smarty.class.php');//包含smarty类库
  require('./inc/dbclass.php');//包含数据库操作类
  
  $db = new db();//生成数据库操作实例
  $smarty = new Smarty();//实例化smarty对象
  $smarty->template_dir = "./templates";//设置模板目录
  $smarty->compile_dir  = "./templates_c"; //设置编译目录
  $smarty->caching      = false; //设置缓存方式
  /*****************************************************
  左右边界符,默认为{},但实际应用当中容易与JavaScript
  相冲突,所以建议设成<{}>或其它。
  *****************************************************/
  $smarty->left_delimiter  = "<{"; 
  $smarty->right_delimiter = "}>";
  $smarty->assign('title','smarty结合ajax制作简单留言板');//替换模板内容
  //设置初始页面由Smarty显示的留言内容
  $rt=$db->query("select * from bookinfo order by id desc");
  while($rs=$db->loop_query($rt)){
   $array[]=array("username"=>$rs['username'],"comment"=>$rs['comment']);
  }
  $smarty->assign("bookinfo",$array);
  unset ($array);//销毁数组变量
  $smarty->display("index.tpl");//编译并显示位于./templates下的index.tpl模板
?>

页面实例的注释还是比较多的,大家参考下Smarty手册这个是So easy的!!呵呵~~~~
接下来到了介绍ajax的时候,这里我们用一个基本的开发框架来实现,关于ajax的知识建议大家看看网上非常流行的电子教程ajax开发简略
复制内容到剪贴板
代码:
var http_request=false;
  function send_request(url){//初始化,指定处理函数,发送请求的函数
    http_request=false;
//开始初始化XMLHttpRequest对象
if(window.XMLHttpRequest){//Mozilla浏览器
  http_request=new XMLHttpRequest();
  if(http_request.overrideMimeType){//设置MIME类别
    http_request.overrideMimeType("text/xml");
  }
}
else if(window.ActiveXObject){//IE浏览器
  try{
   http_request=new ActiveXObject("Msxml2.XMLHttp");
  }catch(e){
   try{
   http_request=new ActiveXobject("Microsoft.XMLHttp");
   }catch(e){}
  }
    }
if(!http_request){//异常,创建对象实例失败
  window.alert("创建XMLHttp对象失败!");
  return false;
}
http_request.onreadystatechange=processrequest;
//确定发送请求方式,URL,及是否同步执行下段代码
    http_request.open("GET",url,true);
http_request.send(null);
  }
  //处理返回信息的函数
  function processrequest(){
   if(http_request.readyState==4){//判断对象状态
     if(http_request.status==200){//信息已成功返回,开始处理信息
   document.getElementById(reobj).innerHTML=http_request.responseText;
  }
  else{//页面不正常
   alert("您所请求的页面不正常!");
  }
   }
  }
  function send(obj){
   var f=document.book;
   var username=f.username.value;
   var comment=f.comment.value;
   if(username==""||comment==""){
   document.getElementById(obj).innerHTML="<font color=red>请填写完整!</font>";
   return false;
   }
   else{
   send_request('checkbookinfo.php?username='+username+'&comment='+comment);
   reobj=obj;
   }
  }
这样我们点“发布”按钮,数据就会交由服务器异步处理,通过JS来组织异步更新,在发过留言后你马上就能看见你的留言而不是传统的等待页面跳转,那么数据传到哪里处理呢?看这里:
复制PHP内容到剪贴板
PHP代码:

<?php
  
  /*****************************************
   Title :Smarty结合Ajax留言板实例
   Author:leehui1983(辉老大)
   Page Name:checkbookinfo.php
   Finish Date  :2006-12-17
  *****************************************/
  header("Content-type: text/html;charset=GBK");//输出编码,避免中文乱码
  include('./inc/dbclass.php');//包含数据库操作类
  $db=new db();//生成数据库操作实例
  $sql="insert into bookinfo values(0,'".$comment."','".$username."')";
  $db->query($sql);
  $querysql="select * from bookinfo order by id desc";
  $result=$db->query($querysql);
  while($rows=$db->loop_query($result)){//打印留言列表,用于实时更新
  //$arr.="用户名:{$rows['username']} 内容:{$rows['comment']}<p>";
  echo '用户名:'.$rows['username'].' 内容:'.$rows['comment'].'<p>';
  }
  //echo $arr;
  
?>

嗯,先插入数据,在将更新后的数据通过JS组织显示,AJAX看来真的不错哦!大体就介绍完了,不知道大家想过没有,加个 iframe可以改成什么?对!无刷新聊天室,发挥你的能力,实现一个看看。这个例子用到了OO,AJAX,SMARTY,东西还是蛮多滴,希望大家喜欢,我已经决定将此文向PHP杂志投稿,大家若是转载,还希望注明版权,谢谢!最后来个效果图和源码下载~~~~
test.rar (95.03 KB)

2006-12-17 19:27, 下载次数: 1911

源码(带建表SQL)

作者: leehui1983   发布时间: 2006-12-17

没人顶?我还希望斑竹加精呢 :lol

作者: leehui1983   发布时间: 2006-12-17

确实不错.

不过我有一个个人想法.你得程序就重构页面方面.你是用php生成了全部页面内容让后用javascript读出php得页面显示.这么做.服务器完成了99%得工作.客户端.完成了1%得工作.这个好像和ajax得初衷有违背哦.也就是说.既然你得php已经完全生成好了页面.就没有必要多javascript这个环节了.
直接用php显示就好了.多个环节,多了服务器开销,多了出错机会.也加大了开发难度.

而通常对ajax得认识我们需要把数据库里面需要得内容读出来封装为xml然后传给客户端.
客户端获取到数据包后在重构页面.(Ajax 就是 Asynchronous JavaScript+XML javascrpt 使用xml和服务器异步数据交流 )

这样做得好处是传输内容少了很多.服务器运算量少了很多.
自然我们就值得这么做了.应为服务端运算可以是1%-10%.而90%得运算量交给客户端用javascript搞定去了.

单看你得流程可是没有做到ajax得初衷哦.不能是为了ajax而ajax.没有提程序性能,甚至加大了开销.同样是ajax,细微得差别里面折射出可是很眩目得阳光哦.

虽然是很简单得程序.不过还是很多值得思考得地方.

[ 本帖最后由 ocheers 于 2006-12-17 20:22 编辑 ]

作者: ocheers   发布时间: 2006-12-17

谢谢楼上的意见,可能我现在还是学生,企业及的水准我还不具备,我用AJAX只是改善用户体验,没想过服务端和客户端的工作分配问题,依我个人愚见,ajax的富客户端的富指的是表现能力丰富,不是分摊服务器的工作。

作者: leehui1983   发布时间: 2006-12-17

依我个人愚见,ajax的富客户端的富指的是表现能力丰富,不是分摊服务器的工作。

不是这样:)  JS能作很多事,哈哈,作客户端缓存,嘎嘎,第一次听吓我一跳,后来才知道原来就是JS的全局变量,哈哈~

作者: Phzzy   发布时间: 2006-12-17

引用:
原帖由 <i>Phzzy</i> 于 2006-12-17 20:23 发表<br />
依我个人愚见,ajax的富客户端的富指的是表现能力丰富,不是分摊服务器的工作。<br />
<br />
不是这样:)  JS能作很多事,哈哈,作客户端缓存,嘎嘎,第一次听吓我一跳,后来才知道原来就是JS的全局变量,哈哈~
<br />
呵呵,我还要加油啊,可能我太注重自己的感受,和受了一些书籍的影响,继续学习了,谢谢楼上大大

作者: leehui1983   发布时间: 2006-12-17

ajax不但客户端表现丰富.
如果按照Asynchronous JavaScript+XML得标准来实现程序.自然也可以分摊服务器工作

老美没说ajax是来摊服务器工作得.是因为没有必要说.这个是功能是显而易见得.

我只所以拿出来说.

是我觉得在中国我感觉很多程序员没意识到
我说了.大家可以多一些对ajax得思考.

[ 本帖最后由 ocheers 于 2006-12-17 20:38 编辑 ]

作者: ocheers   发布时间: 2006-12-17

引用:
原帖由 ocheers 于 2006-12-17 20:28 发表
ajax不但客户端表现丰富.
如果按照Asynchronous JavaScript+XML得标准来实现程序.自然也可以分摊服务器工作

老美没说ajax是来摊服务器工作得.是因为没有必要说.这个是功能是显而易见得.

我只所以拿出来说 ...
呵呵,意识看来还差一点啊!学习了~~~~

作者: leehui1983   发布时间: 2006-12-17

引用:
原帖由 Phzzy 于 2006-12-17 20:23 发表
依我个人愚见,ajax的富客户端的富指的是表现能力丰富,不是分摊服务器的工作。

不是这样:)  JS能作很多事,哈哈,作客户端缓存,嘎嘎,第一次听吓我一跳,后来才知道原来就是JS的全局变量,哈哈~
可能你认为我得ajax程序是做了客户端缓存把.这个也是个思路.不过我没有这么做.

不信检查缓存把.一定什么都找不到.因为我得程序一个很关键得地方就是做了no cache.

作者: ocheers   发布时间: 2006-12-17

这位大哥来头不小啊,牛人来着

作者: leehui1983   发布时间: 2006-12-17

没看程序,不知道你说的CACHE是哪..
我先闪了,回寝室看你程序。。呵呵~

作者: Phzzy   发布时间: 2006-12-17

刚来.不知道水深.

写php已经8年了.初学得时候连本中文书都找不到.

写ajax2年了.刚学得时候google上得资料都是少得可怜.

很多时候在探索啊.喜欢这玩意,就好这口了.

特支持php.听说中国php官方站.就来了.

一是学习.二是交流.

[ 本帖最后由 ocheers 于 2006-12-17 21:23 编辑 ]

作者: ocheers   发布时间: 2006-12-17

引用:
原帖由 ocheers 于 2006-12-17 20:45 发表
刚来.不知道水深.

写php已经8年了.初学得时候连本中文书都找不到.

写ajax2年了.刚学得时候google上得资料都是少得可怜.

很多时候在探索啊.喜欢这玩意,就好这口了.

特持php.听说中国php官方站.就来了 ...
反正我是只有学习的份了~~~~~:L

作者: leehui1983   发布时间: 2006-12-17

不错
学习了

作者: fengyun   发布时间: 2006-12-17

此地路过,受益匪浅!!!

关注中......

作个标签先.

作者: hy0kl   发布时间: 2006-12-19

http://www.phpchina.com/bbs/thread-13709-1-1.html

这里是我的一篇关于ajax应用的留言板设计思路

留言板虽小,但是会了留言板.自然就会了新闻系统,论坛,聊天室,等等了.

作者: ocheers   发布时间: 2006-12-19

ocheers 看来也是高手了,写几篇文章大家交流交流如何?:D

作者: Ben   发布时间: 2006-12-19

引用:
原帖由 ocheers 于 2006-12-19 18:57 发表
http://www.phpchina.com/bbs/thread-13709-1-1.html

这里是我的一篇关于ajax应用的留言板设计思路

留言板虽小,但是会了留言板.自然就会了新闻系统,论坛,聊天室,等等了.
你的又不开源,再好也只能用用,大家也学不到东西

作者: leehui1983   发布时间: 2006-12-19

引用:
无论你的PHP程序有多少漏洞,只要...只要不发布的网络上,它就是非常安全的.
谁说的来着.默默吧.

没发源,可是发了思路.一样拉.

我们有很多时候缺的不是代码的堆叠,而是思路.

其实对于我来说.看一下别人的程序,我就能写一个难说比他好的程序,因为他的优点我看到了.缺点我也看到了.

那么我还缺什么呢.

动手都没那么重要了.思考....

[ 本帖最后由 ocheers 于 2006-12-19 21:56 编辑 ]

作者: ocheers   发布时间: 2006-12-19

很好,支持,对新手很有帮助

作者: dzjzmj   发布时间: 2006-12-19

比如
http://www.phpchina.com/bbs/thread-13739-1-1.html

我不说思路,又有多少人会这样做呢.代码不过10行.

但是可以实现多少有意思的东西呢???



(使用了很多图,国外服务器,所以打开请多等一下,没出来就在刷新.)

[ 本帖最后由 ocheers 于 2006-12-19 21:50 编辑 ]

作者: ocheers   发布时间: 2006-12-19

这语气想起我初中数学老师,ocheers果然大师风范

作者: leehui1983   发布时间: 2006-12-19

好强呀。果然是见习到了高手。。。

作者: newbird   发布时间: 2006-12-29

强人,我还要继续努力

作者: 玉面修罗   发布时间: 2006-12-29

:)

作者: ttym   发布时间: 2007-01-07

运行会报错!
运行后会报这行:(document.getElementById(reobj).innerHTML=http_request.responseText)  reobj未定义

作者: willke   发布时间: 2007-01-11

引用:
原帖由 leehui1983 于 2006-12-17 20:40 发表
这位大哥来头不小啊,牛人来着

作者: remote_addr   发布时间: 2007-01-13

不错,好贴

作者: skyfen   发布时间: 2007-01-16

不错,好贴

作者: skyfen   发布时间: 2007-01-16

Ajax好是好,但我还担心安全的问题,因为如果处理不好,就可能把漏洞暴露出来了
希望会有好的解决方案:)

作者: 编程骇客   发布时间: 2007-01-19

试试xajax也许会好些

作者: leehui1983   发布时间: 2007-01-20

一般来说ajax在提高用户体验的同时就在分摊服务器的工作。很多前台开发者是无心插柳……

作者: leguan   发布时间: 2007-01-22

:) 下载回去好好研究,楼主真是高手啊

作者: hui07   发布时间: 2007-01-30

我越感觉自己有不知天高地厚的菜~~

[ 本帖最后由 lmhllr 于 2007-2-1 09:07 编辑 ]

作者: lmhllr   发布时间: 2007-01-31

L是在批评我吗?我没有到处炫啊,你是不是误会了,这样以后我可不敢发帖了

作者: leehui1983   发布时间: 2007-02-01

只是突然想起来随便说说。。。

作者: lmhllr   发布时间: 2007-02-01

引用:
原帖由 leehui1983 于 2006-12-17 20:22 发表
谢谢楼上的意见,可能我现在还是学生,企业及的水准我还不具备,我用AJAX只是改善用户体验,没想过服务端和客户端的工作分配问题,依我个人愚见,ajax的富客户端的富指的是表现能力丰富,不是分摊服务器的工作。
ajax的主要作用 就是减轻服务器不必要的开销,来提高效率

作者: ysixin   发布时间: 2007-02-01

引用:
原帖由 leehui1983 于 2006-12-17 20:07 发表
没人顶?我还希望斑竹加精呢 :lol
林子大了.什么鸟都有....

作者: 小陈   发布时间: 2007-02-04

代码不能下载阿

作者: piecesfx   发布时间: 2007-02-13

会有乱码!数据库用了utf-8,模板却用了gbk,为什么!>???

作者: qingis   发布时间: 2007-02-21

onClick="send('result');"   这个result是DIV的那个NAME吗?


$sql="insert into bookinfo values(0,'".$comment."','".$username."')";
前面是不是要加 $_GET 先获得 ?

作者: flashtom   发布时间: 2007-03-20

说的都不错.

作者: aceblues   发布时间: 2007-04-07

作者: dandankai   发布时间: 2007-04-16

学习咯!

作者: 排队上天堂   发布时间: 2007-04-28

你们测试这段代码了吗
可以运行出来效果?
好像JS代码部分有点问题。

作者: kelvin_1984   发布时间: 2007-04-29


继续关注

作者: eoe2005   发布时间: 2007-04-30

引用:
原帖由 flashtom 于 2007-3-20 11:14 发表
onClick="send('result');"   这个result是DIV的那个NAME吗?


$sql="insert into bookinfo values(0,'".$comment."','".$username."')";
前面是不是要加 $_GET 先获得 ?
我也是不明白这两点阿?!  希望楼主能给解释一下〉

作者: hbudazhuang   发布时间: 2007-06-28

实用的东西 费心了

作者: CIV   发布时间: 2008-06-23

你自己加一个吧!呵呵!

作者: kingboer   发布时间: 2008-07-17

在php部分�]有看到任何上�������斓�mysql的�Z句啊
�y道的都交�oajax做了?那�泳��]有意�x了。

作者: konakona   发布时间: 2008-07-28

为什么我好像写入不了数据库啊,无论写什么内容,表内都是空的记录。

作者: iphpmysql   发布时间: 2008-08-14