我在开发公司博客系统的时候,要求实现日志的自动保存功能就是每隔一分钟,要把用户的信息保存为草稿,如果用户没有保存文章导致内容丢失的话可以恢复。
那么怎么实现自动保存功能呢! 我首先想到的就是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啦@!@