php从mysql里读出来的数据默认什么类型?

php是弱类型语言,但是不代表没有类型,或者随便什么类型。

一个典型的例子就是从mysql数据库里读出来的数据,其类型会和数据库里定义的类型一致吗?

$DB_CONN = mysql_connect("localhost", "user", "password");
mysql_select_db("database", $DB_CONN) ;
$result = mysql_query("select * from mytable limit 1",$DB_CONN);
$row = mysql_fetch_assoc($result);
var_dump($row["id"]);// id长整型主键

结果输出什么?

string(9) “647333052”

是字符类型,这在php里面并不会有什么问题,对id进行任何数值运算,都会自动转成整形。但是有些情景下就不一定了。

最简单的例子是转换成json数据给其他语言的系统用,就要注意这点,比如返回json格式的翻页数据:总行数、总页数、当前页、每页行数,显而易见,总行数是用count(*)从数据库直接输出的,而其他几个数值都是通过数值运算计算得来。最后转换的json数据可能是这样:

"pagesize":50,"recordcount":"11","totalpages":1,"nowpage":1

看到细微的区别没有?

mysql的rand()函数

mysql随机数函数rand(),返回0-1之间的随机数

用法:

select rand();

返回10以内的随机数:

select rand()*10

返回10以内的整数

select floor(rand()*10)

返回8-10以内的随机数

select 8+rand()*2

返回N-M的随机整数

select floor(N+rand()*(M-N))

初始化一个浮点字段,要求值0-5

update table set field=rand()*5

 

 

 

百度联盟申请技巧

说技巧其实有点过了,只要网站内容符合百度联盟要求,有一定收录量,建站半年以上,基本都能申请通过,如果网站内容不符合要求呢?

这就难办了,还不能为了申请联盟,故意搞套新的内容和页面来,当然这也是办法,等联盟审批下来,再换成老站。

这里要分享的是另外一种办法,就是不停的提交申请,并且在备注里写上,第XXX次申请,不停的提交,今天终于让我提交通过了,是个电影站,百度联盟对电影站的申请一年前就停止了,我就不信这个邪,不停的申请,每次都注明是第XXX次,连续提交将近一年,终于还是通过了,就是死皮赖活的提交,审核的人也不会是同一个人,总有一个人会打马虎眼,另外一点要注意的是,网站类型,尽量不要选百度严查的那些类型,选一个靠边的又容易通过的比较好。

curl采集伪造ip

一直不屑与伪造ip,总认为这种小儿科的东西别人不会防的,没想到还是有不少大站,对ip设了连接限制。

伪造ip,首先要先制造ip,ipv6先不造了,就造ipv4吧,由4段组成,每段1-254,去掉255,省得造出来255.255.255.255,太难看了。

function makeip(){
	return rand(1,254).".".rand(1,254).".".rand(1,254).".".rand(1,254);
}

这是最简单的伪造方法,如果有地区要求,那要找一个ip段的库来,估计要固定前两段,甚至前三段,随机后面剩下来的段,懒得找各地区的ip段了,请自我完善

下面通过curl伪造一个http请求

function getcontent($url){
	$curl = curl_init();
	curl_setopt($curl, CURLOPT_URL, $url);
	curl_setopt($curl, CURLOPT_REFERER, "http://www.163.com/"); 
	curl_setopt($curl, CURLOPT_HEADER, 0);
	curl_setopt ($curl, CURLOPT_TIMEOUT, 10 );
	curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
	$ip = makeip();
	$headerArr = array(
	'CLIENT-IP:'.$ip,
	'X-FORWARDED-FOR:'.$ip
	);
	curl_setopt ($curl, CURLOPT_HTTPHEADER , $headerArr );
	$data = curl_exec($curl);
	curl_close($curl);
	return $data;
}

 

 

 

基于redis的缓存系统,防Dogpile效应

首先解释一下什么叫Dogpile效应,缓存顾名思义,只是暂缓存储,终归会失效的,问题就出在失效的那个时间点上,假设某应用,访问量为1000pv/s,某缓存直接读库需要5秒时间,那么在失效到完成读库重新缓存的这5秒时间里,瞬时产生了5000次读库请求,这是很苦B的,再假如,偏偏有多个缓存key在同一时间点失效,直接抓狂。

先定义cache类

<?php
class cache{
	private $redis = NULL;

	public function __construct(){
		// 应搞成单例类,这里偷懒一下,请自己完善
		$redis_host = '127.0.0.1';
		$redis_port = 6379;
		$redis = new Redis();
		$redis->connect($redis_host, $redis_port);
		$this->redis = $redis;
	}

	public function get($key){
		return $this->redis->get($key);
	}

	public function set($key,$value,$exp = 0){
		if($exp){
			return $this->redis->setex($key,$exp,$value);
		}else{
			return $this->redis->set($key,$value);
		}
	}

	// 这个方法是关键,加锁的关键方法,如果key有效,本方法会返回false
	public function setnx($key,$value,$exp = 0){
		$rs = $this->redis->setnx($key,$value);
		if($rs && $exp)
			$this->redis->expire($key,$exp);
		return $rs;
	}

	public function del($key){
		$this->redis->del($key);
	}
}

下面是应用实例

<?php
// 初始化cache实例
$cache = new cache();
// 获取一个key
$rs = $cache->get("testkey");
if($rs){
	// 匹配到,直接输出
	echo 'match:'.$rs;
}else{
	// 没匹配到,直接加锁,锁的有效时间根据具体应用确定
	$lock = $cache->setnx("lock.testkey",1,30);
	if($lock){
		// 这里只有失效后第一个访问才能进来,为了看到效果,休眠15秒,在这15秒内,其他访问都会到else里
		sleep(15);
		// 重新设置缓存
		$cache->set("testkey",2,60);
		// 删除锁
		$cache->del("lock.testkey");
		echo 'reset:2';
	}else{
		echo 'locked!';
		// 在缓存失效到重新缓存期间,这段时间的请求,就无法返回数据了,也不建议空等,最好直接返回相关错误提示,比如系统忙,稍后再试。
	}
}

 

攻克采集难度指数超高的网站

一般网站,只要伪造一个referer就可以欺骗过去了,也有的没那么简单,比如这个:pppc.25pp.com,要采集里面的app信息。

简单看了一下,数据是通过ajax请求然后展现出来的,直接用chrome调试一下,找到几个指向jsondata.25pp.com/index.html的post请求,最后一个就是要找的数据源了,post过去的参数也有些特别,是json格式,且没有key。

先简单试了一下:

$data = array("dcType" => 0,"resType" => 2,"listType" => 0,"catId" => 0,"perCount" => 12,"page" => 0);
	$ch = curl_init();
	curl_setopt($ch, CURLOPT_URL, http://jsondata.25pp.com/index.html);
	curl_setopt($ch, CURLOPT_REFERER, "http://jsondata.25pp.com/index.html?tunnel-command=4261421120"); 
	curl_setopt ($ch, CURLOPT_TIMEOUT, 30 );
	curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
	curl_setopt($ch, CURLOPT_POST, 1);
	curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "POST");
	curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($data));
	curl_setopt($ch, CURLOPT_USERAGENT,"Mozilla/5.0 (Windows NT 5.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/28.0.1500.95 Safari/537.36");
	$contents = curl_exec($ch);
	curl_close($ch);
	echo $contents;

结果没有输出,输出curl_error看了一下,报服务器无返回,按理说伪造了referer,伪造了useragent,post参数格式也正确,应当说是大部分网站都能欺骗过去,为什么这个站采不到?

chrome调试里看了一下http请求header,发现一个特别的参数,而且这个参数在referer页面上也用到了:Tunnel-Command:4261421088

于是加上这个:

curl_setopt($ch, CURLOPT_HTTPHEADER, array('Content-type: application/x-www-form-urlencoded','Tunnel-Command: 4261421088'));

结果还是不行,再看header头,发现有cookie,又没登陆,竟然还记录了cookie,直接拷贝cookie,再加上:

curl_setopt($ch, CURLOPT_COOKIE,"__utma=113739972.1555485891.1378775613.1378775613.1378775613.1; __utmc=113739972; __utmz=113739972.1378775613.1.1.utmcsr=(direct)|utmccn=(direct)|utmcmd=(none)");

这次出来了,不过个人觉得亮点还是在header里的这个参数Tunnel-Command,如果配合cookie里的一些值,加一些校验,防盗效果可能会更好。

HTC A6390获取root并删除默认应用

获取root权限,很多工具都可以,不过htc光获取root权限还不够,还要先解锁,这个功能就不是所有root工具都有了,google一款可以解锁htc的工具,注意先备份资料,然后再root

在卸载了可以卸载的应用后,还有一部分应用并不在应用列表中,要下载一个文件管理器,比如re管理器,到/system/app/目录下,手工删除不用的应用文件,不过这步比较危险,不光是不用的应用,一些有用的应用和系统应用也在里面,所以要小心,只删除不用的,比如人人什么的。具体哪些可删哪些不可删,可以google一下。

清理完成后,就有比较大的空间安装大应用了,安装一个,移动一个到存储卡,至少可以安装以下几个最新版的应用,而且空间足够:

qq、微信、微博、支付宝钱包