喜悦国际村 » 代码共享 » 最近写的代码 仅做交流用

页: [1] 2 3 4
sanders_yao2007-2-28 07:35 AM
最近写的代码 仅做交流用

用户会话类型
[php]<?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(0 == mysql_num_rows($result)){
                        return false;
                }
                $arrayTmp = $db->fetch($result, MYSQL_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(0 == mysql_num_rows($result)){
                        return false;
                }
                $arrayTmp = $db->fetch($result, MYSQL_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(0 == $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 = 0 == $sck_expi ? 0 : 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();", $sessPerfix, SES_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($result, MYSQL_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(1 != mysql_num_rows($result)){
                        return false;
                }
                $this->import($db->fetch($result, MYSQL_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;
        }
}
?>[/php]

sanders_yao2007-2-28 07:41 AM
数据库结构基于左右值的分类类型范例

这个仅仅做了些最简单的功能
[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(0 == $this->itsId){
                        return false;
                }
                $query_string = sprintf("SELECT * FROM `%scat2_cat` WHERE `cid`=%d;", $this->itsPerfix, $this->itsId);
                $result = $db->query($query_string);
                if(0 == mysql_num_rows($result)){
                        print_r($db);
                        die("");
                        return false;
                }
                $arrayTmp = mysql_fetch_array($result, MYSQL_ASSOC);
                mysql_free_result($result);
                $this->import($arrayTmp);
                return true;
        }
       
        //获取所有子集分类(*checked*)
        function loadSub(){
                global $db;
                if(0 == $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($result, MYSQL_ASSOC));
                }
                cat2link($this, $tmpArray);
                mysql_free_result($result);
                return true;
        }
       
        //通过偏移量设定左值(右值联动)(*checked*)
        function setLeft($delta){
                $this->itsLid += $delta;
                $this->itsRid = $this->itsNumSub * 2 + $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($cat, true);
                        $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->itsPerfix, implode(",", $arrayQuery));
                        $db->query($query_string);
                }
                return true;
        }
       
        //删除该节点及其子节点(*checked*)
        //复制返回自己(左值归1)
        function destroy($save = false){
                global $db;
                if(1 == $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(1 - $this->itsLid);
                return $this;
        }
       
        //清空子分类(*checked*)
        //返回false:无子分类
        function clean($save = false){
                global $db;
                if(0 == $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(0 == 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;
                        }
                       
                        //填补自己之前的位置 腾出新的空位置
                        if($target->itsLid < $this->itsLid){
                                $query_string = sprintf("UPDATE `%scat2_cat`
SET `rid`=`rid`+%d
WHERE `rid`<%d AND `rid`>=%d;", $this->itsPerfix, ($this->itsNumSub + 1) * 2, $this->itsRid, $target->itsRid);
                                $db->query($query_string);
                               
                                $query_string = sprintf("UPDATE `%scat2_cat`
SET `lid`=`lid`+%d
WHERE `lid`<%d AND `lid`>%d;", $this->itsPerfix, ($this->itsNumSub + 1) * 2, $this->itsLid, $target->itsRid);
                                $db->query($query_string);
                                $this->setLeft($target->itsRid - $this->itsLid);
                        }else{
                                $query_string = sprintf("UPDATE `%scat2_cat`
SET `rid`=`rid`+%d
WHERE `rid`>%d AND `rid`<%d;", $this->itsPerfix, ($this->itsNumSub + 1) * -2, $this->itsRid, $target->itsRid);
                                $db->query($query_string);
                               
                                $query_string = sprintf("UPDATE `%scat2_cat`
SET `lid`=`lid`+%d
WHERE `lid`>%d AND `lid`<%d;", $this->itsPerfix, ($this->itsNumSub + 1) * -2, $this->itsRid, $target->itsRid);
                                $db->query($query_string);
                                $this->setLeft($target->itsRid - ($this->itsNumSub + 1) * 2 - $this->itsLid);
                        }
                       
                        //批量将节点数据移动到空置位置
                        $arrayNew = cat2expert($this);
                        $arrayQuery = array();
                        foreach($arrayNew as $key => $row){
                                $arrayQuery[$key] = sprintf("(%d, %d, %d, '%s')", $row["cid"], $row["lid"], $row["rid"], $row["cname"]);
                        }
                        $query_string = sprintf("REPLACE INTO `%scat2_cat`(`cid`, `lid`, `rid`, `cname`) VALUES %s;", $this->itsPerfix, implode(",", $arrayQuery));
                        $db->query($query_string);
                }
                $this->load();
                $this->loadSub();
                return true;
        }
       
        //复制(*checked*)
        //返回false:无效的目标
        function clone($id, $save = false){
                if($save){
                        if(0 == count($this->itsSub)){
                                $this->loadSub();
                        }
                        $buffer = $this;
                        $target = new cat($id, $this->itsPerfix);
                        if("" == $target->itsName || $target->itsId == $this->itsId || ($target->itsLid < $this->itsLid && $target->itsRid > $this->itsRid)){
                                return false;
                        }
                        $buffer->setLeft(1 - $this->itsLid);
                        $target->add($buffer, $save);
                }
                $this->load();
                $this->loadSub();
                return true;
        }
       
        //保存分类信息(*checked*)
        function save(){
                global $db;
                if(0 == $this->itsId){
                        return false;
                }
                $query_string = sprintf("UPDATE `%scat2_cat` SET `lid`=%d, `rid`=%d, `cname`='%s' WHERE `cid`=%d;", $this->itsPerfix, $this->itsLid, $this->itsRid, $this->itsName, $this->itsId);
                return $db->query($query_string);
        }
       
        //输入分类名称
        function setName($str){
                if("" == $str || 255 < count($str)){
                        return false;
                }
                $this->itsName = $str;
                return true;
        }
       
        //获取到根节点的路径(*checked*)
        function getPath(){
                global $db;
                $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);
                $arrayCat = array();
                $root = new cat;
                for($i = 0;$i < $num;$i ++){
                        $arrayTmp = mysql_fetch_array($result, MYSQL_ASSOC);
                        $tmpCat = new cat;
                        $tmpCat->import($arrayTmp);
                        if(1 == $tmpCat->itsLid){
                                $root = $tmpCat;
                        }else{
                                $arrayCat[$tmpCat->itsId] = $tmpCat;
                        }
                }
                mysql_free_result($result);
                cat2link($root, $arrayCat);
                return $root;
        }
}

//归并左右值对象数组(左值起始)(*checked*)
function cat2link(& $parent, $array){
        $result        = array();
        $left        = $parent->itsLid;
        $right        = $parent->itsRid;
        if(1 != $right - $left){
                foreach($array as $key => $cat){
                        if($left == $cat->itsLid - 1 && $cat->itsRid < $right){
                                $left = $cat->itsRid;
                                $cat->itsParent        = & $parent;
                                $result[$cat->itsId] = $cat;
                                //unset($array[$key]);
                                cat2link($result[$cat->itsId], $array);
                        }
                }
        }
        $parent->itsSub = $result;
}

//导出分类对象到二维数组(*checked*)
function cat2expert(& $cat, $ignoreId = false){
        $result = array();
        foreach($cat->itsSub as $sub){
                array_push($result, $sub->export($ignoreId));
                if(0 != $sub->itsNumSub){
                        array_merge($result, cat2expert($sub));
                }
        }
        $self = $cat->export($ignoreId);
        array_unshift($result, $self);
        return $result;
}
?>[/php]

kickkick1232007-2-28 02:08 PM
学习ING

沉默的抗议2007-3-3 01:50 AM
好帖,生成随机数代码收藏

sanders_yao2007-4-2 06:40 AM
[php]
//####################################
#        文件:get_http_request.class.php
#        名称:http请求类型
#        作者:Sanders Yao
#        共能:请求远程资源
#        目前只测试了post提交数据
#        修改时间:2007-4-2
//####################################

//http请求类
class httpRequest{
        var $itsUrl;                //网址
        var $itsParseUrl;        //解析后的地址
        var $itsFp;                        //句柄
        var $itsError;                //错误信息
        var $itsPHead;                //发送文件头
        var $itsRHead;                //获取文件头
        var $itsContent;        //数据内容
        var $itsJumps;                //被重定向次数
        var $itsStartTime;        //开始时间
        var $itsPostData;        //post数据
        var $itsCChars;                //客户端字符集
        var $itsSChars;                //服务器端字符集
       
        function httpRequest($url = ""){
                $this->itsUrl = $url;
                $this->itsParseUrl = array(
                        "scheme"        => "http",
                        "host"                => "",
                        "port"                => 80,
                        "user"                => "",
                        "pass"                => "",
                        "path"                => "",
                        "query"                => "",
                        "fragment"        => ""
                );
                $this->itsFp = false;
                $this->itsError = "";
                $this->itsPHead = array();
                $this->itsRHead = array();
                $this->itsContent = "";
                $this->itsJumps = 0;
                $this->itsStartTime = time();
                $this->itsPostData = array();
                $this->itsCChars = "GB2312";
                $this->itsSChars = "GB2312";
                $this->ini();
        }
       
        //根据url初始化
        function ini(){
                $tmpArray = parse_url($this->itsUrl);
                foreach($tmpArray as $k => $v){
                        $this->itsParseUrl[$k] = $v;
                }
                if("http" != strtolower($this->itsParseUrl["scheme"])){
                        $this->itsError .= "[1]";//无法判断协议或非http协议链接
                }
                if("" == $this->itsParseUrl["host"]){
                        $this->itsError .= "[2]";//无法判断域名
                }
                if("" == $this->itsParseUrl["path"]){
                        $this->itsError .= "[3]";//无法判断路径
                }
                return "" == $this->itsError ? true : false;
        }
       
        //设定发送的文件头
        function setHead($k, $v){
                $this->itsPHead[$k] = $v;
        }
       
        //获取收到的文件头
        function getHead($k){
                return isset($this->itsRHead[$k]) ? $this->itsRHead[$k] : "";
        }
               
        //发送请求
        function send($iconv = false){
                $errn = 0;
                $errs = "";
                $data = "";//post数据
                $headText = "";        //debug
                $this->itsFp = @fsockopen(
                $this->itsParseUrl["host"],
                $this->itsParseUrl["port"],
                $errn, $errs);
                if(false === $this->itsFp){
                        $this->itsError .= "[4]" . $errn . ":" . $errs;//请求失败
                        return false;
                }
                $httpv = "" == $this->getHead("http-version") ? "HTTP/1.0" : "HTTP/1.1";
                $target = 0 == count($this->itsPostData) ? "GET " : "POST ";
                $target .= $this->itsParseUrl["path"] . " " . $httpv;
               
                $this->itsPHead["Host"] =
                isset($this->itsPHead["Host"])
                ? $this->itsPHead["Host"]
                : $this->itsParseUrl["host"];
               
                $this->itsPHead["Accept"] =
                isset($this->itsPHead["Accept"])
                ? $this->itsPHead["Accept"]
                : "*/*";
               
                $this->itsPHead["User-Agent"] =
                isset($this->itsPHead["User-Agent"])
                ? $this->itsPHead["User-Agent"]
                : "Mozilla/5.0 (Windows; U; Windows NT 5.1; zh-CN; rv:1.8.1.3) Gecko/20070309 Firefox/2.0.0.3";
               
                $this->itsPHead["Refer"] =
                isset($this->itsPHead["Refer"])
                ? $this->itsPHead["Refer"]
                : $this->itsParseUrl["scheme"] . "://" . $this->itsParseUrl["host"] . "/";
               
                fputs($this->itsFp, $target);
                $headText .= $target;
                foreach($this->itsPHead as $k => $v){
                        fputs($this->itsFp, $k . ": " . $v . "\r\n");
                        $headText .= $k . ": " . $v . "\r\n";
                }
               
                if(0 < count($this->itsPostData)){
                        $this->itsPHead["Content-Type"] =
                        isset($this->itsPHead["Content-Type"])
                        ? $this->itsPHead["Content-Type"]
                        : "application/x-www-form-urlencoded";
                       
                        if(function_exists("iconv")){
                                $data =
                                $this->itsCChars != $this->itsSChars
                                ? iconv($this->itsCChars, $this->itsSChars, $this->importPost())
                                : $this->importPost();
                        }else{
                                $data = $this->importPost();
                        }
                        fputs($this->itsFp, "Content-Type: " . $this->itsPHead["Content-Type"] . "\r\n");
                        $headText .= "Content-Type: " . $this->itsPHead["Content-Type"] . "\r\n";
                        fputs($this->itsFp, "Content-Length: " . strlen($data) . "\r\n");
                        $headText .= "Content-Length: " . strlen($data) . "\r\n";
                }
               
                if("HTTP/1.1" == $httpv){
                        fputs($this->itsFp, "Connection: Close\r\n\r\n");
                        $headText .= "Connection: Close\r\n\r\n";
                }else{
                        fputs($this->itsFp, "\r\n");
                        $headText .= "\r\n";
                }
                fputs($this->itsFp, $data);
                $headText .= $data;
               
                $status = fgets($this->itsFp, 256);
                $this->itsRHead["http-version"] = substr($status, 0, 8);
                $this->itsRHead["status"] = substr($status, 9, 3);
                $this->itsRHead["description"] = substr($status, 13);
                for(;1;){
                        if(feof($this->itsFp)){
                                fclose($this->itsFp);
                                $this->itsFp = false;
                                break;
                        }
                        if("" == $line = trim(fgets($this->itsFp, 256))){
                                break;
                        }
                        if(0 != preg_match("~^([^:]+):(.*)$~", $line, $clip)){
                                $this->itsRHead[trim($clip[1])] = trim($clip[2]);
                        }
                }
               
                //重定向处理
                if(3 == $this->itsRHead["status"][0]){
                        if(3 < $this->itsJumps){
                                $this->itsError .= "[5]";//重定向次数已满
                                return false;
                        }
                        if(isset($this->itsRHead["location"])){
                                if("http" != substr($this->itsRHead["location"], 0, 4)){
                                        $tempUrl = $this->itsRHead["location"];
                                        $this->itsRHead["location"] = "http://" . $this->itsParseUrl["host"]
                                        . ":" . $this->itsPHead["port"] . "/"
                                        . $this->itsRHead["location"];
                                }
                                $this->itsUrl = $this->itsRHead["location"];
                                $this->ini();
                                $this->send();
                        }else{
                                $this->itsError .= "[6]";//无法获取重定向地址
                                return false;
                        }
                }
               
                //读取内容
                if(2 == $this->itsRHead["status"][0]){
                        for(;1;){
                                if(feof($this->itsFp)){
                                        fclose($this->itsFp);
                                        $this->itsFp = false;
                                        break;
                                }
                                $this->itsContent .= fread($this->itsFp, 1024);
                        }
                        if(function_exists("iconv") && $iconv){
                                $this->itsContent =
                                $this->itsSChars != $this->itsCChars
                                ? iconv($this->itsSChars, $this->itsCChars, $this->itsContent)
                                : $this->itsContent;
                        }
                        return true;
                }
                fclose($this->itsFp);
                $this->itsFp = false;
                return false;
        }
       
        //导入并格式化post数据
        function importPost($array = NULL, $perfix = ""){
                $array = NULL == $array ? $this->itsPostData : $array;
                foreach($array as $k => $v){
                        if(is_array($v)){
                                if("" == $perfix){
                                        $postData[$k] = urlencode($k) . "=" . $this->importPost($v, $k);
                                }else{
                                        $postData[$k] = urlencode($k) . "=" . $this->importPost($v, $perfix . urlencode("[" . $k . "]"));
                                }
                        }else{
                                if("" == $perfix){
                                        $postData[$k] = urlencode($k) . "=" . urlencode($v);
                                }else{
                                        $postData[$k] = $perfix . urlencode("[" . $k . "]") . "=" . urlencode($v);
                                }
                        }
                }
                return implode("&", $postData);
        }
}
$req = new httpRequest("http://localhost/");
$req->itsPostData = array("a"=>"fasfasdf", "b"=>"ljfijoifsd", "c"=>array(1,2,3));
if($req->send()){
        echo $req->itsContent;
}else{
        echo $req->itsError;
}
[/php]

unspace2007-4-5 06:49 AM
我给来顶贴

isno2007-4-5 08:42 AM
刷分.....

txg0_02007-4-10 09:00 AM
我顶
你个肺
好东西,先收藏,有时间再做研究!

沒錢2007-4-11 04:44 AM
收了..............

yiqieqie2007-4-12 02:41 AM
asdfasdfsadf:@:'(

mumadance2007-4-13 02:33 PM
支持~~:)

sanders_yao2007-4-16 10:00 AM
修正了远程请求类型 添加了get方法请求远程数据

修正了远程请求类型 添加了通过get方法请求远程数据的功能
这个类型的灵感主要来自织梦(dedecms)的远程下载类型
个人感觉dede的那个类型的缺点在于:
过多的使用了正则(包括那个下载字符串中远程图片的函数)不利于执行效率
post方法还需要我们将post数据添加在url里 无法区分post方法中的get变量
我重新写了类型并对以上两点做出了自己的改进
目前还无法通过http上传文件到指定服务器 请高手指点
以后将加入在跳转时自动发送cookie的功能
[php]
<?php
//####################################
#        文件:request.class.php
#        名称:http请求类型
#        作者:Sanders Yao
#        共能:请求远程资源
#        目前只测试了post提交数据
#        修改时间:2007-4-16
//####################################

//http请求类
class httpRequest{
        var $itsUrl;                //网址
        var $itsParseUrl;        //解析后的地址
        var $itsFp;                        //句柄
        var $itsError;                //错误信息
        var $itsPHead;                //发送文件头
        var $itsRHead;                //获取文件头
        var $itsContent;        //数据内容
        var $itsJumps;                //被重定向次数
        var $itsStartTime;        //开始时间
        var $itsPostData;        //post数据
        var $itsCChars;                //客户端字符集
        var $itsSChars;                //服务器端字符集
       
        function httpRequest($url = ""){
                $this->itsUrl = $url;
                $this->itsParseUrl = array(
                        "scheme"        => "http",
                        "host"                => "",
                        "port"                => 80,
                        "user"                => "",
                        "pass"                => "",
                        "path"                => "",
                        "query"                => "",
                        "fragment"        => ""
                );
                $this->itsFp = false;
                $this->itsError = "";
                $this->itsPHead = array();
                $this->itsRHead = array();
                $this->itsContent = "";
                $this->itsJumps = 0;
                $this->itsStartTime = time();
                $this->itsPostData = array();
                $this->itsCChars = "GB2312";
                $this->itsSChars = "GB2312";
                $this->ini();
        }
       
        //根据url初始化
        function ini(){
                $tmpArray = parse_url($this->itsUrl);
                foreach($tmpArray as $k => $v){
                        $this->itsParseUrl[$k] = $v;
                }
                if("http" != strtolower($this->itsParseUrl["scheme"])){
                        $this->itsError .= "[1]";//无法判断协议或非http协议链接
                }
                if("" == $this->itsParseUrl["host"]){
                        $this->itsError .= "[2]";//无法判断域名
                }
                if("" == $this->itsParseUrl["path"]){
                        $this->itsError .= "[3]";//无法判断路径
                }
                return "" == $this->itsError ? true : false;
        }
       
        //设定发送的文件头
        function setHead($k, $v){
                $this->itsPHead[$k] = $v;
        }
       
        //获取收到的文件头
        function getHead($k){
                return isset($this->itsRHead[$k]) ? $this->itsRHead[$k] : "";
        }
               
        //发送请求
        function send($iconv = false){
                $errn = 0;
                $errs = "";
                $data = "";//post数据
                $headText = "";        //debug
                $this->itsFp = @fsockopen(
                $this->itsParseUrl["host"],
                $this->itsParseUrl["port"],
                $errn, $errs);
                if(false === $this->itsFp){
                        $this->itsError .= "[4]" . $errn . ":" . $errs;//请求失败
                        return false;
                }
                $httpv = "" == $this->getHead("http-version") ? "HTTP/1.0" : "HTTP/1.1";
                $target = 0 == count($this->itsPostData) ? "GET " : "POST ";
                $this->itsParseUrl["path"] .= "?" . $this->itsParseUrl["query"];
                $target .= $this->itsParseUrl["path"] . " " . $httpv . "\r\n";
               
                $this->itsPHead["Host"] =
                isset($this->itsPHead["Host"])
                ? $this->itsPHead["Host"]
                : $this->itsParseUrl["host"];
               
                $this->itsPHead["Accept"] =
                isset($this->itsPHead["Accept"])
                ? $this->itsPHead["Accept"]
                : "*/*";
               
                $this->itsPHead["User-Agent"] =
                isset($this->itsPHead["User-Agent"])
                ? $this->itsPHead["User-Agent"]
                : "Mozilla/5.0 (Windows; U; Windows NT 5.1; zh-CN; rv:1.8.1.3) Gecko/20070309 Firefox/2.0.0.3";
               
                $this->itsPHead["Referer"] =
                isset($this->itsPHead["Referer"])
                ? $this->itsPHead["Referer"]
                : $this->itsParseUrl["scheme"] . "://" . $this->itsParseUrl["host"] . "/";
               
                fputs($this->itsFp, $target);
                $headText .= $target;
                foreach($this->itsPHead as $k => $v){
                        fputs($this->itsFp, $k . ": " . $v . "\r\n");
                        $headText .= $k . ": " . $v . "\r\n";
                }
               
                if(0 < count($this->itsPostData)){
                        $this->itsPHead["Content-Type"] =
                        isset($this->itsPHead["Content-Type"])
                        ? $this->itsPHead["Content-Type"]
                        : "application/x-www-form-urlencoded";
                       
                        if(function_exists("iconv")){
                                $data =
                                $this->itsCChars != $this->itsSChars
                                ? iconv($this->itsCChars, $this->itsSChars, $this->importPost())
                                : $this->importPost();
                        }else{
                                $data = $this->importPost();
                        }
                        fputs($this->itsFp, "Content-Type: " . $this->itsPHead["Content-Type"] . "\r\n");
                        $headText .= "Content-Type: " . $this->itsPHead["Content-Type"] . "\r\n";
                        fputs($this->itsFp, "Content-Length: " . strlen($data) . "\r\n");
                        $headText .= "Content-Length: " . strlen($data) . "\r\n";
                }
               
                if("HTTP/1.1" == $httpv){
                        fputs($this->itsFp, "Connection: Close\r\n\r\n");
                        $headText .= "Connection: Close\r\n\r\n";
                }else{
                        fputs($this->itsFp, "\r\n");
                        $headText .= "\r\n";
                }
                fputs($this->itsFp, $data);
                $headText .= $data;
               
                $status = fgets($this->itsFp, 256);
                $this->itsRHead["http-version"] = substr($status, 0, 8);
                $this->itsRHead["status"] = substr($status, 9, 3);
                $this->itsRHead["description"] = substr($status, 13);
                for(;1;){
                        if(feof($this->itsFp)){
                                fclose($this->itsFp);
                                $this->itsFp = false;
                                break;
                        }
                        if("" == $line = trim(fgets($this->itsFp, 256))){
                                break;
                        }
                        if(0 != preg_match("~^([^:]+):(.*)$~", $line, $clip)){
                                $this->itsRHead[trim($clip[1])] = trim($clip[2]);
                        }
                }
               
                //重定向处理
                if(3 == $this->itsRHead["status"][0]){
                        if(3 < $this->itsJumps){
                                $this->itsError .= "[5]";//重定向次数已满
                                return false;
                        }
                        if(isset($this->itsRHead["location"])){
                                if("http" != substr($this->itsRHead["location"], 0, 4)){
                                        $tempUrl = $this->itsRHead["location"];
                                        $this->itsRHead["location"] = "http://" . $this->itsParseUrl["host"]
                                        . ":" . $this->itsPHead["port"] . "/"
                                        . $this->itsRHead["location"];
                                }
                                $this->itsUrl = $this->itsRHead["location"];
                                $this->ini();
                                $this->send();
                        }else{
                                $this->itsError .= "[6]";//无法获取重定向地址
                                return false;
                        }
                }
               
                //读取内容
                if(2 == $this->itsRHead["status"][0]){
                        for(;1;){
                                if(feof($this->itsFp)){
                                        fclose($this->itsFp);
                                        $this->itsFp = false;
                                        break;
                                }
                                $this->itsContent .= fread($this->itsFp, 1024);
                        }
                        if(function_exists("iconv") && $iconv){
                                $this->itsContent =
                                $this->itsSChars != $this->itsCChars
                                ? iconv($this->itsSChars, $this->itsCChars, $this->itsContent)
                                : $this->itsContent;
                        }
                        return true;
                }
                fclose($this->itsFp);
                $this->itsFp = false;
                return false;
        }
       
        //导入并格式化post数据
        function importPost($array = NULL, $perfix = ""){
                $array = NULL == $array ? $this->itsPostData : $array;
                foreach($array as $k => $v){
                        if(is_array($v)){
                                if("" == $perfix){
                                        $postData[$k] = urlencode($k) . "=" . $this->importPost($v, $k);
                                }else{
                                        $postData[$k] = urlencode($k) . "=" . $this->importPost($v, $perfix . urlencode("[" . $k . "]"));
                                }
                        }else{
                                if("" == $perfix){
                                        $postData[$k] = urlencode($k) . "=" . urlencode($v);
                                }else{
                                        $postData[$k] = $perfix . urlencode("[" . $k . "]") . "=" . urlencode($v);
                                }
                        }
                }
                return implode("&", $postData);
        }
}
?>
[/php]

sanders_yao2007-4-16 10:03 AM
奉上通过上面这个类型远程采集万网域名查询的方法

奉上通过上面这个类型远程采集万网域名查询的方法
测试用的 所以没做太复杂
[php]
if(isset($_GET["domain"])){
        $url = str_replace("{domain}", $_GET["domain"], "http://panda.[url]www.net.cn/cgi-bin/Check.cgi?domain1=[/url]{domain}&domain={domain}&image.x=14&image.y=14&big5=n&sign=2&com=yes&cn=yes&comcn=yes&mobi=yes");
        //$req = new httpRequest("http://panda.[url]www.net.cn/cgi-bin/Check.cgi?domain1=lalalu&domain=lalalu&image.x=14&image.y=14&big5=n&sign=2&com=yes&cn=yes&comcn=yes&mobi=yes[/url]");
        $req = new httpRequest($url);
        $req->setHead("Referer", "http://www.net.cn/");
        $req->setHead("Accept", "text/xml,application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5");
        $req->setHead("Accept-Language", "zh-cn,zh;q=0.5");
        $req->setHead("Accept-Encoding", "gzip,deflate");
        $req->setHead("Accept-Charset", "gb2312,utf-8;q=0.7,*;q=0.7");
        $req->setHead("Keep-Alive", "300");
        if($req->send()){
                preg_match_all(iconv("utf-8", "gb2312", "~.*?>([^=<]+?)=&gt; 已被注册~is"), $req->itsContent, $clips);
                echo "已被注册:";
                print_r($clips[1]);
                preg_match_all(iconv("utf-8", "gb2312", "~.*?>([^=<]+?)=&gt;<span class=\"style1\">没有被注册</span>~is"), $req->itsContent, $clips);
                echo "<br />未被注册:";
                print_r($clips[1]);
        }else{
                echo $req->itsError;
        }
}
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>test</title>
</head>

<body>
<form action="httpRequest.php">
        域名查询:<input type="text" name="domain" />
        <input type="submit" />
</form>
</body>
</html>
[/php]

chaizx2007-4-17 12:27 AM
好东西,楼主高人也!

shulinge2007-4-17 12:02 PM
学习下。。。。。。

sanders_yao2007-4-22 02:26 AM
本次修改修正了以下bug:
以前不能正确地处理通名的http头的的行比如有两行Set-Cookie我只保存了最后一行 目前修正了这个功能

本次修改添加了以下功能:
保存cookie的功能 要启动该功能需要设定可写的cookie保存目录 并赋值给属性itsCookieDir 每个域名发送的cookie会保存为一个php文件 如果服务器端返回的cookie值为"deleted" 本地cookie将会被删除

有兴趣的请帮我测试一下 在下感激之至 另外小心村里的php标记会吃掉斜线 测试请下载附件
[php]
<?php
//####################################
#        文件:request.class.php
#        名称:http请求类型
#        作者:Sanders Yao
#        共能:请求远程资源
#        目前只测试了post提交数据
#        修改时间:2007-4-22
//####################################

//http请求类
class httpRequest{
        var $itsUrl;                //网址
        var $itsParseUrl;        //解析后的地址
        var $itsFp;                        //句柄
        var $itsError;                //错误信息
        var $itsPHead;                //发送文件头
        var $itsRHead;                //获取文件头
        var $itsContent;        //数据内容
        var $itsJumps;                //被重定向次数
        var $itsStartTime;        //开始时间
        var $itsPostData;        //post数据
        var $itsCChars;                //客户端字符集
        var $itsSChars;                //服务器端字符集
        var $itsCookieDir;        //cookie保存目录
       
        function httpRequest($url = ""){
                $this->itsUrl = $url;
                $this->itsParseUrl = array(
                        "scheme"        => "http",
                        "host"                => "",
                        "port"                => 80,
                        "user"                => "",
                        "pass"                => "",
                        "path"                => "",
                        "query"                => "",
                        "fragment"        => ""
                );
                $this->itsFp = false;
                $this->itsError = "";
                $this->itsPHead = array();
                $this->itsRHead = array();
                $this->itsContent = "";
                $this->itsJumps = 0;
                $this->itsStartTime = time();
                $this->itsPostData = array();
                $this->itsCChars = "GB2312";
                $this->itsSChars = "GB2312";
                $this->ini();
                $this->itsCookieDir = false;
        }
       
        //根据url初始化
        function ini(){
                $tmpArray = parse_url($this->itsUrl);
                foreach($tmpArray as $k => $v){
                        $this->itsParseUrl[$k] = $v;
                }
                if("http" != strtolower($this->itsParseUrl["scheme"])){
                        $this->itsError .= "[1]";//无法判断协议或非http协议链接
                }
                if("" == $this->itsParseUrl["host"]){
                        $this->itsError .= "[2]";//无法判断域名
                }
                if("" == $this->itsParseUrl["path"]){
                        $this->itsError .= "[3]";//无法判断路径
                }
                return "" == $this->itsError ? true : false;
        }
       
        //设定发送的文件头
        function setHead($k, $v){
                $this->itsPHead[$k] = $v;
        }
       
        //获取收到的文件头
        function getHead($k){
                return isset($this->itsRHead[$k]) ? $this->itsRHead[$k] : "";
        }
               
        //发送请求
        function send($iconv = false){
                $errn = 0;
                $errs = "";
                $data = "";//post数据
                $headText = "";        //debug
                @include($this->itsCookieDir . $this->itsParseUrl["host"] . ".php");        //cookie数据
                $this->itsFp = @fsockopen(
                $this->itsParseUrl["host"],
                $this->itsParseUrl["p