日志分类:Develop

PHP中的GD操作

2009年03月4日 1:23 下午  |  分类:Develop

这里只介绍非常非常初级的操作。
绘图时一般会经过4个过程:
1、准备好画布,并设定好宽、高以及填充色。
2、在画布上做绘图处理。
3、输出图片
4、清理资源。
在PHP中创建画布大体有二种方式:
1、直接创建一个指定宽高的画布,用imagecreate方法,只需指定宽与高即可。
2、以已有的图片为画图。基本上是在原有的图片上做二次处理。这里会涉及到多种图片格式了,方法名基本上以imagecreatefrom…开头。

创建一种颜色使用imagecolorallocate方法。
输出图片用imagepng/imagegif/imagejpg等方法生成不同格式的图片。
使用imagedestroy方法清理资源。
创建好画布后,就可以用imagestring方法书写文字了。
具体见下面的代码吧:

//要书写的文字
$str=isset($_GET['s']) ? $_GET['s'] : 'yibin001.com';
//画布宽
$imagewidth = 300;
//画布高
$imageheight = 30;
//创建画布
$img = imagecreate($imagewidth,$imageheight);

//为了避免$str过长而无法在画布上完全体现出来,故对字符串做了截取
//imagefontwidth方法用来获取指定大小字体的一个字符的宽度
$StrLength = strlen($str)*imagefontwidth(2);
//将总字符的宽度控制在290以内
while($StrLength>$imagewidth-10)
{
$str = substr($str, 0, strlen($str)-1);
$StrLength = strlen($str)*imagefontwidth(2);
}

//imagecolorallocate方法创建一种颜色,然后填充到画布
imagefill($img, 0,0,imagecolorallocate($img, 200, 0, 123));
$blue = imagecolorallocate($img, 0,0,255);
//计算文字在画布上起点的X与Y轴坐标,下面的算法使文本上下、左右居中
$x = ($imagewidth-(strlen($str)*imagefontwidth(2)))/2;
$y = ($imageheight-imagefontheight(2))/2;
//开始写文字了
imagestring($img,2, $x, $y, $str, $blue);
header('content-type:image/png');
//输出为png格式
imagepng($img);
//清理资源
imagedestroy($img);

在线地址:
http://www.yibin001.com/demo/gd/index.php

Open Flash Chart For PHP

2009年03月1日 3:46 下午  |  分类:Develop

OFC是一款功能强大的Flash图表控件,
网上有诸多关于它的介绍,其中官方还提供了Java/Perl/Php/.Net的相关类。
以前就想在asp.net环境下使用这款控件,但由于缺乏文档,官方的介绍比较少,一直没有真正去使用它提供的c#类库。
今天又重拾这款控件,不过是在php环境下。
可以在这里下载PHP类:
http://teethgrinder.co.uk/open-flash-chart/perl-python.php
官方上提供的数据源大多是已经格式化好的.txt文件,但在实际运用的环境中,基本上是从数据库中读取数据再展示。
展示部分基本上搞定了,但目前还不知道如何去添加onclick事件。
先看在线的demo
http://demo.yibin001.com/chart/chart.php
数据是随机生成的,

<?php
date_default_timezone_set('PRC');
require_once('ofc_library/open-flash-chart.php');
$tmpx = array();  //X轴数据
$i = 0;
for($i=0;$i<24;$i++)
{
$tmpx[] = "{$i}时";
}
$tmpy = array();  //Y轴数据
$bar2_arr = array();
$i = 1;
while($i<25)
{
$tmpy[] = rand(20,180);

$bar2_arr[]  = rand(25,120);
$i++;
}

$title = new title( date('r') );
$title->set_style("font-size:12px;");

$bar = new bar_glass();
$bar->text= '访问量';
$bar->set_values( $tmpy );
$bar->set_tooltip('访问量:<br>#val#');
$bar->set_alpha('0.3');

$bar2 = new bar_glass();
$bar2->text='IP';
$bar2->set_values($bar2_arr);
$bar2->set_colour('#FF0000');
$bar2->set_tooltip('IP<br>#val#');
$y = new y_axis();
$y->set_range(0,ceil(max($tmpy)),20);

$x = new x_axis();
$x->set_labels_from_array( $tmpx );

$yl =  new y_legend();
$yl->y_legend( "www.yibin001.com" );
$yl->set_style( "color:#000; font-size:11px;" );

$chart = new open_flash_chart();
$chart->set_title( $title );

$chart->set_y_axis( $y );
$chart->set_x_axis( $x );
$chart->set_y_legend($yl);

$chart->add_element($bar);
$chart->add_element($bar2);
echo $chart->toPrettyString();
?>

哪位达人告诉我如何添加事件-,-
ps. google pagerank今天好像更新了,yibin001.com从3到了4,自把lemongtree.com做了301跳转后,lemongtree.com成0了。

PHP中的日期函数

2009年02月28日 11:07 上午  |  分类:Develop

PHP中的日期时间基本上基于UNIX时间戳来处理的。
比如date/getdate()/mktime()/strftime()/strtotime/time等都与时间戳有着密切的关联。
这些函数的用法可查阅相关文档,这里就不对这些函数作解释了。
要将时间戳转为可读的形式,就需要date函数出马了,他需要二个参数:格式化字符串与时间戳。
比较难记的是格式化字符,不过常用的也就是YymdwHis,其它的亦可参阅文档。

将可读的日期转为时间戳通常用以下二个函数:
mktime
如:
$timestam = mktime(18,30,00,8,10,1981);
将得到1981年8月10日下午6点30整的时间戳。
另一个比较NB的是strtotime,看名字就是将字符串转为一个时间戳。
它的NB之处不在于解析如:Tue,15 Mar 2005 15:23:52或2008-01-01此类的字符串,strtotime还可以“理解”一定的英语。
如下面的代码:

<?php
date_default_timezone_set("PRC");
$mydatestring = array('now','today','tomorrow','yesterday','thursday','this thursday','last thursday','+2 hours','-1 month','30 seconds','next week','last year','2 weeks ago');
foreach($mydatestring as $item)
{
echo "$item:".date('r',strtotime($item)).'<br />';
}
?>

输出:

now:Sat, 28 Feb 2009 11:03:35 +0800
today:Sat, 28 Feb 2009 00:00:00 +0800
tomorrow:Sun, 01 Mar 2009 00:00:00 +0800
yesterday:Fri, 27 Feb 2009 00:00:00 +0800
thursday:Thu, 05 Mar 2009 00:00:00 +0800
this thursday:Thu, 05 Mar 2009 00:00:00 +0800
last thursday:Thu, 26 Feb 2009 00:00:00 +0800
+2 hours:Sat, 28 Feb 2009 13:03:35 +0800
-1 month:Wed, 28 Jan 2009 11:03:35 +0800
30 seconds:Sat, 28 Feb 2009 11:04:05 +0800
next week:Sat, 07 Mar 2009 11:03:35 +0800
last year:Thu, 28 Feb 2008 11:03:35 +0800
2 weeks ago:Sat, 14 Feb 2009 11:03:35 +0800

再如我要查找下个月的第一个星期五:

$nextmonth = date('Y-'.(date('n')+1).'-0');
$nextmonth_timest = strtotime($nextmonth);
$first_fri = strtotime('Fri',$nextmonth_timest);
echo "Today:".date('Y-m-d');
echo '<br />';
echo 'the first Fri of next month is :'.date('Y-m-d',$first_fri);

输出:
Today:2009-02-28
the first Fri of next month is :2009-03-06

还有太多太多,以后有时间再写。

Discuz Ucenter短消息设计

2009年02月25日 10:00 下午  |  分类:Develop

UCenter中关于短消息这一块的数据表结构如下:

不大理解这里的delstatus/related二个字段的作用。
delstatus语义上应该是标识该消息的删除状态
related语义为关联,
现在试着以admin给yibin001发一件消息

所执行的SQL语句

SELECT count(*) FROM `ucenter`.uc_pms WHERE msgfromid='1' AND msgtoid='2' AND folder='inbox' AND related='0'
INSERT INTO `ucenter`.uc_pms (msgfrom,msgfromid,msgtoid,folder,new,subject,dateline,related,message,fromappid) VALUES ('admin','1','2','inbox','1','测试消息','1235570029','0','测试消息','1')
SELECT count(*) FROM `ucenter`.uc_pms WHERE msgfromid='2' AND msgtoid='1' AND folder='inbox' AND related='0'
INSERT INTO `ucenter`.uc_pms (msgfrom,msgfromid,msgtoid,folder,new,subject,dateline,related,message,fromappid) VALUES ('admin','2','1','inbox','0','测试消息','1235570029','0','测试消息','0')
INSERT INTO `ucenter`.uc_pms (msgfrom,msgfromid,msgtoid,folder,new,subject,dateline,related,message,fromappid) VALUES ('admin','1','2','inbox','1','测试消息','1235570029','1','测试消息','1')
REPLACE INTO `ucenter`.uc_newpm (uid) VALUES ('2')

以yibin001登录并回复短消息


sql语句

SELECT count(*) FROM `ucenter`.uc_pms WHERE msgfromid='2' AND msgtoid='1' AND folder='inbox' AND related='0'
UPDATE `ucenter`.uc_pms SET subject='回复', message='回复', dateline='1235570298', new='1', fromappid='1' WHERE msgfromid='2' AND msgtoid='1' AND folder='inbox' AND related='0'
SELECT count(*) FROM `ucenter`.uc_pms WHERE msgfromid='1' AND msgtoid='2' AND folder='inbox' AND related='0'
INSERT INTO `ucenter`.uc_pms (msgfrom,msgfromid,msgtoid,folder,new,subject,dateline,related,message,fromappid) VALUES ('yibin001','2','1','inbox','1','回复','1235570298','1','回复','1')
REPLACE INTO `ucenter`.uc_newpm (uid) VALUES ('1')

光看这部分有点晕,没看出delstatus/related二个字段的作用。