存档

作者存档

PHP利用门户网站API转换IP地址到真实地址

2011年1月14日 admin 没有评论

腾讯,网易,新浪,搜狐都提供了IP地址转换为实际地址的接口.
腾讯:http://fw.qq.com/ipaddress 返回格式为 javascript格式对象. 形如: var IPData = new Array(“124.204.70.160″,”",”北京市”,”");
可以在页面中引入js文件 直接调用。


1
2
<script language="javascript" type="text/javascript" src="http://fw.qq.com/ipaddress"  charset="gb2312"> </script>
<script>document.write("你的IP是:"+IPData[0]+",来自:"+IPData[2]);</script>

搜狐: http://pv.sohu.com/cityjson 也是浏览器 js 调用的。返回 var returnCitySN = {“cip”: “124.204.70.160″, “cid”: “110000″, “cname”: “北京市”}; 的格式。

新浪的IP地址查询接口:http://int.dpool.sina.com.cn/iplookup/iplookup.php?format=js
返回
var remote_ip_info = {“ret”:1,”start”:”124.205.0.0″,”end”:”124.205.136.255″,”country”:”\u4e2d\u56fd”,”province”:”\u5317\u4eac”,”city”:”\u5317\u4eac”,”district”:”",”isp”:”\u7535\u4fe1\u901a”,”type”:”",”desc”:”"};

新浪多地域测试方法:http://int.dpool.sina.com.cn/iplookup/iplookup.php?format=js&ip=124.204.70.160

网易有道IP地址查询:http://www.youdao.com/smartresult-xml/search.s?type=ip&q=124.204.70.160

注: JavaScript调用还是PHP调用都要转换一下编码,不然得到的是乱码。
阅读全文…

分类: PHP 标签: , ,

PHP+AJAX 实现星级评分(百度文库评分)

2011年1月11日 admin 1 条评论

好多网站都有评分模块,百度文库,淘宝评价等,现以百度文库为例,简单实现一个基于jQuery的AJAX评分程序。

HTML代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
<div id="header">
 
</div>
 
<div id="main">
  <p><span id="s" class="s"></span><span id="g" class="g"></span></p>
  <div class="rate">
 
     <div class="big_rate">
        <span rate="很差" rscore="2" title="www.shaiblog.com 博客导航">&nbsp;</span>
        <span rate="较差" rscore="4" title="www.shaiblog.com 博客导航">&nbsp;</span>
        <span rate="还行" rscore="6" title="www.shaiblog.com 博客导航">&nbsp;</span>
        <span rate="推荐" rscore="8" title="www.shaiblog.com 博客导航">&nbsp;</span>
        <span rate="力荐" rscore="10" title="www.shaiblog.com 博客导航">&nbsp;</span>
        <div style="width:45px;" class="big_rate_up"></div>
     </div>
     <p><span id="q" class="q"></span></p>
     <div id="my_rate"></div>
  </div>
</div>

阅读全文…

分类: PHP 标签: , , , ,

PHP实现时间转换函数

2011年1月7日 admin 1 条评论

之前写过一篇 《将文字表述的时间 转化为相应的时间》 是将文字描述的时间转换为 相应时间, 现在是将时间转换为文字描述。

我在微博或其他一些论坛等发帖子后,会看到发表时间显示为“刚刚”、“1分钟前”、“昨天8:00”等,而不是显示具体日期和时间。

将介绍如何实现基于时间轴的时间的转换。
time():返回当前的 Unix 时间戳

date():格式化一个本地时间/日期。

应用举例:

date(“Y-m-d H:i:s”,time());

格式化当前时间,输出:2011-01-07 15:27:35

strtotime():将任何英文文本的日期时间描述解析为 Unix 时间戳。

应用举例:

echo strtotime(“+1 day”), “\n”;

输出1天前的时间戳:1294474872

date_default_timezone_set():设定要用的默认时区。

一般我们设置北京时间:date_default_timezone_set(“PRC”);

理解上面几个函数后我们来写时间轴函数:

该函数的原理就是将系统当前时间与目标时间比较,得到一个差值,再将差值与时间范围(转换成秒)比较,根据其处在时间轴的范围输出不同的结果(如:5分钟前)。为了便于计算,我们将时间都转换成Unix时间戳。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
function tranTime($time) { 
    $rtime = date("m-d H:i",$time); 
    $htime = date("H:i",$time); 
 
    $time = time() - $time; 
 
    if ($time < 60) { 
        $str = '刚刚'; 
    } 
    elseif ($time < 60 * 60) { 
        $min = floor($time/60); 
        $str = $min.'分钟前'; 
    } 
    elseif ($time < 60 * 60 * 24) { 
        $h = floor($time/(60*60)); 
        $str = $h.'小时前 '.$htime; 
    } 
    elseif ($time < 60 * 60 * 24 * 3) { 
        $d = floor($time/(60*60*24)); 
        if($d==1) 
           $str = '昨天 '.$rtime; 
        else 
           $str = '前天 '.$rtime; 
    } 
    else { 
        $str = $rtime; 
    } 
    return $str; 
}
分类: PHP 标签: ,

补全URL 函数

2010年12月21日 admin 2 条评论
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
   //修正链接补上之前的url
	function correctUrl($base, $url)
	{
		if(strpos($url, "http://") === 0) {
			return $this->trimUrl($url);
		}
		$urlInfo = parse_url($base);
 
		$absUrl = "http://".$urlInfo["host"];
		if($url{0} == "/") {
			$absUrl .= $url;
		} elseif($url{0} == "?") {
			$absUrl .= $urlInfo["path"].$url;
		} else {
			$pos = strrpos($urlInfo["path"], "/");
			if($pos === false) {
				$absUrl .= "/".$url;
			} else {
				$absUrl .= substr($urlInfo["path"], 0, $pos + 1).$url;
			}
		}
		$absUrl= $this->trimUrl($absUrl);
		return $absUrl;
	}
分类: PHP 标签:

HTTP协议通信过程分析

2010年12月21日 admin 4 条评论

HTTP协议通信过程

当我们在浏览器中输入“www.wenan8.com”然后回车,这之后发生了什么事,我们直接看到的是打开了对应的网页,那么内部客户端和服务端是如何通信的呢?

1、 1、URL自动解析

HTTP URL包含了用于查找某个资源的足够信息,基本格式如下:HTTP://host[“:”port] [abs_path],其中HTTP表示桶盖HTTP协议来定位网络资源;host表示合法的主机域名或IP地址,port指定一个端口号,缺省 80;abs_path指定请求资源的URI;如果URL中没有给出abs_path,那么当它作为请求URI时,必须以“/”的形式给出,通常这个工作浏览器自动帮我们完成。

例如:输入www.shaiblog.com;浏览器会自动转换成:HTTP://www.shaiblog.com/

2、获取IP,建立TCP连接

浏览器地址栏中输入”HTTP://www.shaiblog.com/”并提交之后,首先它会在DNS本地缓存表中查找,如果有则直接告诉IP地址。如果没有则要求网关DNS进行查找,如此下去,找到对应的IP后,则返回会给浏览器。

当获取IP之后,就开始与所请求的Tcp建立三次握手连接,连接建立后,就向服务器发出HTTP请求。

3、客户端浏览器向服务器发出HTTP请求

一旦建立了TCP连接,Web浏览器就会向Web服务器发送请求命令,接着以头信息的形式向Web服务器发送一些别的信息,之后浏览器发送了一空白行来通知服务器,它已经结束了该头信息的发送。

4、Web服务器应答,并向浏览器发送数据

客户机向服务器发出请求后,服务器会客户机回送应答,

HTTP/1.1 200 OK

应答的第一部分是协议的版本号和应答状态码,正如客户端会随同请求发送关于自身的信息一样,服务器也会随同应答向用户发送关于它自己的数据及被请求的文档。

Web服务器向浏览器发送头信息后,它会发送一个空白行来表示头信息的发送到此为结束,接着,它就以Content-Type应答头信息所描述的格式发送用户所请求的实际数据

5、Web服务器关闭TCP连接

一般情况下,一旦Web服务器向浏览器发送了请求数据,它就要关闭TCP连接,然后如果浏览器或者服务器在其头信息加入了这行代码

Connection:keep-alive

TCP连接在发送后将仍然保持打开状态,于是,浏览器可以继续通过相同的连接发送请求。保持连接节省了为每个请求建立新连接所需的时间,还节约了网络带宽。

file_get_contents获取搜狐博客乱码问题

2010年12月3日 admin 没有评论

file_get_contents — 将整个文件读入一个字符串
说明
string file_get_contents ( string filename [, bool use_include_path [, resource context [, int offset [, int maxlen]]]] )

一般遇到的乱码问题是gbk与utf-8 之间转换的问题,这个用 php 的 mb_convert_encoding 可以解决, 搜狐的抓出来却是乱码。 google了一下, 搜狐页面编码格式的问题。
看搜狐的header
Accept-Encoding: gzip,deflate

用一个函数 解压就可以了。 ^_^

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
function gzdecode($data) { 
  $len = strlen($data); 
  if ($len < 18 || strcmp(substr($data,0,2),"\x1f\x8b")) { 
    return null;  // Not GZIP format (See RFC 1952) 
  } 
  $method = ord(substr($data,2,1));  // Compression method 
  $flags  = ord(substr($data,3,1));  // Flags 
  if ($flags & 31 != $flags) { 
    // Reserved bits are set -- NOT ALLOWED by RFC 1952 
    return null; 
  } 
  // NOTE: $mtime may be negative (PHP integer limitations) 
  $mtime = unpack("V", substr($data,4,4)); 
  $mtime = $mtime[1]; 
  $xfl   = substr($data,8,1); 
  $os    = substr($data,8,1); 
  $headerlen = 10; 
  $extralen  = 0; 
  $extra     = ""; 
  if ($flags & 4) { 
    // 2-byte length prefixed EXTRA data in header 
    if ($len - $headerlen - 2 < 8) { 
      return false;    // Invalid format 
    } 
    $extralen = unpack("v",substr($data,8,2)); 
    $extralen = $extralen[1]; 
    if ($len - $headerlen - 2 - $extralen < 8) { 
      return false;    // Invalid format 
    } 
    $extra = substr($data,10,$extralen); 
    $headerlen += 2 + $extralen; 
  } 
 
  $filenamelen = 0; 
  $filename = ""; 
  if ($flags & 8) { 
    // C-style string file NAME data in header 
    if ($len - $headerlen - 1 < 8) { 
      return false;    // Invalid format 
    } 
    $filenamelen = strpos(substr($data,8+$extralen),chr(0)); 
    if ($filenamelen === false || $len - $headerlen - $filenamelen - 1 < 8) { 
      return false;    // Invalid format 
    } 
    $filename = substr($data,$headerlen,$filenamelen); 
    $headerlen += $filenamelen + 1; 
  } 
 
  $commentlen = 0; 
  $comment = ""; 
  if ($flags & 16) { 
    // C-style string COMMENT data in header 
    if ($len - $headerlen - 1 < 8) { 
      return false;    // Invalid format 
    } 
    $commentlen = strpos(substr($data,8+$extralen+$filenamelen),chr(0)); 
    if ($commentlen === false || $len - $headerlen - $commentlen - 1 < 8) { 
      return false;    // Invalid header format 
    } 
    $comment = substr($data,$headerlen,$commentlen); 
    $headerlen += $commentlen + 1; 
  } 
 
  $headercrc = ""; 
  if ($flags & 1) { 
    // 2-bytes (lowest order) of CRC32 on header present 
    if ($len - $headerlen - 2 < 8) { 
      return false;    // Invalid format 
    } 
    $calccrc = crc32(substr($data,0,$headerlen)) & 0xffff; 
    $headercrc = unpack("v", substr($data,$headerlen,2)); 
    $headercrc = $headercrc[1]; 
    if ($headercrc != $calccrc) { 
      return false;    // Bad header CRC 
    } 
    $headerlen += 2; 
  } 
 
  // GZIP FOOTER - These be negative due to PHP's limitations 
  $datacrc = unpack("V",substr($data,-8,4)); 
  $datacrc = $datacrc[1]; 
  $isize = unpack("V",substr($data,-4)); 
  $isize = $isize[1]; 
 
  // Perform the decompression: 
  $bodylen = $len-$headerlen-8; 
  if ($bodylen < 1) { 
    // This should never happen - IMPLEMENTATION BUG! 
    return null; 
  } 
  $body = substr($data,$headerlen,$bodylen); 
  $data = ""; 
  if ($bodylen > 0) { 
    switch ($method) { 
      case 8: 
        // Currently the only supported compression method: 
        $data = gzinflate($body); 
        break; 
      default: 
        // Unknown compression method 
        return false; 
    } 
  } else { 
    // I'm not sure if zero-byte body content is allowed. 
    // Allow it for now...  Do nothing... 
  } 
 
  // Verifiy decompressed size and CRC32: 
  // NOTE: This may fail with large data sizes depending on how 
  //       PHP's integer limitations affect strlen() since $isize 
  //       may be negative for large sizes. 
  if ($isize != strlen($data) || crc32($data) != $datacrc) { 
    // Bad format!  Length or CRC doesn't match! 
    return false; 
  } 
  return $data; 
}

我刚刚做出一个非常艰难的决定……

2010年11月4日 admin 没有评论

可口可乐做了个艰难的决定,如果监测到用户胃里有百事可乐,将自动释放农药和汞。
中石化做了个艰难的决定,如果监测到用户汽车油箱里有中石油,将自动释放电火花。
肯德基做了个艰难的决定,如果监测到用户吃过有麦当劳,将自动释放牛屎。
百度做了个艰难的决定,如果监测到用户浏览Google,将自动封禁百度ID。。。
联通做了个艰难的决定,如果方圆百米内检测到有移动用户 将使这些用户不间断自动拨打110
郭小四做了一个艰难的决定,如果发现读者的脑袋里有韩寒的文字,将自动转化为黄色小说。
优乐美决定做了一个艰难的绝对,如果检测到用户胃里有立顿奶茶,将自动释放硫酸
周大福做了个艰难的决定,如果监测到用户有周生生的饰物,身上的饰物将自动氧化。
nike做了个艰难的决定,如果监测到用户曾穿过adidas将自动释放狐臭
TG做了个艰难的决定 如果检测有14上米国网站将自动发射核蛋
中华做了个艰难的决定,如果发现烟民嘴里有苏烟的味道,会自动转换成屁味。
NOKIA 做出艰难决定 如果检测到家里有MOTO手机 NOKIA将自动引暴
曼联作出了个艰难的决定,如果检测到用户拥有车、枪或鸟,将释放三叉戟插爆其狗头
猫扑做了一个艰难的决定,如果发现用户收藏夹里有D8的内容,页面讲自动跳转到tianya.com.
杰士邦做了个艰难的决定,如果监测到用户有使用杜蕾斯,将自动释放艾滋病毒。
广电总局做了个艰难的决定,如果发现用户有不和谐物的,会自动转换成诗歌朗诵
电信做了个艰难的决定,如果监测到用户小区里有使用网通,将自动短路。
本拉登做了个艰难的决定,如果监测到D8有美分的行为,将会发射AK47
迅雷做了一个艰难的决定,如果检测到用户电脑曾安装过快车,将拒绝下载教育片
东热终于做出了艰难的决定:如果检测到用户电脑存有1本岛的唉威,电脑里所有片都将变成打码葫芦娃或新闻联播。
空空做出了一个艰难的决定,如果检测到你电脑里面有其他女优的影片,空空的作品将会打上马赛克
宏基做了个艰难的决定,如果检测到电脑用户有的是联想品牌的,将壁纸强制转化为凤姐私密照
奔驰做了一个艰难的决定,如果监测到用户开过宝马,奔驰刹车系统将自动失灵
卡巴斯基做了一个艰难的决定,如果监测到用户安装过其他杀毒软件,将自动由杀毒模式转换为编写病毒模式
苏宁做出了一个艰难的决定,要是其所在的商业街有国美的存在将派出城管大队将国美移为平地
梅西做了个艰难的决定,如果监测到FIFA/实况/FM等游戏里有C罗的影子,将自动把C罗纳尔多的数据改为C毛纳尔彪。
苹果公司作出了一个非常艰难的决定,如果监测到用户在使用Iphone前吃了苹果以外水果,将启动自毁模式
中国电网做出了一个非常艰难的决定,如果用户为了使用QQ而卸载360,那么将会自动断电一小时。
北大做出了一个艰难的决定,要是其所在的校园有清华学生的话在将自动录取凤姐入学
凤姐做出一个艰难的决定,如果大家继续关注小月月,那么将拍全丄裸写真集。一人一张强行安装你的电脑桌面
黄晓明做了个艰难的决定,如果监测到用户有使用内增,将自动把用户变鸟粪。
两面针做出了一个艰难的决定,要是检测到用户有使用中华牙膏的历史将自动释放口臭物质
苏菲做了个艰难的决定,如果监测到用户有使用安尔乐,将自动侧漏
毓婷做了个艰难的决定,如果监测到用户有使用妈富隆,将自动闭经
淘宝做了个艰难的决定,如果检测到用户电脑中有浏览拍拍的记录,所有交易将自动翻倍价格处理。
米奇林做了艰难的决定,如果检测到用户亲属、朋友、工作伙伴等一系列社交圈内有人始用普林斯通轮胎的话,将会自动提速欺实码,然后爆胎
伊利做出了一个艰难的决定,如果检测到用户胃里有蒙牛牛奶,将自动释放三聚氰铵
飘柔做出一个艰难的决定,如果发现用户头上用过海飞丝,将自动转化成脱发剂

分类: 网络资源 标签:

PHP导出Excel(二) 使用Spreadsheet_Excel_Writer

2010年11月4日 admin 没有评论

使用Pear 的 Spreadsheet_Excel_Writer 来导出Excel 下载地址
简单生成:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
<?php
//调用Writer.php
require_once 'Spreadsheet/Excel/Writer.php';
//创建Workbook
$workbook = new Spreadsheet_Excel_Writer();
//定义导出Excel文件名
$workbook->send('wenan8.xls');
//创建Worksheet
$worksheet =& $workbook->addWorksheet('My first worksheet');
//设置字体大小
$format_column = & $workbook->addformat(array('Size'=>9,'Bold'=>1));
//数据写入
//标题行(第一行)
$worksheet->write(0, 0, 'Name', $format_column);
$worksheet->write(0, 1, 'Age', $format_column);
//第一个人(第二行)
$worksheet->write(1, 0, 'John Smith');
$worksheet->write(1, 1, 30);
//第二个人(第三行)
$worksheet->write(2, 0, 'Johann Schmidt');
$worksheet->write(2, 1, 31);
//第三个人(第四行)
$worksheet->write(3, 0, 'Juan Herrera');
$worksheet->write(3, 1, 32);
//关闭Workbook
$workbook->close();
?>

需要导出多个Sheet的Excel ,带数据库的操作:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
function exportExcel($data,$filePath,$type)
	{
		$this->_data=$data;
		$workbook = new Spreadsheet_Excel_Writer($filePath); // 初始化类		
                $arr=$this->sheetData();
		foreach($arr AS $k=>$v)
		{
			$worksheet =& $workbook->addWorksheet($v['title']); 
			//写入数据字段的标题
			$i=0;
			foreach($columns AS $k2=>$v2)
			{
				$worksheet->writeString(0,$i,$v2);
				$i++;
			}
			$i=1;
			//print_r($this->_data[$v['type']]);
			foreach($this->_data[$v['type']] AS $k2=>$v2){
		    if($k2>=$v['start']-1 && $k2<$v['end']-1)
		    {
				$j=0;
				foreach($columns AS $k3=>$v3)
				{
					if(isNumber($v2[$k3]))  $worksheet->writeNumber($i,$j,$v2[$k3]);
					else $worksheet->writeString($i,$j,$v2[$k3]);
 
					$j++;
				}
				$i++;
		    }
			}
		}
		$workbook->close(); // 完成下载
		return $filePath;
	}
 //将数据按照sheet分类
function sheetData()
	{	$newData=array();
		$sheets=array();
		foreach($this->_data AS $k=>$v)
		{
			if(!array_key_exists($v['dType'],$newData)){
				$newData[$v['dType']]=array();
			}
			$newData[$v['dType']][]=$v;
		}
 
		$types=array_keys($newData);
		$types=implode('\',\'',$types);
		$types='\''.$types.'\'';
 
		$query="SELECT name,value FROM datatype WHERE value IN (".$types.") ORDER BY ordering";
 
		$res=$db->GetAll($query);
 
		foreach($res AS $v){
			$sheets[$v['value']]=$v['name'];
		}
		$this->_data=$newData;
		return $sheets;
	}

欢迎交流: QQ:276200108

PHP导出Excel(一)

2010年11月4日 admin 没有评论

PHP导出Excel方法很多,网上也有很多成熟的类,现在用最简单的方法导出一个Excel, 输出一个Table,然后用header 类型改为Excel就可以.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
<?php
includer_once("config.php");
$sql="select * from user";
$result=mysql_query($sql);
$data_array=mysql_fetch_array($result);
$keynames=array("orderTrade"=>"订单号","orderRecName"=>"收货人姓名","orderCount"=>"数量","orderPhone"=>"电话","orderRecMail"=>"Email","orderRecAddress"=>"地址","orderRecZip"=>"邮编","receiving"=>"收货时间");
function down_xls($data_array,$keynames,$filename) {
   //组合表头行,以制表符\t分隔,并转码为gb18030
   $title = implode("\t", array_values($keynames));
   $title = iconv("UTF-8","GB18030", $title);
 
   $result[] = $title;
  //组合表体行
   foreach ($data_array as $data){
    //按行组合数据体
      $a1 = array();
      foreach ($keynames as $k => $v){
         if ($k == "endtime"){
            $data[$k] = date("Y-m-d H:i", $data[$k]);
         }
         //utf8转码到gb18030,为了windows正常显示
         $a1[] = iconv("UTF-8","GB18030", preg_replace("/[\t]+/"," ",$data[$k]));
      }
      //以制表符分隔每列
      $result[] = implode("\t", $a1);
   }
 
  //为了windows下正常显示,以\r\n为换行符,分隔数据字符串
   $result = implode("\r\n", $result);
   header("Content-type: text/html; charset=GB18030");
   header("Content-Disposition: attachment; filename=\"".$filename.".xls\"");
   exit($result);
} 
down_xls($data_array,$keynames,"dataxls"); 
?>
分类: PHP 标签: , ,

弹窗不止,战斗升级

2010年11月4日 admin 没有评论

一大早上班起来开开电脑,习惯性的打开QQ, 呵,弹窗。


紧接着,360的弹窗也来了。

昨天下午 QQ 决定 在安装360360的客户端上停止运行腾讯的软件。 看来腾讯这次是真怒了,360出的扣扣保镖惹恼了马化腾呀, 不过据说马化腾这次没有动用南山法院,改在北京朝阳法院告的360呀,江湖2个大佬之间的恶战,苦了一帮小屁民呀。

哥继续淡定的观望着。

分类: 网络资源 标签: , , ,