日历

« 2008-10-10  
   1234
567891011
12131415161718
19202122232425
262728293031 

最新来客

统计信息

  • 访问量: 1141
  • 日志数: 4
  • 建立时间: 2007-05-28
  • 更新时间: 2007-11-06

RSS订阅

我的最新日志

  • 判断会员在线方法探讨

    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 event

                    YAHOO.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...试试这东东都有啥好功能,以后俺自个儿开发个..
Open Toolbar