2013年5月

新手学WEB开发杂记(八)——JS设置Cookie时中文编码问题

    最近写的一个页面中我使用了js来设置登录后的用户名cookie,但是PHP获取该cookie时,发现其值中的中文字符被编码成了\u开头的unicode编码,该编码在PHP中可以使用如下语句转换成utf8编码:
[js]preg_replace("#\\\u([0-9a-f]{4})#ie", "iconv('UCS-2BE', 'UTF-8', pack('H4', '\\1'))", $unicode_string);[/js]
   
   我在同一个domain的另一个页面中登录时是采用php设置cookie的,php设置的cookie中的中文是utf8编码的。在PHP获取cookie时使用上面的语句处理一下就可以解决不同页面设置的cookie在另外的页面工作不正常的问题。
 
   还有另外一个办法可以解决该问题,也很简单,即JS端使用encodeURI() 函数可把字符串作为 URI 进行编码,PHP端使用urldecode函数进行解码。
 

PHP按最大宽高等比例缩放图片类

   本来用phpthumb来缩略图片是十分方便的,但是最近在sae上写项目发现phpthumb在sae上保存文件时会出问题,想来实现一个简单的按最大宽高等比例缩放图片类也并不困难,于是便自己写了一个方便修改。
   需GD库支持,可支持jpg、jpeg、png、gif格式的图片,代码短小适合新手学习用。
 
[php] class slpic {
//原图片文件,包含路径和文件名
var $orpic;
//原图的临时图像
var $tempic;
//缩略图
var $thpic;
//原宽度
var $width;
//原高度
var $height;
//图片类型
var $type;
//缩略后的宽度
var $thwidth;
//缩略后的高度
var $thheight;

function __construct($file){
$this->orpic = $file;
$infos = getimagesize($file);
$this->width = $infos[0];
$this->height = $infos[1];
$this->type = $infos[2];
}

//根据用户所指定最大宽高来计算缩略图尺寸
function cal_size($maxwidth, $maxheight){
//缩略图最大宽度与最大高度比
$thcrown = $maxwidth/$maxheight;
//原图宽高比
$crown = $this->width/$this->height;
if($crown/$thcrown >= 1){
$this->thwidth = $maxwidth;
$this->thheight = $maxwidth/$crown;
} else {
$this->thheight = $maxheight;
$this->thwidth = $maxheight*$crown;
}
}

function init(){
switch($this->type){
case 1: //GIF
$this->tempic = imagecreatefromgif($this->orpic);
break;
case 2: //JPG
$this->tempic = imagecreatefromjpeg($this->orpic);
break;
case 3: //PNG
$this->tempic = imagecreatefrompng($this->orpic);
break;
default:
echo '暂不支持该图片格式';
}
}

function resize($maxwidth, $maxheight){
//初始化图像
$this->init();
//计算出缩略图尺寸
$this->cal_size($maxwidth, $maxheight);

$this->thpic = imagecreatetruecolor($this->thwidth, $this->thheight);
imagecopyresampled($this->thpic, $this->tempic, 0, 0, 0 ,0, $this->thwidth, $this->thheight, $this->width, $this->height);
}

function save($filename, $type){
switch($type){
case 'jpg':
case 'jpeg':
imagejpeg($this->thpic, $filename);
break;
case 'png':
imagepng($$this->thpic, $filename);
break;
case 'gif':
imagegif($$this->thpic, $filename);
break;
default:
echo '暂不支持您所选择的格式';
}
}
}
?>[/php]

PHP分页函数代码分享

  分页是经常会用到的一个模块,网上的分页函数和分页类的代码都相当多。为了能让分页函数的代码通用性更强,我自改了一个分页函数分享给大家。
   本代码中不包含样式,如果需要对应的CSS样式的话,可以参考 http://www.oschina.net/code/snippet_4873_3810
 
[php]
//$count为总条目数,$page为当前页码,$page_size为每页显示条目数
function show_page($count,$page,$page_size)
{
$page_count = ceil($count/$page_size); //计算得出总页数

$init=1;
$page_len=7;
$max_p=$page_count;
$pages=$page_count;

//判断当前页码
$page=(empty($page)||$page<0)?1:$page;
//获取当前页url
$url = $_SERVER['REQUEST_URI'];
//去掉url中原先的page参数以便加入新的page参数
$parsedurl=parse_url($url);
$url_query = isset($parsedurl['query']) ? $parsedurl['query']:'';
if($url_query != ''){
$url_query = preg_replace("/(^|&)page=$page/",'',$url_query);
$url = str_replace($parsedurl['query'],$url_query,$url);
if($url_query != ''){
$url .= '&';
}
} else {
$url .= '?';
}

//分页功能代码
$page_len = ($page_len%2)?$page_len:$page_len+1; //页码个数
$pageoffset = ($page_len-1)/2; //页码个数左右偏移量

$navs='';
if($pages != 0){
if($page!=1){
$navs.="首页 "; //第一页
$navs.="上页"; //上一页
} else {
$navs .= "首页";
$navs .= "上页";
}
if($pages>$page_len)
{
//如果当前页小于等于左偏移
if($page<=$pageoffset){
$init=1;
$max_p = $page_len;
}
else //如果当前页大于左偏移
{
//如果当前页码右偏移超出最大分页数
if($page+$pageoffset>=$pages+1){
$init = $pages-$page_len+1;
}
else
{
//左右偏移都存在时的计算
$init = $page-$pageoffset;
$max_p = $page+$pageoffset;
}
}
}
for($i=$init;$i<=$max_p;$i++)
{
if($i==$page){$navs.="".$i.'';}
else {$navs.=" ".$i."";}
}
if($page!=$pages)
{
$navs.=" 下页 ";//下一页
$navs.="末页"; //最后一页
} else {
$navs .= "下页";
$navs .= "末页";
}
echo "$navs";
}
} [/php]

抓取百度贴吧指定相册图片到本地的代码

   前一段时间看见有网友分享的php抓取百度贴吧图片的代码http://www.oschina.net/code/snippet_1023084_19836,这段代码对我现在在写的一个页面帮助很大。
   不过这段代码中是用正则匹配出json数据中的图片id的,感觉效率不如直接解析json数据来的高,于是自己修改了一下,分享给大家。
[php] @set_time_limit(10);
//贴吧名称
$tbname = "mugen";
//相册ID
$tid = "2134897418";
//图册页url模版
$galleryurltpl = "http://tieba.baidu.com/photo/bw/picture/guide?kw=%s&tid=%s";
//本地的目录
$savepath = "R:/images/";
//帖子子文件夹
$filedir = $savepath.$tid;
//图片文件
$filenametpl = $filedir."/%s.jpg";
//图册页url
$galleryurl = sprintf($galleryurltpl, $tbname, $tid);

//返回的json数据
$retjson = file_get_contents($galleryurl);
$retarray = json_decode($retjson, true);
//图片列表
$piclist = $retarray['data']['pic_list'];

//目录是否存在
if(!is_dir($filedir))
mkdir($filedir);
foreach($piclist as $pic){
$pic_id = $pic['img']['original']['id'];
$url = "http://imgsrc.baidu.com/forum/pic/item/".$pic_id.".jpg";
$filename = sprintf($filenametpl, $pic_id);
//下载图片
$imagebin = file_get_contents($url);
//保存图片
file_put_contents($filename,$imagebin);
}
?>[/php]

PHP按最大宽高缩略图片函数代码分享

很简单的按照最大宽高来缩略图片的代码,方便新手和懒得自己写的人。
[php]function thumb($imagefile, $maxwidth, $maxheight) {
$dim = getimagesize($imagefile);
$width = $dim[0]; //原图宽度
$height = $dim[1]; //原图高度
$original = imagecreatefromjpeg($imagefile);

$thcrown = $maxwidth/$maxheight; //缩略图最大宽度与最大高度比
$crown = $width/$height; //原图宽高比
if($crown/$thcrown >= 1){
$thumbWidth = $maxwidth;
$thumbHeight = $maxwidth/$crown;
} else {
$thumbHeight = $maxheight;
$thumbWidth = $maxheight*$crown;
}

$thumb = imagecreatetruecolor($thumbWidth, $thumbHeight);
imagecopyresampled($thumb, $original, 0, 0, 0, 0, $thumbWidth, $thumbHeight, $width, $height);
return $thumb;
}[/php]