什么是艺术?

文章的自动保存功能!

上一篇 / 下一篇  2007-11-29 20:16:50 / 个人分类:总结

    我在开发公司博客系统的时候,要求实现日志的自动保存功能就是每隔一分钟,要把用户的信息保存为草稿,如果用户没有保存文章导致内容丢失的话可以恢复。

    那么怎么实现自动保存功能呢! 我首先想到的就是AJAX,但是还要考虑一个问题就是AJAX是utf-8编码而我们网站的编码是gb2312,如果纯手写的话就要考虑编码问题,可以用iconv函数转换,可是这样估计有点麻烦。刚好我买了一本杜江老师出的那本《php5和mysql5技术详解》上面有介绍php和ajax的,我看了下,书上是推荐了一个php的ajax框架,叫XAJAX,比较简单我看了一下决定用这个做,它可以轻松解决编码问题!

   在动手之前还要考虑几个问题第一数据库表结构的问题。第二当第一次保存草稿的时候是插入数据库操作,第二次保存草稿就是修改update,那么如何判断是第一次保存还是第二次保存?弄了半天决定这样分两个表一个是日记表,一个草稿表

日记表

id    title   content   savetime  等字段

草稿表

id   userid  content  savetime  hashtime

当保存草稿时在草稿表里插入一条数据, 前四个字段就不用说了,最后一个字段就是用来区分是否是新草稿还是旧草稿。怎么实现呢!在php文件里我定义一个hashtime 取当前的微秒时间 函数如下:
function microtime_float()
{
    list($usec, $sec) = explode(" ", microtime());
    return substr((ceil(($usec + $sec)*100)), -14);
}
$hashtime = microtime_float();
然后再html文件里写个hidden,<input type="hidden" name="hashtime" value="{hashtime}">
只要页面不刷新$hashtime就不会改变,因为是用ajax所以不会刷新!这样只要在插入草稿数据库之前判断下这个用户是否有hashtime等于$_REQUEST['hashtime']的记录,如果没有就是第一次,如果有就是第二次或者是第三 四……次。好的 现在动手写!

   首先先到官方网站去下代码http://www.xajaxproject.org/ ,建议下载那个0.2.5版本的,最新版本有点改动和教程上不匹配!弄好之后把那个xajax.inc.php文件包含进来这样就OK啦! 之后就开始写代码了。

   define ('XAJAX_DEFAULT_CHAR_ENCODING', 'gb2312');//声明编码为gb2312,也可以在xajax.inc.php里面直接改!

这句要写在包含xajax.inc.php语句之前,否则无效!

function microtime_float()
{
    list($usec, $sec) = explode(" ", microtime());
    return substr((ceil(($usec + $sec)*100)), -14);
}
$hashtime = microtime_float();  //微秒时间
$xajax = new xajax(); //实例化对象
$xajax->decodeUTF8InputOn(); //将输出流的字符编码由utf8转为指定的编码也就是gb2312
$xajax->registerFunction("autosave"); //注册xajax调用的PHP函数名称
//函数体
function autosave($adiary){
 global $SYS_SESSION;   
 $time = time();
 $title = '草稿:'.date('Y-m-d H:i:s');
 $content = strip_tags($adiary['content'], "<p><a><br><img><font><strong><i><u><li><ol><ul><marquee><span>");
    $hashtime = $adiary['hash'];
    $diary_id = empty($adiary['id']) ? 0 :$adiary['id'];
 $db=new Db_sql;
    $sql = "SELECT id FROM blog_draft where userid = '{$SYS_SESSION[UserID]}' and hashtime = '{$hashtime}'";   //检查是第一次还是不是第一次
 $db->query($sql);
 $i = 0;
 if($db->next_record()) {
  do
  {
   $draft_ary[$i++]=$db->Record;
  }while($db->next_record());
 }
 if(count($draft_ary) == 0){ //如果是第一次
  $sql = "insert into blog_draft(`diary_id`, `userid`, `title`, `content`, `savetime`, `hashtime`) values('{$diary_id}', '{$SYS_SESSION[UserID]}', '{$title}', '{$content}', '{$time}', '{$hashtime}')";
  $db->query($sql);
 } else {//不是第一次
  $sql = "update  blog_draft set title='{$title}', content='{$content}', savetime='{$time}' where id='{$draft_ary[0][id]}'";
  $db->query($sql);
 }
 $oResponse = new xajaxResponse();  //实例化输出对象
 $oResponse->addAssign('test_xajax', 'innerHTML', '草稿保存于:'.date("H:i:s"));//更新提示内容html页面元素的id为 test_xajax 内容是 '草稿保存于:'.date("H:i:s")
 return $oResponse->getXML();//返回xml数据
}
$xajax->processRequests();   //xajax必须语句
$t->set_var("xajaxJavascrīpt", $xajax->getJavascrīpt(BLOG_DIR.'xajax')); //输出javascrīpt代码 我这个是phplib模板,大家可以有不一样的写法

然后是客户端代码

<scrīpt language="javascrīpt">
setInterval("autosave()", 60000);
 function autosave() {
  oform = document.postform;
   if(oform.content.value != '')
   xajax_autosave(xajax.getFormValues('postform'));//执行xajax函数xajax_php文件中定义的注册xajax调用的PHP函数名称
 }
</scrīpt> 

这样就ok啦@!@


TAG: 总结

歪歪的个人空间 引用 删除 歪歪   /   2007-12-12 21:46:53
zhe ge hao
 

评分:0

我来说两句

显示全部

:loveliness: :handshake :victory: :funk: :time: :kiss: :call: :hug: :lol :'( :Q :L ;P :$ :P :o :@ :D :( :)

数据统计

  • 访问量: 557
  • 日志数: 5
  • 图片数: 2
  • 建立时间: 2007-11-13
  • 更新时间: 2007-12-05

RSS订阅

Open Toolbar