日历
| |||||||||
| 日 | 一 | 二 | 三 | 四 | 五 | 六 | |||
| 1 | 2 | 3 | 4 | ||||||
| 5 | 6 | 7 | 8 | 9 | 10 | 11 | |||
| 12 | 13 | 14 | 15 | 16 | 17 | 18 | |||
| 19 | 20 | 21 | 22 | 23 | 24 | 25 | |||
| 26 | 27 | 28 | 29 | 30 | 31 | ||||
搜索标题
最新来客
统计信息
- 访问量: 1141
- 日志数: 4
- 建立时间: 2007-05-28
- 更新时间: 2007-11-06
我的最新日志
-
判断会员在线方法探讨
2007-11-06
在我们好多网站运营中,特别是一些web2.0的用户之间交互的网站,通常需要实时获得用户是否在线.通常我们用的方法经常是30分钟无动作即作离线处理,因为前面项目的关系,我用了这种方法.
1,在数据库中建立如下的user表
CREATE TABLE user (
id int(11) autoincreatment,
name varchar(11),
password varchar(64),
isonline enum(0,1),
onlinetime int(11),
offlinetime int(11)
)primary key id;
2,在global.php中引入文件isOnline.php.即用户一有动作,就触发该文件:
<?php
session_start();
if(!is_login())
{
exit('未登录');
}
/**
在此更新在线时间
*/
$updateOnLineTimeSql = "update user set ōnlinetime=time() where id = $_SESSION['id']";
mysql_query($updateOnlineTimeSql);
3.设置linux的cron,并将其指向clearOnlineUser.php,设置为5分钟执行一次,该php文件内容如下:
<?php
session_start();
if(!is_login())
{
exit('未登录');
}
/**
用当前时间戳与表中onlinetime字段做差,如果大于30分钟,即已离线,否则为在线.
*/
$getOnLineTimeStampSql = "select onlinttime from user where id=$_SESSION['id']";
$getOnLineTimeStampQuery = mysql_query($getOnLineTimeStampSql);
$getOnLineTimeStampRes = mysql_fetch_array($getOnLineTimeStampQuery);
$onLineTimeStamp = $getOnLineTimeStampRes['onlinetime'];
if(time()-$onLineTimeStamp>30*60)
{
//已退出,将数据库中的isonline置为0
}
else
{
//他还是在线的.
}
4,这样就可以根据数据库中的isonline字段较为准确地判断用户是否在线了.
-
视频分享网站工作流程
2007-11-02
前些天做个项目,里面有部分涉及到视频分享,在这里总结一下.
其工作流程如下:
1.用户上传各种类型的视频文件,如wav,rm等格式.
2.资源服务器cron定时或时实处理视频,将之转化为flv格式并切成相关代表图片,并将生成后的文件路径保存在数据库中.这里的实时处理,一般为一些外来软件,可到互联网上下载,有很多免费和收费的软件供选择.
3.数据库服务器和web服务器加载一个用来播放该视频的界面,我们假定它为show.swf,这可能是一个flash界面.
4.后台动态生成show.swf所需要的xml文件,假设该文件名为createShowList.xml.php,其格式根据不同的flash可能不同,但大抵样式如下:
<?xml version=1.0 encoding=utf-8 ?>
<showList>
<title>视频名字</title>
<address>视频路径</address>
<author>作者</author>
<other>上传者,上传时间等其它信息,根据swf文件不同而不同</other>
</showList>
5.加载show.swf后,其根据不同用户点击调用createShowList.xml.php生成不同的xml文件,用以播放.
-
php+xajax+smarty+yui+adodb制做的滑块分页
2007-6-14
同学买了一本书,叫<<征服ajax>>,脚本语言是asp.net的.我拿过来研究一下,发现自己还是只喜欢它的脚本和创意,对asp.net代码很反感......呵呵
大概是最后一章吧,它表现了一个ajax滑块分页,我感觉这个创意挺不错的.然后赶紧记下来.回头用php咱也完成它.....
闲话少说,进入正题:
我的目录结构如下(这个结构还真有点大,用的类库一多,就好郁闷):
|-index.php
|-global.php//用它来装全部要包含的文件,在其它文件里只要"include_once("global.php")"就OK了.
|-adodb
|-smarty
|-xajax
|-compile //smarty编译目录
|-inc
|---config.inc.php //系统配置文件
|---mySmarty.class.php //继承自smarty,省得总是要配置那么多smarty的参数.
其中核心代码部分如下:
mySmarty.class.php
<?
include_once("./smarty/Smarty.class.php");
class mySmarty extends Smarty{function mySmarty()
{
$this->template_dir="./templates/";
$this->compile_dir="./templates/compile";
$this->cache_dir="./templates/cache";
$this->left_delimiter = '<{';
$this->right_delimiter = '}>';
}
}
?>global.php:
<?php
include_once"xajax/xajax.inc.php";
include_once"inc/config.inc.php";
include_once"inc/mySmarty.class.php";include_once "adodb/adodb.inc.php";
define ('XAJAX_DEFAULT_CHAR_ENCODING', 'utf-8' );//在此设置xajax语言,防止它在使用时乱码.
?>
index.php:<?php
session_start();
session_cache_expire(0);
define("ITEMS",5); //每页输出条数
include_once"xajax/xajax.inc.php";
include_once"inc/config.inc.php";
include_once"inc/mySmarty.class.php";
include_once "adodb/adodb.inc.php";
//define ('XAJAX_DEFAULT_CHAR_ENCODING', 'utf-8' );
$smarty=new mySmarty();
function getTotalNum()
{mysql_connect(SERVER,USER,PASS);
mysql_select_db(DBNAME);
$sql="SELECT * FROM news";
$query=mysql_query($sql);
$total=mysql_num_rows($query);
//要确定滑块的总权值
$sliderNum=intval($total/ITEMS/2);
$_SESSION[sliderNum]=$sliderNum;
$slider="There are".$sliderNum."pages at all!";
$obj=new xajaxResponse();
$obj->addAssign('header','innerHTML',$slider);
return $obj->getXML();
}
function getContent($num)
{
$items=ITEMS;
$orders=(ITEMS*$num)+1;
$fetchSql="SELECT * FROM news LIMIT $orders,$items";
mysql_connect(SERVER,USER,PASS);
mysql_select_db(DBNAME);
$query=mysql_query($fetchSql);
$str="<ul id=\"myul\">";
while($rows=mysql_fetch_array($query))
{
$str.="<li>".$rows[title];
$str.=$rows[content]."<br/>";
}
$str.="</ul>";
$obj=new xajaxResponse();
$obj->addAssign('mycontent','innerHTML',$str);
return $obj->getXML();
}//处理xajax
$xajax = new xajax();
//$xajax->decodeUTF8InputOn(); // 将输出流的字符编码由UTF-8转化为指定的编码,这里我们定义的是“gb2312”
$xajax->registerFunction('getTotalNum');
$xajax->registerFunction('getContent');
$xajax->processRequests();
//装载smarty
$sliderNum=$_SESSION[sliderNum];
$smarty->assign('sliderNum',$sliderNum);
//$smarty->assign('content',$array);
$smarty->assign('xajax_javascrīpt',$xajax->getJavascrīpt('./xajax/'));
$smarty->display("index.html");
?>
下面这个是smarty的模板文件,在templates里面.index.html:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html lang="en" xml:lang="en" xmlns="http://www.w3.org/1999/xhtml"
xmlns:x2="http://www.w3.org/TR/xhtml2"
xmlns:role="http://www.w3.org/2005/01/wai-rdf/GUIRoleTaxonomy#"
xmlns:state="http://www.w3.org/2005/07/aaa">
<head>
<title>Yahoo! UI Library - Slider Widget</title>
<link rel="stylesheet" type="text/css" href="templates/css/screen.css" ></link><!-- Nav and logger start -->
<{$xajax_javascrīpt}>
<scrīpt type="text/javascrīpt" src="templates/js/yahoo-min.js" ></scrīpt>
<scrīpt type="text/javascrīpt" src="templates/js/event-min.js" ></scrīpt>
<scrīpt type="text/javascrīpt" src="templates/js/dom-min.js" ></scrīpt>
<scrīpt type="text/javascrīpt" src="templates/js/logger-min.js" ></scrīpt>
<scrīpt type="text/javascrīpt" src="templates/js/dragdrop-min.js" ></scrīpt><scrīpt type="text/javascrīpt" src="templates/js/animation-min.js" ></scrīpt>
<scrīpt type="text/javascrīpt" src="templates/js/color.js" ></scrīpt>
<scrīpt type="text/javascrīpt" src="templates/js/key.js" ></scrīpt><scrīpt type="text/javascrīpt" src="templates/js/slider-debug.js" ></scrīpt></head>
<body ōnload="xajax_getTotalNum()">
<div id="container">
<div id="containerTop">
<div id="header"></div>
<div id="main"><!-- Nav and logger start -->
<style type="text/css">
#logButtonHeader input { font-size: 80% }/* logger default styles */
/* font size is controlled here: default 77% */
#yui-log {position:absolute;top:1em;right:1em;font-size:77%;text-align:left;}
/* width is controlled here: default 31em */
.yui-log {background-color:#AAA;border:1px solid black;font-family:monospace;z-index:9000;}
.yui-log p {margin:1px;padding:.1em;}
.yui-log button {font-family:monospace;}
.yui-log .yui-log-hd {padding:.5em;background-color:#575757;color:#FFF;}
/* height is controlled here: default 20em*/
.yui-log .yui-log-bd {width:100%;height:20em;background-color:#FFF;border:1px solid gray;overflow:auto;}
.yui-log .yui-log-ft {margin-top:.5em;margin-bottom:1em;}
.yui-log .yui-log-ft .yui-log-categoryfilters {}
.yui-log .yui-log-ft .yui-log-sourcefilters {width:100%;border-top:1px solid #575757;margin-top:.75em;padding-top:.75em;}
.yui-log .yui-log-btns {position:relative;float:right;bottom:.25em;}
.yui-log .yui-log-filtergrp {margin-right:.5em;}
.yui-log .info {background-color:#A7CC25;} /* A7CC25 green */
.yui-log .warn {background-color:#F58516;} /* F58516 orange */
.yui-log .error {background-color:#E32F0B;} /* E32F0B red */
.yui-log .time {background-color:#A6C9D7;} /* A6C9D7 blue */
.yui-log .window {background-color:#F2<div id="pagecontent">
ul {list-style:none}
</div>E886;} /* F2E886 tan */
</style><!-- Nav and logger end -->
<div id=mycontent></div>
<div id="content">
<div class="newsItem">
<!-- This paragram is no use!
-->
<div id="vertWrapper">
<div id="vertValueDiv" style="display:none ">
<form name="formV" ōnsubmit="return YAHOO.example.Sliders.updateVert()">
<input autocomplete="off" name="vertVal" id="vertVal" type="text" value="0" size="4" maxlength="4" />
<input type="button" value="Update" ōnclick="YAHOO.example.Sliders.updateVert()" />
</form>
</div>
</div>
<!--The end of doesnot use -->
<div id="horizWrapper">
<div id="horizBGDiv" tabindex="0" x2:role="role:slider" state:valuenow="0" state:valuemin="-100" state:valuemax="100" title="Horizontal Slider" >
<div id="horizHandleDiv" ><img alt="" src="img/horizSlider.png" /></div>
</div>
<div id="horizValueDiv">
<form name="formH" ōnsubmit="return YAHOO.example.Sliders.updateHoriz()">
<input autocomplete="off" name="horizVal" id="horizVal" type="text" value="0" size="4" maxlength="4" />
<input type="button" value="Update" ōnclick="YAHOO.example.Sliders.updateHoriz()" />
</form>
</div>
</div></div>
</div>
</div>
<scrīpt type="text/javascrīpt">
//<![CDATA[YAHOO.example.Sliders = function() {
var Dom = YAHOO.util.Dom;
var Event = YAHOO.util.Event;var yslider, xslider;
function handleHorizSliderKey(e) {
YAHOO.log("horizontal slider keypress");var valueNow = xslider.getValue();
var valueMin = xslider.thumb.rightConstraint;
var valueMax = xslider.thumb.leftConstraint;
var delta = 0;
var kc = Event.getCharCode(e);YAHOO.log("keycode: " + kc);
if (kc == YAHOO.util.Key.DOM_VK_LEFT) {
delta = -25;
} else if (kc == YAHOO.util.Key.DOM_VK_RIGHT) {
delta = 25;
} else if (kc == YAHOO.util.Key.DOM_VK_HOME) {
delta = -( valueNow - valueMin );
} else if (kc == YAHOO.util.Key.DOM_VK_END) {
delta = valueMax - valueNow;
} else {
return true;
}
valueNow += delta;var sliderBg = Dom.get("horizBGDiv");
if (sliderBg.setAttributeNS) {
sliderBg.setAttributeNS("http://www.w3.org/2005/07/aaa",
"valuenow", valueNow);
}
Event.stopEvent(e);
return false;
}function handleVertSliderKey(e) {
YAHOO.log("vertical slider keypress");
var valueNow = yslider.getValue();
var valueMin = yslider.thumb.topConstraint;
var valueMax = yslider.thumb.bottomConstraint;var delta = 0;
var kc = Event.getCharCode(e);
if (kc == YAHOO.util.Key.DOM_VK_UP) {
delta = -20;
}
else if (kc == YAHOO.util.Key.DOM_VK_DOWN) {
delta = 20;
}
else if (kc == YAHOO.util.Key.DOM_VK_HOME) {
delta = -( valueNow - valueMin );
}
else if (kc == YAHOO.util.Key.DOM_VK_END) {
delta = valueMax - valueNow;
}
else {
return true;
}
valueNow += delta;
if (valueNow < valueMin) {
valueNow = valueMin;
}if (valueNow > valueMax) {
valueNow = valueMax;
}var sliderBg = Dom.get("vertBGDiv");
if (sliderBg.setAttributeNS) {
sliderBg.setAttributeNS("http://www.w3.org/2005/07/aaa",
"valuenow", valueNow);
}
Event.stopEvent(e);
return false;
}var initVert = function() {
var bg="vertBGDiv",thumb="vertHandleDiv",valFld="vertVal";
yslider = YAHOO.widget.Slider.getVertSlider(bg,
thumb, 0, 200);yslider.subscribe("change", function(offsetFromStart) {
if (this.moveComplete) {
YAHOO.log("moveComplete", "warn");
}
// Dom.get(valFld).value = offsetFromStart;
//Dom.get(bg).title = "Vert Slider, value = " + offsetFromStart;
});yslider.subscribe("slideStart", function() {
YAHOO.log("VERT slidestart", "warn");
});yslider.subscribe("slideEnd", function() {
// If you are only interested in the end value (when the
// animation completes, or the user stops dragging the
// slider handle), you can use this event rather than the
// change eventYAHOO.log("VERT slideend", "warn");
// var val = this.getValue();
});Dom.get(valFld).title = "Type in slider value between 0 and 200.";
Event.on(bg, "keydown", handleVertSliderKey);
Event.on(bg, "keypress", Event.preventDefault);};
var initHoriz = function() {
var bg="horizBGDiv",thumb="horizHandleDiv",valFld="horizVal";
xslider = YAHOO.widget.Slider.getHorizSlider(bg,
thumb, <{ $sliderNum }>, <{ $sliderNum }>, 1);xslider.subscribe("change", function(offsetFromStart) {
//insert the xajax_function to use!
Dom.get("mycontent").value="Loading";
var pagenum=offsetFromStart+<{ $sliderNum }>;
xajax_getContent(pagenum);
});关键的地方,在这上面10行以内,这是yui的外部参数接口,$sliderNum为滑块左右长度,在此用smarty动态输出. xajax_getContent(pagenum)是用来获取数据的ajax调用,参数pagenum为"从当前条目开始的X条",X在index.php的开头有定义.
xslider.subscribe("slideStart", function() {
// YAHOO.log("HORIZ slidestart", "warn");
});xslider.subscribe("slideEnd", function() {
// If you are only interested in the end value (when the
// animation completes, or the user stops dragging the
// slider handle), you can use this event rather than the
// change event// YAHOO.log("HORIZ slideend", "warn");
// var val = this.getValue();
// Dom.get(valFld).value = val;
// Dom.get(bg).title = "Vert Slider, value = " + val;
});
Dom.get(valFld).title = "Type in slider value between -100 " +
"and 100. Values will be rounded to a number divisable by 25."Event.on(bg, "keydown", handleHorizSliderKey);
Event.on(bg, "keypress", Event.preventDefault);
};return {
init: function() {
initVert(); initHoriz();
},updateVert: function() {
var v = parseFloat(document.forms['formV']['vertVal'].value, 10);
if ( isNaN(v) ) v = 0;
yslider.setValue(Math.round(v));
return false;
},updateHoriz:function() {
var fld = document.forms["formH"]["horizVal"];
var v = parseFloat(fld.value, 10);
if ( isNaN(v) ) v = 0;
xslider.setValue(Math.round(v));
var newVal = xslider.getValue();
if (v != newVal) {
fld.value = newVal;
}
return false;
}}
}();YAHOO.util.Event.on(window, "load", YAHOO.example.Sliders.init);
//]]>
</scrīpt>
</body>
</html>OK..代码贴完了..感觉核心的东西也就在于从yui的外部接口,到xajax读数据库并输出.
(yui下载自yahoo.com)
感觉这个分页的优点:
1,快速,无刷新,增强用户体验.(这个也列出来有点....)
2,分起页来比传统分页似乎还要简单,不用处理"上一页","下一页"的问题.
本例缺点:
1,adodb还是用不好,这个比较郁闷,学了好长时间了..具体表现在,不能将之缓存输出,导致数据量大时,拖动起来要有等待.
2,对javascrīpt研究没有深入,搞得这个模块页好多javascrīpt无用代码...郁闷地说...
我的空间到期了,最后又忙于应付考试,就没办法给大家演示了.....
欢迎各位老哥跟贴指责.我的email:ajoe at hqu.edu.cn 谁要代码请用这个联系,有问必答.....我们学校的邮箱,有时候收不到国外服务器的信..呵呵.
最后,感谢您的阅读,感谢我的坚持.不积蛙步无以致千里,不积小流无以成江海.
-
开通了,庆贺庆贺..呵呵.
2007-5-28
开通个BLOG...试试这东东都有啥好功能,以后俺自个儿开发个..

