喜悦国际村 
» 游客:  注册 | 登录 | 搜索 | 统计 | 喜悦证交所 | 帮助

RSS 订阅当前论坛  

【村长请吃饭啊】 ---北京诚聘--- 【你还在犹豫吗?】

上一主题 下一主题
 63  1/7  1  2  3  4  5  6  7  > 
     
标题: 最近写的代码 仅做交流用  
 
sanders_yao
版主
Rank: 7Rank: 7Rank: 7
or2 =333


UID 30286
精华 0
积分 2487
帖子 4632
金钱 2484 喜悦币
威望 0
人脉 3
阅读权限 100
注册 2004-7-23
来自 北京 菜户营
状态 离线
最近写的代码 仅做交流用

用户会话类型

<?php
//############################
#    文件:session.php
#    作者:Sanders Yao
#    名称:用户会话
#    所在系统:55w下载
#    功能:多用户会话连接
#    必须全局变量:
#    $db:MySQL数据库操作对象(MyDB类型)
#    $defaultUser:未登录用户对象
#    $domain:session作用域名
#    $groupData:用户组缓存数据
#    需要常量:
#    SCK_NAM:session发送的cookie名
#    SES_EXP:session在服务器端的寿命
#    类型:
#    session:
#    会话类型
#    user:
#    用户类型
#    全局函数:
#    getOnline:
#    返回在线user对象数组
#    最后修改时间:2007-2-27
/*    sql:
CREATE TABLE `member` (
  `uid` int(10) unsigned NOT NULL auto_increment,
  `uname` char(255) NOT NULL,
  `password` char(64) NOT NULL,
  `ol` tinyint(1) NOT NULL default '0',
  `sid` char(6) NOT NULL default '',
  `ttl` int(10) NOT NULL default '0',
  `gid` mediumint(4) unsigned NOT NULL,
  `group` char(255) NOT NULL,
  PRIMARY KEY  (`uid`),
  UNIQUE KEY `uname` (`uname`),
  KEY `ol` (`ol`),
  KEY `sid` (`sid`)
) TYPE=MyISAM;

CREATE TABLE `session` (
  `sid` char(6) NOT NULL,
  `uid` int(10) NOT NULL default '0',
  `uname` char(255) NOT NULL,
  `gid` mediumint(4) unsigned NOT NULL,
  `group` char(255) NOT NULL,
  `ctime` int(10) NOT NULL default '0',
  `atime` int(10) NOT NULL default '0',
  PRIMARY KEY  (`sid`)
) TYPE=HEAP MAX_ROWS=2000;
--    test records:

*/
//############################


//会话
class session{
    var 
$itsId;
    var 
$itsCtime;
    var 
$itsAtime;
    var 
$itsUser;
    var 
$itsPerfix;
    
    function 
session($id ""$perfix ""){
        
$this->itsId $id;
        
$this->itsCtime = -1;
        
$this->itsAtime = -1;
        
$this->itsUser NULL;
        
$this->itsPerfix $perfix;
    }
    
    
//加载数据
    //返回false:无效的会话id
    
function load(){
        global 
$db;
        if(
"" == $this->itsId){
            return 
false;
        }
        
$query_string sprintf("SELECT * FROM `%ssession` WHERE `sid`='%s';"$this->itsPerfix$this->itsId);
        
$result $db->query($query_string);
        if(
== mysql_num_rows($result)){
            return 
false;
        }
        
$arrayTmp $db->fetch($resultMYSQL_ASSOC);
        
mysql_free_result($result);
        
$this->itsUser = new User(0$this->itsPerfix);
        
$this->itsUser->itsSession = & $this;
        
$this->import($arrayTmp);
        return 
true;
    }
    
    
//加载用户数据(自动登录)
    //返回false:登录失败
    
function loadUser(){
        global 
$db;
        
$query_string sprintf("
SELECT * FROM `%smember` WHERE `sid`='%s';"
$this->itsPerfix$this->itsId);
        
$result $db->query($query_string);
        if(
== mysql_num_rows($result)){
            return 
false;
        }
        
$arrayTmp $db->fetch($resultMYSQL_ASSOC);
        
mysql_free_result($result);
        
$this->itsUser = new user;
        
$this->itsUser->import($arrayTmp);
        
$this->itsUser->itsSession = & $this;
        
$query_string sprintf("
UPDATE `%ssession`
SET `uid`=%d, `uname`='%s'
WHERE `sid`='%s';"
$this->itsPerfix$this->itsUser->itsId$this->itsUser->itsName);
        return 
$db->query($query_string);
    }
    
    
//导入数据
    
function import(& $array){
        global 
$defaultUser;
        
$this->itsId    = isset($array["sid"])    ? $array["sid"]        : $this->itsId;
        
$this->itsCtime    = isset($array["ctime"])? $array["ctime"]    : $this->itsCtime;
        
$this->itsAtime    = isset($array["atime"])? $array["atime"]    : $this->itsAtime;
        if(
== $this->itsUser->itsId && "" != $array["uname"]){
            
$this->itsUser->itsOl 1;
            
$this->itsUser->import($array);
        }
    }
    
    
//导出数据
    
function expert($ignoreId false){
        global 
$db;
        
$result = array(
            
"sid" => $this->itsId,
            
"ctime" => $this->itsCtime,
            
"atime" => $this->itsAtime,
        );
        if(
$ignoreId){
            unset(
$result["sid"]);
        }
        return 
$result;
    }
    
    
//设定cookie建立会话连接
    //返回false:发送cookie失败
    
function connect($sck_expi 0){
        
$this->createId();
        
$sck_expi == $sck_expi time() + $sck_expi;
        return @
setcookie($this->itsPerfix SCK_NAM$this->itsId$sck_expi""$domain);
    }
    
    
//通过用户返回的cookie加载会话数据
    //返回false:无效的cookie值 或者 更新session表失败
    
function check(){
        global 
$_COOKIE$db;
        if(isset(
$_COOKIE[$this->itsPerfix SCK_NAM])){
            
$this->itsId $_COOKIE[$this->itsPerfix SCK_NAM];
            if(!
$this->load()){
                return 
false;
            }
            
$query_string sprintf("
UPDATE `%ssession`
SET `atime`=UNIX_TIMESTAMP()
WHERE `sid`='%s';"
$this->itsPerfix$this->itsId);
            
$result $db->query($query_string);
            return 
$result;
        }
        return 
false;
    }
    
    
//构造session的唯一id
    //返回false:构造失败
    
function createId(){
        global 
$db$defaultUser;
        
set_time_limit(60);//
        
$this->itsCtime $this->itsAtime time();
        
$this->setDefault();
        for(
$i 0;$i 1000;$i ++){//循环1000次
            
$this->itsId randomStr(6);
            
$query_string sprintf("
INSERT INTO`%ssession`
(`sid`, `uid`, `uname`, `ctime`, `atime`, `gid`, `group`)
VALUES('%s', %d, '%s', %d, %d, %d, '%s');"
$this->itsPerfix$this->itsId$this->itsUser->itsId$this->itsUser->itsName
$this->itsCtime$this->itsAtime$this->itsUser->itsGid$this->itsUser->itsGroup);
            
$db->setOnError();//关闭错误中断输出开关
            
$result $db->query($query_string);
            
$db->setOnError("die");//开启错误中断输出开关
            
if($result){
                break;
            }
            if(
1000 == $i){
                return 
false;
            }
            return 
true;
        }
    }
    
    
//设定为默认用户
    
function setDefault(){
        global 
$defaultUser;
        
$this->itsUser = & $defaultUser;
        
$defaultUser->itsSession = & $this;
    }
}

//构造随机字符串
//模仿Discuz!的函数 ;P
function randomStr($num$chars "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789abcdefghijklmnopqrstuvwxyz"){
    
mt_srand((double)microtime() * 1000000);
    
$hash    "";
    
$max    strlen($chars) - 1;
    for(
$i 0;$i $num;$i ++) {
        
$hash .= $chars[mt_rand(0$max)];
    }
    return 
$hash;
}

//刷新会话
function refreshSession($sessPerfix){
    global 
$db;
    
//回收资源
    
$query_string sprintf("DELETE FROM `%ssession` WHERE `atime`+%d<UNIX_TIMESTAMP();"$sessPerfixSES_EXP);
    
$db->query($query_string);
    
//清理过期用户session
    
$query_string sprintf("UPDATE `%smember` SET `sid`='', `ttl`=0 WHERE `ttl`<UNIX_TIMESTAMP() AND `ttl`!=0;"$sessPerfix);
    
$db->query($query_string);
}

//获取在线用户
function getOnline($userPerfix){
    global 
$db;
    
$query_string sprintf("SELECT * FROM `%smember` WHERE `ol`=1;"$userPerfix);
    
$result $db->query($query_string);
    
$num mysql_num_rows($result);
    
$arrayUser = array();
    for(
$i 0;$i $num;$i ++){
        
$tmpUser = new user;
        
$tmpUser->import($db->fetch($resultMYSQL_ASSOC));
        
$arrayUser[$tmpUser->itsId] = $tmpUser;
    }
    return 
$arrayUser;
}


//用户
class user{
    var 
$itsId;
    var 
$itsName;
    var 
$itsOl;
    var 
$itsSession;
    var 
$itsGid;
    var 
$itsGroup;
    var 
$itsPower;
    var 
$itsPerfix;
    
    function 
user($id 0$perfix ""){
        
$this->itsId $id;
        
$this->itsName "";
        
$this->itsGid 0;
        
$this->itsGname "";
        
$this->itsOl 0;
        
$this->itsSession NULL;
        
$this->itsPerfix $perfix;
    }
    
    
//导入数据
    
function import(& $array){
        global 
$groupData;
        
$this->itsId    = isset($array["uid"])    ? $array["uid"]        : $this->itsId;
        
$this->itsName    = isset($array["uname"])? $array["uname"]    : $this->itsName;
        
$this->itsGid    = isset($array["gid"])    ? $array["gid"]        : $this->itsGid;
        
$this->itsGroup    = isset($array["group"])? $array["group"]    : $this->itsGroup;
        
$this->itsOl    = isset($array["ol"])    ? $array["ol"]        : $this->itsOl;
        if(isset(
$array["gid"]) && isset($groupData[$array["gid"]])){
            
$this->itsPower    $groupData[$array["gid"]]["power"];
            
$this->itsGroup    $groupData[$array["gid"]]["group"];
        }
    }
    
    
//登录
    //返回false:登录失败
    
function login($name$psw$ttl 0){
        global 
$db;
        if(
NULL == $this->itsSession){
            return 
false;
        }
        
$query_string sprintf("
SELECT * FROM `%smember`
WHERE `uname`='%s' AND `password`=md5('%s');"
$this->itsPerfix$name$psw);
        
$result $db->query($query_string);
        if(
!= mysql_num_rows($result)){
            return 
false;
        }
        
$this->import($db->fetch($resultMYSQL_ASSOC));
        
$this->itsOl 1;
        
mysql_free_result($result);
        
//mysql版本>4.0.4
        
$query_string sprintf("
UPDATE `%ssession`, `%smember`
SET `%ssession`.`uid`=%d, `%ssession`.`uname`='%s', `%smember`.`ol`=1, `%smember`.`sid`='%s'
WHERE `%ssession`.`sid`='%s' AND `%smember`.`uid`='%s';"
$this->itsPerfix$this->itsPerfix
$this->itsPerfix$this->itsId$this->itsPerfix$this->itsName$this->itsPerfix$this->itsPerfix$this->itsSession->itsId
$this->itsPerfix$this->itsSession->itsId$this->itsPerfix$this->itsId);
        
$result $db->query($query_string);
        if(
mysql_affected_rows($db->itsLink)){
            return 
$result;
        }
        return 
false;
    }
    
    
//注册
    
function register($psw){
        global 
$db;
        if(
"" == $this->itsName || 255 strlen($this->itsName)){
            return 
false;
        }
        
$query_string sprintf("
INSERT INTO `%smember`(`uname`, `password`)
VALUES ('%s', md5('%s'));"
$this->itsPerfix$this->itsName$psw);
        
$db->errorHandle();
        
$result $db->query($query_string);
        
$db->errorHandle("die");
        return 
$result;
    }
}
?>
2007-2-28 03:35 PM#1
查看资料  Blog  发短消息  顶部
 
sanders_yao
版主
Rank: 7Rank: 7Rank: 7
or2 =333


UID 30286
精华 0
积分 2487
帖子 4632
金钱 2484 喜悦币
威望 0
人脉 3
阅读权限 100
注册 2004-7-23
来自 北京 菜户营
状态 离线
[推荐阅读] 新建上海php交流群
数据库结构基于左右值的分类类型范例

这个仅仅做了些最简单的功能

<?php
//############################
#    文件:cat.class.php
#    作者:Sanders Yao
#    名称:左右值分类节点类型
#    功能:多级分类
#    必须全局变量:
#    $db:MySQL数据库操作对象(MyDB类型)
#    类型:
#    cat:
#    左右值节点类型
#    全局函数:
#    cat2link:
#    获取cat对象数组
#    返回cat对象数组
#    递归的方法合并一组cat对象
#    cat2expert:
#    获取cat对象
#    返回二维数组
#    导出cat对象及其子集对象到一个二维数组中
#    最后修改时间:2007-2-2
/*    sql:
CREATE TABLE `cat2_cat` (
  `cid` int(10) unsigned NOT NULL auto_increment,
  `lid` int(10) NOT NULL,
  `rid` int(10) NOT NULL,
  `cname` char(255) NOT NULL,
  PRIMARY KEY  (`cid`),
  KEY `left` (`lid`),
  KEY `right` (`rid`),
  FULLTEXT KEY `name` (`cname`)
) ENGINE=MyISAM ROW_FORMAT=FIXED;
--    test records:
insert into `cat2_cat` (`cid`,`lid`,`rid`,`cname`) values (1,1,8,'root'),(2,2,3,'newTest'),(3,4,7,'newTest2'),(4,5,6,'oomph');
*/
//############################

//左右值分类节点类型
class cat{
    var 
$itsId;
    var 
$itsLid;
    var 
$itsRid;
    var 
$itsName;
    var 
$itsPerfix;
    var 
$itsNumSub;
    var 
$itsSub;
    var 
$itsParent;
    
    function 
cat($id 0$perfix ""){
        
$this->itsId        $id;
        
$this->itsLid        0;
        
$this->itsRid        0;
        
$this->itsName        "";
        
$this->itsPerfix    $perfix;
        
$this->itsNumSub    0;
        
$this->itsSub        = array();
        
$this->itsParent    NULL;
        
$this->load();
    }
    
    
//导入数据(*checked*)
    
function import(& $array){
        
$this->itsId        = isset($array["cid"])        ? $array["cid"]        : $this->itsId;
        
$this->itsLid        = isset($array["lid"])        ? $array["lid"]        : $this->itsLid;
        
$this->itsRid        = isset($array["rid"])        ? $array["rid"]        : $this->itsRid;
        
$this->itsName        = isset($array["cname"])    ? $array["cname"]    : $this->itsName;
        
$this->itsNumSub    = ($this->itsRid $this->itsLid 1) / 2;
    }
    
    
//导出数据(*checked*)
    
function export($ignoreId false){
        
$result = array(
        
"cid" => $this->itsId,
        
"lid" => $this->itsLid,
        
"rid" => $this->itsRid,
        
"cname" => $this->itsName);
        if(
$ignoreId){
            unset(
$result["cid"]);
        }
        return 
$result;
    }
    
    
//加载分类信息(*checked*)
    
function load(){
        global 
$db;
        if(
== $this->itsId){
            return 
false;
        }
        
$query_string sprintf("SELECT * FROM `%scat2_cat` WHERE `cid`=%d;"$this->itsPerfix$this->itsId);
        
$result $db->query($query_string);
        if(
== mysql_num_rows($result)){
            
print_r($db);
            die(
"");
            return 
false;
        }
        
$arrayTmp mysql_fetch_array($resultMYSQL_ASSOC);
        
mysql_free_result($result);
        
$this->import($arrayTmp);
        return 
true;
    }
    
    
//获取所有子集分类(*checked*)
    
function loadSub(){
        global 
$db;
        if(
== $this->itsNumSub){
            return 
false;
        }
        
$query_string sprintf("SELECT * FROM `%scat2_cat` WHERE `lid`>%d AND `rid`<%d ORDER BY `lid` ASC;"$this->itsPerfix$this->itsLid$this->itsRid);
        
$result $db->query($query_string);
        
$num mysql_num_rows($result);
        
$tmpArray = array();
        for(
$i 0;$i $num;$i ++){
            
$tmpArray[$i] = new cat;
            
$tmpArray[$i]->import(mysql_fetch_array($resultMYSQL_ASSOC));
        }
        
cat2link($this$tmpArray);
        
mysql_free_result($result);
        return 
true;
    }
    
    
//通过偏移量设定左值(右值联动)(*checked*)
    
function setLeft($delta){
        
$this->itsLid += $delta;
        
$this->itsRid $this->itsNumSub $this->itsLid 1;
        foreach(
$this->itsSub as $key => $cat){
            
$this->itsSub[$key]->setLeft($delta);
        }
    }
    
    
//添加子分类(*checked*)
    //返回false: 缺失分类名称
    
function add($cat$save false){
        global 
$db;
        if(
"" == $cat->itsName){
            return 
false;
        }
        if(
$save){
            
$query_string sprintf("UPDATE `%scat2_cat` SET `rid`=`rid`+%d WHERE `rid`>=%d;"$this->itsPerfix, ($cat->itsNumSub 1) * 2$this->itsRid);
            
$db->query($query_string);
            
$query_string sprintf("UPDATE `%scat2_cat` SET `lid`=`lid`+%d WHERE `lid`>%d;"$this->itsPerfix, ($cat->itsNumSub 1) * 2$this->itsRid);
            
$db->query($query_string);
        }
        
$this->itsRid += ($cat->itsNumSub 1) * 2;
        
$delta = ($this->itsRid - ($cat->itsNumSub 1) * 2) - $cat->itsLid;
        
$cat->setLeft($delta);
        
$this->itsRid += ($cat->itsNumSub 1) * 2;
        
$this->itsSub[0] = & $cat;
        
$this->itsSub[0]->itsParent = & $this;
        if(
$save){
            
$arrayNew cat2expert($cattrue);
            
$arrayQuery = array();
            foreach(
$arrayNew as $key => $row){
                
$arrayQuery[$key] = sprintf("(%d, %d, '%s')"$row["lid"], $row["rid"], $row["cname"]);
            }
            
$query_string sprintf("INSERT INTO `%scat2_cat`(`lid`, `rid`, `cname`) VALUES %s;"$this->itsPerfiximplode(","$arrayQuery));
            
$db->query($query_string);
        }
        return 
true;
    }
    
    
//删除该节点及其子节点(*checked*)
    //复制返回自己(左值归1)
    
function destroy($save false){
        global 
$db;
        if(
== $this->itsLid){
            return 
false;
        }
        if(
$save){
            
$query_string sprintf("DELETE FROM `%scat2_cat` WHERE `lid`>=%d AND `rid`<=%d;"$this->itsPerfix$this->itsLid$this->itsRid);
            
$db->query($query_string);
            
$query_string sprintf("UPDATE `%scat2_cat` SET `rid`=`rid`-%d WHERE `rid`>%d;"$this->itsPerfix, ($this->itsNumSub 1) * 2$this->itsRid);
            
$db->query($query_string);
            
$query_string sprintf("UPDATE `%scat2_cat` SET `lid`=`lid`-%d WHERE `lid`>%d;"$this->itsPerfix, ($this->itsNumSub 1) * 2$this->itsRid);
            
$db->query($query_string);
        }
        
$this->setLeft($this->itsLid);
        return 
$this;
    }
    
    
//清空子分类(*checked*)
    //返回false:无子分类
    
function clean($save false){
        global 
$db;
        if(
== $this->itsNumSub){
            return 
false;
        }
        if(
$save){
            
$query_string sprintf("DELETE FROM `%scat2_cat` WHERE `lid`>%d AND `rid`<%d;"$this->itsPerfix$this->itsLid$this->itsRid);
            
$db->query($query_string);
            
$query_string sprintf("UPDATE `%scat2_cat` SET `rid`=`rid`-%d WHERE `rid`>=%d;"$this->itsPerfix$this->itsNumSub 2$this->itsRid);
            
$db->query($query_string);
            
$query_string sprintf("UPDATE `%scat2_cat` SET `lid`=`lid`-%d WHERE `lid`>%d;"$this->itsPerfix$this->itsNumSub 2$this->itsRid);
            
$db->query($query_string);
        }
        
$this->load();
        
$this->loadSub();
        return 
true;
    }
    
    
//移动(*checked*)
    //返回false:无效的目标
    
function move($id$save false){
        global 
$db;
        if(
$save){
            
//加载所有子分类
            
if(== count($this->itsSub)){
                
$this->loadSub();
            }
            
            
//检查目标分类的合法性
            
$target = new cat($id$this->itsPerfix);
            if(
"" == $target->itsName || $target->itsId == $this->itsId || ($target->itsLid $this->itsLid && $target->itsRid $this->itsRid)){
                return 
false;
            }
            
            
//填补自己之前的位置 腾出新的空位置