页:
[1]
2
3
4
| sanders_yao | 2007-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_yao | 2007-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] |
| kickkick123 | 2007-2-28 02:08 PM |
|
| 学习ING |
| sanders_yao | 2007-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] |
| yiqieqie | 2007-4-12 02:41 AM |
|
| asdfasdfsadf:@:'( |
| mumadance | 2007-4-13 02:33 PM |
|
| 支持~~:) |
| sanders_yao | 2007-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_yao | 2007-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", "~.*?>([^=<]+?)=> 已被注册~is"), $req->itsContent, $clips);
echo "已被注册:";
print_r($clips[1]);
preg_match_all(iconv("utf-8", "gb2312", "~.*?>([^=<]+?)=><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] |
| shulinge | 2007-4-17 12:02 PM |
|
| 学习下。。。。。。 |
| sanders_yao | 2007-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 | |