php积累的一些技巧
1321041613
8546
最近刚刚完成手中的项目,比较闲。来这儿转转,把积累的一些技巧分享给大家!
1、关于PHP重定向
方法一:header("Location: index.php");
方法二:echo "<script>window.location =\"$PHP_SELF\";</script>";
方法三:echo "<META HTTP-EQUIV=\"Refresh\" CONTENT=\"0; URL=index.php\">";
2、获取访问者浏览器
function browse_infor()
{
$browser="";$browserver="";
$Browsers =array("Lynx","MOSAIC","AOL","Opera","JAVA","MacWeb","WebExplorer","OmniWeb");
$Agent = $GLOBALS["HTTP_USER_AGENT"];
for ($i=0; $i<=7; $i++)
{
if (strpos($Agent,$Browsers[$i]))
{
$browser = $Browsers[$i];
$browserver ="";
}
}
if (ereg("Mozilla",$Agent) && !ereg("MSIE",$Agent))
{
$temp =explode("(", $Agent); $Part=$temp[0];
$temp =explode("/", $Part); $browserver=$temp[1];
$temp =explode(" ",$browserver); $browserver=$temp[0];
$browserver =preg_replace("/([\d\.]+)/","\\1",$browserver);
$browserver = " $browserver";
$browser = "Netscape Navigator";
}
if (ereg("Mozilla",$Agent) && ereg("Opera",$Agent))
{
$temp =explode("(", $Agent); $Part=$temp[1];
$temp =explode(")", $Part); $browserver=$temp[1];
$temp =explode(" ",$browserver);$browserver=$temp[2];
$browserver =preg_replace("/([\d\.]+)/","\\1",$browserver);
$browserver = " $browserver";
$browser = "Opera";
}
if (ereg("Mozilla",$Agent) && ereg("MSIE",$Agent))
{
$temp = explode("(", $Agent); $Part=$temp[1];
$temp = explode(";",$Part); $Part=$temp[1];
$temp = explode(" ",$Part);$browserver=$temp[2];
$browserver =preg_replace("/([\d\.]+)/","\\1",$browserver);
$browserver = " $browserver";
$browser = "Internet Explorer";
}
if ($browser!="")
{
$browseinfo = "$browser$browserver";
}
else
{
$browseinfo = "Unknown";
}
return $browseinfo;
}
//调用方法$browser=browseinfo() ;直接返回结果
3、获取访问者操作系统
function osinfo() {
$os="";
$Agent = $GLOBALS["HTTP_USER_AGENT"];
if (eregi('win',$Agent) && strpos($Agent, '95')) {
$os="Windows 95";
}
elseif (eregi('win 9x',$Agent) && strpos($Agent, '4.90')) {
$os="Windows ME";
}
elseif (eregi('win',$Agent) && ereg('98',$Agent)) {
$os="Windows 98";
}
elseif (eregi('win',$Agent) && eregi('nt 5\.0',$Agent)) {
$os="Windows 2000";
}
elseif (eregi('win',$Agent) && eregi('nt',$Agent)) {
$os="Windows NT";
}
elseif (eregi('win',$Agent) && eregi('nt 5\.1',$Agent)) {
$os="Windows XP";
}
elseif (eregi('win',$Agent) && ereg('32',$Agent)) {
$os="Windows 32";
}
elseif (eregi('linux',$Agent)) {
$os="Linux";
}
elseif (eregi('unix',$Agent)) {
$os="Unix";
}
elseif (eregi('sun',$Agent) && eregi('os',$Agent)) {
$os="SunOS";
}
elseif (eregi('ibm',$Agent) && eregi('os',$Agent)) {
$os="IBM OS/2";
}
elseif (eregi('Mac',$Agent) && eregi('PC',$Agent)) {
$os="Macintosh";
}
elseif (eregi('PowerPC',$Agent)) {
$os="PowerPC";
}
elseif (eregi('AIX',$Agent)) {
$os="AIX";
}
elseif (eregi('HPUX',$Agent)) {
$os="HPUX";
}
elseif (eregi('NetBSD',$Agent)) {
$os="NetBSD";
}
elseif (eregi('BSD',$Agent)) {
$os="BSD";
}
elseif (ereg('OSF1',$Agent)) {
$os="OSF1";
}
elseif (ereg('IRIX',$Agent)) {
$os="IRIX";
}
elseif (eregi('FreeBSD',$Agent)) {
$os="FreeBSD";
}
if ($os=='') $os = "Unknown";
return $os;
}
//调用方法$os=os_infor() ;
4、文件格式类
$mime_types = array(
'gif' => 'image/gif',
'jpg' => 'image/jpeg',
'jpeg' => 'image/jpeg',
'jpe' => 'image/jpeg',
'bmp' => 'image/bmp',
'png' => 'image/png',
'tif' => 'image/tiff',
'tiff' => 'image/tiff',
'pict' => 'image/x-pict',
'pic' => 'image/x-pict',
'pct' => 'image/x-pict',
'tif' => 'image/tiff',
'tiff' => 'image/tiff',
'psd' => 'image/x-photoshop',
'swf' => 'application/x-shockwave-flash',
'js' => 'application/x-javascript',
'pdf' => 'application/pdf',
'ps' => 'application/postscript',
'eps' => 'application/postscript',
'ai' => 'application/postscript',
'wmf' => 'application/x-msmetafile',
'css' => 'text/css',
'htm' => 'text/html',
'html' => 'text/html',
'txt' => 'text/plain',
'xml' => 'text/xml',
'wml' => 'text/wml',
'wbmp' => 'image/vnd.wap.wbmp',
'mid' => 'audio/midi',
'wav' => 'audio/wav',
'mp3' => 'audio/mpeg',
'mp2' => 'audio/mpeg',
'avi' => 'video/x-msvideo',
'mpeg' => 'video/mpeg',
'mpg' => 'video/mpeg',
'qt' => 'video/quicktime',
'mov' => 'video/quicktime',
'lha' => 'application/x-lha',
'lzh' => 'application/x-lha',
'z' => 'application/x-compress',
'gtar' => 'application/x-gtar',
'gz' => 'application/x-gzip',
'gzip' => 'application/x-gzip',
'tgz' => 'application/x-gzip',
'tar' => 'application/x-tar',
'bz2' => 'application/bzip2',
'zip' => 'application/zip',
'arj' => 'application/x-arj',
'rar' => 'application/x-rar-compressed',
'hqx' => 'application/mac-binhex40',
'sit' => 'application/x-stuffit',
'bin' => 'application/x-macbinary',
'uu' => 'text/x-uuencode',
'uue' => 'text/x-uuencode',
'latex'=> 'application/x-latex',
'ltx' => 'application/x-latex',
'tcl' => 'application/x-tcl',
'pgp' => 'application/pgp',
'asc' => 'application/pgp',
'exe' => 'application/x-msdownload',
'doc' => 'application/msword',
'rtf' => 'application/rtf',
'xls' => 'application/vnd.ms-excel',
'ppt' => 'application/vnd.ms-powerpoint',
'mdb' => 'application/x-msaccess',
'wri' => 'application/x-mswrite',
);
5、php生成excel文档
<?
header("Content-type:application/vnd.ms-excel");
header("Content-Disposition:filename=test.xls");
echo "test1\t";
echo "test2\t\n";
echo "test1\t";
echo "test2\t\n";
echo "test1\t";
echo "test2\t\n";
echo "test1\t";
echo "test2\t\n";
echo "test1\t";
echo "test2\t\n";
echo "test1\t";
echo "test2\t\n";
?>
//改动相应文件头就可以输出.doc .xls等文件格式了
6、时间比较问题
举一个简单例子说明:比如一个论坛对当天发表的贴子用new图片标记一下。
方法一:
//$db->rows[$i][date]中为数据库中datetime字段值.
$today=time();
$theDay=date("Y-m-d H:i:s",$today-24*3600);
$newTag=$db->rows[$i][date]>=$theDay?"<img src='../image/newinfor.gif'>":"";
方法二:
$newTag=$db->rows[$i][date]>=date("Y-m-d 00:00:00")?"<img src='../image/newinfor.gif'>":"";
7、PHP中对数据库操作的封装
我的例子.........见上面附件!
再增加一个正规表达式例子(自动转化www,ftp,mail开头的链接)
<?
function enable_url($str)
{
$str = ereg_replace("(www.[a-zA-Z0-9@:%_.~#-\?&]+)", " <a href=\"linkHttp://\\1\" target=\"_blank\">\\1</a>", $str); // 自动转化www开头的链接
$str = ereg_replace("(((f|ht){1}tp://)[a-zA-Z0-9@:%_.~#-\?&]+)", "<a href=\"\\1\" target=\"_blank\">\\1</a>", $str); //转化http://开头和ftp://开头的链接
$str = str_replace('linkHttp://','http://',$str);
$str = ereg_replace("([_\.0-9a-z-]+@([0-9a-z][0-9a-z-]+\.)+[a-z]{2,3})","<a href=\"mailto:\\1\">\\1</a>", $str); // 转化邮件地址
return $str;
}
//for example
echo enable_url("www.snowai.com");
?>
__________________
QQ不经常用,有问题的朋友可以Email联系我[email protected]
取得文件扩展名方法
<?//方法一:
function extend($file_name)
{
$retval="";
$pt=strrpos($file_name, ".");
if ($pt) $retval=substr($file_name, $pt+1, strlen($file_name) - $pt);
return ($retval);
}
//方法二(php4.03及更高版本)
$extend = pathinfo($file_name);
$extend = strtolower($extend["extension"]);
echo $extend;
?>
Re: 再增加一个正规表达式例子(自动转化www,ftp,mail开头的链接)
quote:
--------------------------------------------------------------------------------
最初由 snowai 发布
<?
function enable_url($str)
{
$str = ereg_replace("(www.[a-zA-Z0-9@:%_.~#-\?&]+)", " <a href=\"linkHttp://\\1\" target=\"_blank\">\\1</a>", $str); // 自动转化www开头的链接
$s...以下省略
--------------------------------------------------------------------------------
能否给个用户名的转化,条件是用户在输入用户名时只能输入中文
PHP中实现大图自动缩成小图(及GD库的安装)(作者:UB)
PHP中实现大图自动缩成小图(及GD库的安装)
UB 2001.10.11
我觉得网络编程与普通编程最大的区别就是,网络编程除了具备普通编程的特性外,还要花很大精力考虑速度的问题。
网站上需要很多图片,现在有很多给用户存放照片,图片的“像册”程序,可以让用户自己上传图片,然后自动缩成小图,可以让你在一个页面看到很多小图,然后点击小图看大图。
注意:在网页中指定长宽显示图片,只能让图片以小尺寸显示,但是大小(容量)不变(可以看看属性),速度自然很慢。真正的缩图是把大图的大小(容量)变小,就是重新生成一个小尺寸的图片文件。我的一个程序有此功能,正在测试:www1.yn.cninfo.net/love
另外,装上GD库,还有很多功能,可以用程序画图,做些特别的计数器之类,还可以支持FREETYPE字体等等,里面函数很多,功能很强大。
先简单说说GIF,JPG,PNG,BMP图的区别:他们都是图形压缩格式。GIF格式单图最多能显示256种颜色,可以保存多图,适合做小动画,容量较大。 JPEG格式,支持24位(16 百万)种颜色,适合于静态图,容量较小。PNG格式,包含GIF,JPEG的所有特点,支持48位颜色,但是容量较大,而且应用不广泛。 BMP格式,颜色少,非常老的压缩格式,对于网络来说太大了。
在PHP中实现大图自动缩成小图其实很简单,装上GD库,用一个小函数就可以了,但是安装GD库很麻烦。在1.6.2 版以前的 GD library 有支持 GIF 格式的功能,但因为 GIF 格式使用的 LZW 演算法牵涉到 Unisys 的专利权,因此在 GD library 1.6.2 版之后不支持 GIF 的格式。
PHP 在 3.0.13 版之后,终于支持了 PNG 的图型格式,使用 PNG 就不怕会有版权的问题了,而且在 PHP 这个版本以后,安装编译时会检查 GD library 支持的是旧的 GIF 格式还是新的 PNG 格式来决定是否使用 GIF 或 PNG 的专用函数。
一,安装GD库:
1。环境:windows2000server+PHP4.0.4+GD+IIS
在WINDOWS中安装很容易,PHP4.0以上版本中自带,装好后在php4/extensions 目录中自带动态链接库:php_gd.dll 。只要在php.ini 中把 ;extension=php_gd.dll 前面的;去掉,然后重起WEBSERVER(IIS或APACHE),就行了。运行一个带有<? phpinfo();?>的PHP程序,里面有以下内容就说明可以用了:
gd
GD Support enabled
GD Version 1.6.2 or higher
FreeType Support enabled
FreeType Linkage with TTF library
JPG Support enabled
PNG Support enabled
WBMP Support enabled
另外,网上有个php_gd_gif.dll 可以下载,把它改名为php_gd.dll覆盖掉原文件,重起IIS,就可以实现带GIF库的GD库。
到 http://php.weblogs.com/php_gd 下载 php_gd_404.zip,解压完成上面操作。
这是for PHP4.0.4的,其他版本的PHP不能用,(老板本的PHP4.0.0可以去下载php_gd_gif.zip)。
呵呵,搞定后你的phpinfo()就会多显示一个GIF Support enabled ,但是涉及到版权问题,自己看着办吧。
在LINUX装GD库就比较麻烦了,先简单说说关于APACHE和PHP的安装:当我们在Apache环境下安装PHP的时候,你有三种安装模式可供选择:静态模块、动态模块(DSO)和CGI。
常用的是静态模块,就是APACHE和PHP在一起编译,这样PHP的执行效率高一些,但是PHP要升级或要装GD库之类的附加库时就要把两个都重新编译,很麻烦。动态模块就好办多了,单独重新
编译PHP就行了,具体安装查看PHP中的INSTALL文件。我费了半天劲安装成功了,介绍一点静态模块加GD库+JPEG+PNG的心得:
2. 环境: LINUX6.1+PHP4.0.6+GD1.8.4+jpeg+png+zlib+APACHE_1.3.20+MYSQL
1)下载所需的库:
下载GD库:建议使用Version 1.8.4 (Stable)稳定版,我编译gd-2.0.1(BETA)时,没通过。
http://www.boutell.com/gd/
下载zlib:
http://www.info-zip.org/pub/infozip/zlib/
下载libpng:建议使用libpng-1.0.6-1-src.tar.gz
http://www.turbolinux.com.cn/pub/mirrors/sourceware/cygwin/contrib/libpng/
下载jpegsrc.v6b.tar.gz:
http://www.turbolinux.com.cn/pub/mirrors/gnu/ghostscript/
以下步骤需要按顺序执行:
2)我用的是LINUX6.1,内核是2.2.12。以ROOT进入,解压所有包,tar -zxvf filename 。然后编译:
3)如果你的LINUX没有安装zlib,必须先安装zilb,进入zlib-1.1.3 执行:
./configure
make
make install
4)进入libpng-1.0.6,可以在LINUX,或DOS下安装,LINUX下需要拷贝他的makefile文件, 执行:
cp scripts/makefile.linux makefile
make
make install
5)进入jpeg-6b 执行:
./configure
make
make install
6a)进入gd-1.8.4
修改Makefile
检查GD库编译时是否加入加入JPEG支持,得修改Makefile文件。
修改Makefile文件,使得:
CFLAGS=-O -DHAVE_LIBPNG -DHAVE_LIBJPEG
LIBS=-lgd -lpng -lz -lm -ljpeg
或者,如果你FREETYPE,XPM,TTF等库都安装了,(安装方法大同小异,自己去找库吧),就改下面:
#CFLAGS=-O -DHAVE_LIBXPM -DHAVE_LIBPNG -DHAVE_LIBJPEG
#-DHAVE_LIBFREETYPE -DHAVE_LIBTTF
#LIBS=-lgd -lpng -lz -ljpeg -lfreetype -lm -lttf
去掉#
此后,编译并安装:
make
make install
(如果需要MYSQL,而你没装,就先装MYSQL,解压,执行: ./configure ; make ; make install
./configure --prefix=/home/mysql ,默认安装路径/usr/local/share/mysql 。)
7)重新编译PHP,我用的是PHP-4.0.6,最好先看看安装文件,more INSTALL,然后执行:
7.1)解压进入apache_1.3.20,需要先考些文件,执行:
./configure --prefix=/home/apache
--activate-module=src/modules/php4/libphp4.a
7.2)解压进入php-4.0.6,编译安装:
./configure --with-mysql --with-apache=../apache_1.3.20
--with-gd=../gd-1.8.4 --with-jpeg-dir=../jpeg-6b --with-png-dir=../libpng-1.0.6
--with-zlib --enable-track-var
(默认安装路径:/usr/local/lib/php)
8)如果你的PHP是和APACHE一起编译的,静态模块,就要重新编译APACHE,我用的是apache_1.3.20
先停掉APACHE:./home/apache/bin/apachectl stop
进入apache_1.3.20,需要改文件src/Configuration:
加入: AddModule modules/php4/libphp4.a
[ 这是APACHE_1.3.x的安装,如果你用的是APACHE_1.2.x,就加入Module php4_module mod_php4.o
然后拷贝libphp4.module到src,修改相应语句为:EXTRA_LIBS=-L. -lphp4 -lgdbm -ldb -L/usr/local/mysql/lib -lmysqlclient
如果你采用动态模块安装,如果是初次安装,修改语句不同,具体查看PHP的INSATLL文件。]
然后执行:
./configure --prefix=/home/apache (prefix=是指定存放路径。不带prefix,默认的是/usr/local/apache)
(也可以直接执行./configure --prefix=/home/apache
--activate-module=src/modules/php4/libphp4.a )
make
make install
9)进入 php-4.0.6 执行
cp php.ini-dist /usr/local/lib/php.ini
10)启动APACHE: ./home/apache/bin/apachectl start
11)运行你的phpinfo()程序,默认APACHE的根目录是/usr/local/apache/htdocs/ 。如过跟上面WINDOWS中显示一样,那就恭喜你安装成功了,可以支持PHP+GD+JPEG+PNG了。不行的话,重装试试。
另外,在gd-1.8.3中有个GIF的补丁,我试过没有成功,看来要版本很低的LINUX才行,如果你成功了,或者在LINUX6.1以上版本中有什么其他办法实现PHP+GD+GIF,麻烦告诉我(E_mail:[email protected])
如果要用GIF图形,操作如下,把上面步骤:6a换成6b
使用gd-1.8.3,加上GIF补丁编译,使GD库包含GIF库:
6b)下载:http://www.boutell.com/gd/http/gd-1.8.3.tar.gz
下载补丁:http://www.webofsin.com/gd-1.8.3-gif.patch
解开,进入gd-1.8.3
打上GIF的补丁:patch -p0 <gd-1.8.3-gif.patch
File to patch: gd.c
然后此目录中多了一个gd-1.8.3/gd_gif.c
修改Makefile,基本同上。
此后,编译并安装:
其他步骤同上,只要把gd-1.8.4换成gd-1.8.3 。
二,PHP中大图缩小图的程序实例:(在WINDOWS和LINUX平台都调试通过了。)
1)上传图片页面:(片段)
在<head></head>中间加入下面程序,(这段程序很有用,可以在前台,用户端判断用户上传的文件类型,控制用户的上传文件)
<script language="JavaScript">
<!--
function CheckForm(theForm)
{
var fileext=theForm.zhaopian_up.value.substring(theForm.zhaopian_up.value.length-4,theForm.zhaopian_up.value.length)
fileext=fileext.toLowerCase()
if (!(fileext=='.jpg' || fileext=='.png'))
{alert("对不起,不正确的照片文件,必须为*.jpg或*.png文件 !");
theForm.zhaopian_up.focus();
return false;
}
return true;
}
// -->
页面中加入上传表单:
<FORM ENCTYPE="multipart/form-data" ACTION="photo_upload2.php" METHOD="POST" onsubmit="return CheckForm(this)">
注:请先上传照片,后填下表。第一张为封面照片,只能传jpg图片,小于300K,少于9张。
<p class="big"> 上传照片:</p>
<input type="file" name="zhaopian_up" size="20"> <INPUT TYPE="submit" value="上传">
</form>
2)处理页面程序,包含判断图片大小,上传拷贝,缩图,生成小图文件,图片ID存入数据库等:(片段)
<?
//取得上传文件大小,300K:
if ($zhaopian_up_size>307200) {
$wrong_massage="对不起,你上传的文件大小超过了300K,请缩小图再传!";
Header("Location:include/wrong_massage.php?wrong_massage=$wrong_massage");
exit();
}
//自动缩图$srcFile原文件,大图;$photo_small目标文件,小图;$dstW,$dstH是小图的宽,高。
function makethumb($srcFile,$photo_small,$dstW,$dstH) {
$data = GetImageSize($srcFile,&$info);
switch ($data[[2]]) {
case 1: //图片类型,1是GIF图
$im = @ImageCreateFromGIF($srcFile);
break;
case 2: //图片类型,2是JPG图
$im = @imagecreatefromjpeg($srcFile);
break;
case 3: //图片类型,3是PNG图
$im = @ImageCreateFromPNG($srcFile);
break;
}
$srcW=ImageSX($im);
$srcH=ImageSY($im);
$ni=ImageCreate($dstW,$dstH);
ImageCopyResized($ni,$im,0,0,0,0,$dstW,$dstH,$srcW,$srcH);
ImageJpeg($ni,$photo_small);
//ImageJpeg($ni); //在显示图片时用,把注释取消,可以直接在页面显示出图片。
}
$srcFile=$zhaopian_up;
//取得文件扩展名:
$type=substr(strrchr($zhaopian_up_name,"."),1);
$photo_ID=time();
$photo_path="user_picture/$user/";
if(is_dir($photo_path)!=TRUE) mkdir($photo_path,0777);
$photo_small=$photo_path."/".$photo_ID."_s.".$type; //小图
$photo_s=fopen($photo_small,"w+");
if ($type=="png" || $type=="jpg") makethumb($srcFile,$photo_small,110,130);//110,130为小图宽,高
?>
在显示图片的程序中,只需从数据库中读出图片ID,用$photo_path."/".$photo_ID."_s.".$type就是显示小图,加个链接,就可以显示大图$photo_path."/".$photo_ID.".".$type;
在我的一个程序中有此功能,正在测试:www1.yn.cninfo.net/love
另有一篇参考文章。介绍在Solaris 7下安装gd-1.8.3(包含所有库),而且还修改了程序使其支持GIF,看起来很COOL。
但我没有测试过,你需要的话,可以看看:http://wsz26.51.net/PHP-GD.htm
---------------------------------------
好了,还有什么问题欢迎来信讨论(E_mail:[email protected]),可以随便转载,但是请保留作者。另外,刚开始做了一个个人网站,欢迎访问:http://ub_think.home.chinaren.com
这个方法我一直再用,但生成的缩略图效果不好........
有没有别的方法???
PHP:--------------------------------------------------------------------------------
function makethumb($srcFile,$dstFile,$dstW,$dstH) {
ImageAlphaBlending($srcFile, true);
$picdata = GetImageSize($srcFile,&$info);
switch ($picdata[2]) {
case 1:
$im = @ImageCreateFromGIF($srcFile);
break;
case 2:
$im = @imageCreateFromJpeg($srcFile);
break;
case 3:
$im = @ImageCreateFromPNG($srcFile);
break;
case 6:
$im = @ImageCreateFromWbmp($srcFile);
break;
}
$srcW=ImageSX($im);
$srcH=ImageSY($im);
$dstX=0;
$dstY=0;
if ($srcW*$dstH>$srcH*$dstW) { $fdstH=round($srcH*$dstW/$srcW); $dstY=floor(($dstH-$fdstH)/2); $fdstW=$dstW; }
else { $fdstW=round($srcW*$dstH/$srcH); $dstX=floor(($dstW-$fdstW)/2); $fdstH=$dstH; }
$ni=ImageCreate($dstW,$dstH);
$dstX=($dstX<0)?0:$dstX;
$dstY=($dstX<0)?0:$dstY;
$dstX=($dstX>($dstW/2))?floor($dstW/2):$dstX;
$dstY=($dstY>($dstH/2))?floor($dstH/s):$dstY;
$gray = ImageColorAllocate($ni,132,130,132);
$black = ImageColorAllocate($ni, 0,0,0);
$white = ImageColorAllocate($ni, 255,255,255);
imagefilledrectangle($ni,0,0,$dstW,$dstH,$white);
ImageCopyResized($ni,$im,$dstX,$dstY,0,0,$fdstW,$fdstH,$srcW,$srcH);
$imgtext="sa20.com";
ImageString($ni,2,60,75,$imgtext,$black);
//ImageTTFText ($ni, 12, 0, 60, 75, $black, "data/font.ttf",$imgtext);
ImagePNG($ni,$dstFile);
imagedestroy($im);
imagedestroy($ni);
}--------------------------------------------------------------------------------
最后编辑由 firefox 在 08-01-02 01:19
二、php3,4中session的实现
--------------------------------------------------------------------------------
2003年06月23日 06:00:40 AM
在php3中是没有session这种东东的,但我们又需要,怎么办呢?别急,有很多人替你做了这些,这其中最有名的要算phplib了。你可以去国外下 载,也可以上国内大部分php站点下载。我们要做的第一件事是让phplib和php3结合在一起使它能工作。为了能实现这方面的功能,我们需要先安装phplib。 跟着我来做,很容易的(以下方法在win2000+php3.0.16+apache1.3.12+phplib7.2c+mysql3.23.21 for win32 上通过) phplib最基本的功能包括用户认证,Session管理,权限及数据库的抽象化。 怎样使用phplib来实现session功能呢? 一、首先你将phplib解开,里面有一个目录叫"php",将这个目录拷贝到apache的安装目录下。以下以笔者的机器为例: 我的apache安装在d:apache 目录下,我将上面的"php"目录拷贝到d:apache,并将phplib下的pages目录下的文件和目录一起拷贝到 d:apachehtdocs下,注意不带目录本身。 phplib的类库需要根据系统进行初始化,你可以修改local.inc文件,其中包含着一些基本参数,你可以根据自己机器的实际情况来进行修改。 将d:apachephpprepend.php3文件中的一段程序改为如下样子: if (!isset($_PHPLIB) or !is_array($_PHPLIB)) { $_PHPLIB["libdir"] = "d:/apache/php/"; //这儿改为你放phplib下php目录的路径 } 然后将d:apachephplocal.inc文件改如下: class DB_Example extends DB_Sql { var $Host = "localhost";//你的mysql数据库所在主机名 var $Database = "test";//数据库名 var $User = "root";//数据库用户名 var $Password = "";//数据库用户口令 } 最后一步执行解开的phplib目录中的stuff目录下的create_database.mysql文件,生成初始表。 我们说明一下phplib的工作原理,每一个使用phplib的页面首先必须可以找到运行phplib所必须类库文件,我们可以在php3.ini中设置auto_prepend 变量来支持,phplib分发包中包含一个prepend.php3文件,将auto_prepend指定为"d:/apache/php/prepend.php3"(带引号)后,各页面就会自动包含phplib类库,我们还可以 将phplib类库所在目录加进include变量中,以便可以找到这些文件,当然,最苯的办法就是指定phplib的绝对路径,这可不是个好主意,可移植性太差! 第二步,每一个使用phplib的页面中,你必须首先调用page_open函数进行初始化。这会告诉phplib,你现在或将来会用到状态保存。一个典型的 page_open例子如下: "Example_Session"); ?> 数组变量(sess)用来初始化一些状态保存对象,注意:必须使用phplib内置名(sess),这些内置名是你在local.ini中所定义的,page_open 函数必须在页面内容输出到浏览器之前被调用。php3脚本最后应以page_close()结束,这将会将有关状态数据写回到数据库中,如果你忘了的话, 结果你应该能想到,哈哈,你的变量全丢了,可不要怪我没告诉你... 因为phplib使用了Cookies来保存状态信息,所以page_open()函数必须在页面内容输出到浏览器之前被调用, 这里的页面内容可以是任何HTML 信息或者空行,如果你发现了错误"Oops - SetCookie called after header has been sent",这表明在page_open()之前向浏览器输出了些什么, 你要特别留意空行,因为非常难找到,典型的错误是在标记之间输出了空行,你应检查在local.inc和prepend.php3文件中是否包含了空行, 这也是一个非常容易出错的地方。为了减少出错的可能,我们可以这样书写初始化程序: "Example_Session"); ?> ..... 第三步,具体使用。 当一个用户访问了该网站后,随即用户的session就开始了,如果用户的浏览器支持cookie的话,将会建立一个session的id放入cookie, 这个唯一的ID是由PHP3随机生成,然后又用随机种子字串进行md5加密过了的,这里的cookie应该叫做session cookie,因为这个cookie是不会 写到用户硬盘里去的,当一个session期结束的时候,该cookie也被完结了。如果用户浏览器不支持cookie的话,那么 该session的id将会放入url链中, 因为是加密过的,所以窃取了也没用。session ID存放着用户的有关信息,如用户已认证、认证到期时间、用户权限,和其他一些你可能需要的信息, 方便我们取用。 Session其实就是用户一次会话的过程。Session并不是仅仅用来跟踪用户的注册,实际上,它还可以有其它的使用场合,你可以用它来存储任何你想要 存贮的信息,这些信息可以在用户随后访问的页面中派上用场,当然前提是那些页面要使用PHPLIB。方法很简单,注册一个变量后即可在随后的页面中使用它, 直至session结束。方法: register( "variable_name"; ?> 注意,这里的variable_name不是变量值,而是变量名,可以先指定变量名,随后再赋值。你在某个页面中可以改变变量的值,随后的页面访问该变量时 会得到改变后的值。变量的类型是多样的,可以是一个字串,一个数字,一个数组。举例来说明: 第一页: "Example_Session"); $sess->register( "first"; //注意变量名前不需要加$ if (iset($firstname)) { $first = $firstname; } ..... page_close(); ?> 第二页: 注册完一个变量,当页面最后调用page_close()函数后,各个session变量会被写回到数据库中。如果你忘记调用page_close()函数的话, 变量就不会被写回数据库,将出现不可预知的后果。当变量被使用完毕,你不再需要用到时,可以调用以下函数将变量删除: "Example_Session"); ... $sess->unregister( "variable_name"; ... page_close(); ?> PHPLIB 7.0中,使用了一种存储结构,它允许你存储session数据到数据库中、共享内存中或者LDAP中。PHPLIB使用了数据库类,这使得你有 了更多的选择,你可以选用oracle8,mysql,postgresql等等数据库来保存状态信息。 关于phplib中的其它功能以及有关session的其它函数的使用,你可以参看它带的手册,或上它的网站看在线文档。它的老家在 [url]http://phplib.netuse.de/index.php3[/url] 。 php4的session实现大都从phplib学来的,它也靠cookies保存session id,用文件系统保存变量(默认情况下)。因此,它的session 变量不能保存对象(事实上能保存对象内容,但没有意义,因为它是保存在磁盘上的,不是活的对象,充其量也就是对象尸体。)不过这点的限制不是太 大,我们在大部分情况下都只需要保存变量就行了。当然你也可以将session保存在数据库中,下一小节中我们会讲到怎样将session保存在数据库中。 在php4中由于比php3多了session支持,所以在php.ini文件中也多了session配置选项。下面我们来看看各项的作用与意义: [Session] session.save_handler = files ; handler used to store/retrieve data(用什么保存session变量,默认情况下用文件) session.save_path = c:/temp ; argument passed to save_handler(保存session变量的目录,在linux/unix下为/tmp,在win下设为你的目录) ; in the case of files, this is the ; path where data files are stored session.use_cookies = 1 ; whether to use cookies(是否使用cookies,当然,在win下别无选择) session.name = PHPSESSID ; name of the session(默认session使用的cookies名,建议不要改动) ; is used as cookie name session.auto_start = 0 ; initialize session on request startup(是否自动启用session,当为1时,在每页中就可以不必调用session_start()函数了) session.cookie_lifetime = 0 ; lifetime in seconds of cookie(设定 cookie 送到浏览器后的保存时间,单位为秒。缺省值为 0,表示直到浏览器关闭。) ; or if 0, until browser is restarted session.cookie_path = / ; the path the cookie is valid for(cookie)(cookies有效路径) session.cookie_domain = ; the domain the cookie is valid for(cookies有效域名) session.serialize_handler = php ; handler used to serialize data(定义序列化数据的标识,本功能只有 WDDX 模块或 PHP 内部使用。缺省值为 php) ; php is the standard serializer of PHP session.gc_probability = 1 ; percentual probability that the (设定每次临时文件开始处理 (gc, garbage collection) 处理概率。缺省值为 1。 ) ; 'garbage collection' process is started ; on every session initialization session.gc_maxlifetime = 1440 ; after this number of seconds, stored(设定保存session的临时文件被清除前的存活秒数) ; data will be seen as 'garbage' and ; cleaned up by the gc process session.referer_check = ; check HTTP Referer to invalidate (决定参照到客户端的 Session 代码是否要删除。有时在安全或其它考虑时,会设定不删除。缺省值为 0。) ; externally stored URLs containing ids session.entropy_length = 0 ; how many bytes to read from the file(设定 session 从高熵值资源读取的位数。缺省值为 0.) session.entropy_file = ; specified here to create the session id(设定 session 代码建立时,使用外部高熵值资源或文件来建立,例如 UNIX 系统上的 /dev/random 或 /dev/urandom。 ) ; session.entropy_length = 16 ; session.entropy_file = /dev/urandom session.cache_limiter = nocache ; set to { nocache,private,public } to (设定session 缓冲限制) ; determine HTTP caching aspects session.cache_expire = 180 ; document expires after n minutes(文档有效期,单位为分钟) 在windows平台下,php4.01pl2以前的版本会出现设置session.save_path 后出错的情况,这是php的一个bug,在php4.01pl2及以后已经修正了。如果你用以前的版本, 你可以将session.save_path设为"./",或设为"/temp",并在你放置php脚本的当前盘根目录下建一个名为temp的目录即可(我的php脚本放在d:apachehtdocs下,则我在d:盘根目录下建一名为temp的目录)。 在php4中有关session的函数主要有以下这些: session_start: 初始化session,需要用session的每一个页面最开始处调用。 session_destroy: 结束 session,在需要结束session处调。 session_name: 存取目前 session 名称。 session_module_name: 存取目前 session 模块。 session_save_path: 存取目前 session 路径。 session_id: 存取目前 session id号。 session_register: 注册新的session变量。 session_unregister: 删除已注册session变量。 session_is_registered: 检查session变量是否注册。 session_decode: Session 数据解码。 session_encode: Session 数据加密。 通常情况下我们只需要调用三个函数即可。 即sesssion_start()、session_register()、session_is_registered()。 在需要用到session的每一页的最开始处调用session_start()函数, 一个典型的使用session的页面如下: ....
上一篇: session全教程[教程来自FASTBOARD]
下一篇: 数据表是MyISAM格式,是什么意
PHP中的模板技术
2002-05-17· ·李乔··yesky
1 2 下一页
综述:
在多人开发大型PHP项目时,模板技术非常有用,它可以分开美工和程序员的工作,并且方便界面的修改和完善;不仅如此,利用模板技术,我们还可以简单有效地定制或者修改站点。现在我们将要以PHPLIB的模板为例子讲述如何在PHP中应用模板技术。
如何使用PHPLIB模板?
设我们有一个模板, 名为UserTemp,路径为/home/user_dir/user_temp/,它的内容如下:
你订购的是:{Product}
大括号表示Product是一个模板变量。
然后我们编写如下的程序:
<?php
include "template.inc";
$user_product = "随身听";
$tmp = new Template("/home/user_dir/user_temp/"); // 创建一个名为 $t 的模板对象
$tmp->set_file("FileHandle","UserTemp.ihtml"); // 设置句柄FileHandle = 模板文件
$tmp->set_var("Product",$user_product); // 设置模板变量Product=$user_product
$tmp->parse("Output","FileHandle"); // 设置模板变量 Output = 分析后的文件
$tmp->p("Output"); // 输出 Output 的值(我们的分析后的数据)
?>
template.inc是PHPLIB中的一个文件,我们用include以便使用PHPLIB的模板功能。PHPLIB模板使用的是面向对象的设计,所以我们可以用$tmp = new Template("/home/user_dir/user_temp/")创建一个模板对象,其参数是一个路径("/home/user_dir/user_temp/"), 用来设置模板文件所在位置,默认路径是PHP脚本所在目录。
set_file()用来定义指向UserTemp.ihtml(PHPLIB模板的模板文件名的后缀为.ihtml )的句柄"FileHandle",set_var()用来设置模板变量Product为$user_product的值(即"随身听"),parse()方法会装入FileHandle(即UserTemp.ihtml)进行分析,将所有在模板中出现的"{Product}"替换成$user_product的值("随身听")。
如何使用嵌套的模板?
在上面的例子中,parse()方法设置的"Output"是一个模板变量,利用这点,我们可以实现模板的嵌套。
比如,我们有另外一个模板(假设为UserTemp2),其内容是:
欢迎你,亲爱的朋友!{Output}
那么在分析之后,其输出会是:
欢迎你,亲爱的朋友!你订购的是:随身听
下面是更新后的程序:
<?php
include "template.inc";
$user_product = "随身听";
$tmp = new Template("/home/user_dir/user_temp/");
$tmp->set_file("FileHandle","UserTemp.ihtml");
$tmp->set_var("Product",$user_product);
$tmp->parse("Output","FileHandle");
$tmp->set_file("FileHandle2","UserTemp2.ihtml");//设置第二个模板句柄
$tmp->parse("Output","FileHandle2");//分析第二个模板
$tmp->p("Output");
?>
很简单,我们就不详细解释了。这里有一个技巧:parse()和p()可以写成一个函数pparse(),比如$tmp->pparse(Output","FileHandle2)。
一个判断oicq是否在线的小程序
一个判断oicq是否在线的小程序
<?
function get_status($uin)
{
$fp = @fsockopen ("infocenter.tencent.com", 80, &$errno, &$errstr, 30);
if(!$fp)
{
return '出错';
}
else
{
fputs($fp, "GET /$uin/l/00/0/ HTTP/1.0 ");
$do = 'yes';
while(!feof($fp))
{
$line = fgets ($fp,128);
$do = ($do == 'yes')?'yes':(eregi("^GIF89", $line))?'yes':'no';
if($do == 'yes')
{
if(ereg("Online", $line))
{
return '在线';
}
elseif(ereg("Offline", $line))
{
return '没在线';
}
}
}
fclose($fp);
}
return '未知';
}
$uin='989770'; //我自己的
echo get_status($uin);
?>
全文搜索和替换
全文搜索和替换
<?php
exec("/bin/grep -r '$oldword' $rootpath", $results, $errorCode);
if ($errorCode){
if ($errorCode == 1){
echo "Possibly no files were found with $oldword in them<BR>\n";
}
echo "OS Error: $errorCode<BR>\n";
echo "Check 'man errno' and count down<BR>\n";
echo "Usually paths/permissions<BR>\n";
}
while (list(,$path) = each($results)){
$parts = explode(':', $path);
$path = $parts[0];
$fp = fopen($path, 'r') or print("Cannot read $path<BR>\n");
if ($fp){
$data = fread($fp, filesize($path));
fclose($fp);
$newdata = str_replace($oldword, $newword, $data);
$fp = fopen($path, 'w') or print("Cannot write $path<BR>\n");
if ($fp){
fwrite($fp, $newdata);
fclose($fp);
echo $path, "<BR>\n";
}
}
}
?>
Example
http://yourserver.com/globalreplace.php?oldword=test&newword=text&rootpath=/path/to/dir
上传图片时生成缩微图象的函数
作者/来源:keniv
上传图片时生成缩微图象的函数
实际应用请看http://feifei2.bjedu.gov.cn/cgi-bin/funnymovie.php
// 这里有很多搞笑电影
// 本函数从源文件取出图象,设定成指定大小,并输出到目的文件
// 源文件格式:gif,jpg,,png
// 目的文件格式:jpg
// $srcFile: 源文件
// $dstFile: 目标文件
// $dstW: 目标图片宽度
// $dstH: 目标文件高度
function makethumb($srcFile,$dstFile,$dstW,$dstH) {
$data = GetImageSize($srcFile,&$info);
switch ($data[2]) {
case 1:
$im = @ImageCreateFromGIF($srcFile);
break;
case 2:
$im = @imagecreatefromjpeg($srcFile);
break;
case 3:
$im = @ImageCreateFromPNG($srcFile);
break;
}
$srcW=ImageSX($im);
$srcH=ImageSY($im);
$ni=ImageCreate($dstW,$dstH);
ImageCopyResized($ni,$im,0,0,0,0,$dstW,$dstH,$srcW,$srcH);
ImageJpeg($ni,$dstFile);
// 如果需要输出到浏览器,那么将上一句改为ImageJpeg($ni);
// 如果需要其它格式的图片,改动最后一句就可以了
取得文件的MD5值
--------------------------------------------------------------------------------
(文:Redhat)
<?php
class getfMd5{
var $file = "";
function go(){
$fp = fopen($this->file,"rb");
$msg = fread($fp,filesize($this->file));
fclose($fp);
return md5($msg);
}
}
//使用范例(支持二进制文件及文本文件)
$fMd5 = new getfMd5;
$fMd5->file = "logo.gif";//需要校验MD5值的文件
echo "文件<font color=red>".$fMd5->file."的MD5值为</font>".$fMd5->go();
?>
生成随机字符串
--------------------------------------------------------------------------------
(文:redhat)
<?php
/**
说明:生成数字,大小写字母组成的任意位数的字符串
参数传递:$start和$end为开始和结束的字符串位数,如6,10则生成6到10位之间的密码,包括其本身
$t,输出的类型,0为全部小写和数字的组合,1为全部大写和数字的组合,3为全部数字的组合,4为大小写字母的组合
(int,int,int)
返回值:字符串(String)
*/
function randPs($start=6,$end=8,$t=0){
$type = $t;
$r = array(
0=>rand(49,57),//1-9的ASCII码
1=>rand(65,90),//A-Z的ASCII码
2=>rand(97,122)//a-z的ASCII码
);
if($type == 3) $re = chr($r[rand(0,0)]);
else $re = chr($r[rand(0,2)]);
$s = rand($start,$end);
static $ps = "";
while(true){
if(strlen($ps)>=$s) return substr($ps,0,$s);
$tmp = $re;
if($type == 0) $tmp = strtolower($tmp);
else $tmp = $type==1?strtoupper($tmp):$tmp;
if(stristr($ps,$tmp) == true){randPs($start,$end,$t);continue;}
$ps .= (string)$tmp;
}
return $ps;
}
//使用范例
//随机生成6至8位间小写字母和数字的组合字符串
echo randPs(6,8,0);
?>
PHP下载文件
--------------------------------------------------------------------------------
(文:redhat)
<?php
// download.php?name=filename
header("Content-type: application/force-download");
header("Content-Disposition: attachment; filename=".$_GET["name"]);
@readfile('./'.$_GET['name']);
?>
根据某年的不同日期调用不同的模板
--------------------------------------------------------------------------------
(文:Redhat)
<?php
//初始化时间段数组
$tm = array(
0=>array("05-08","09-10","a.tpl"),
1=>array("03-04","05-04","b.tpl"),
2=>array("01-01","03-03","c.tpl"),
3=>array("09-11","12-31","d.tpl")
);
$default_tpl = "default.tpl";
//初始化当前时间
$time = time();
//是否找到相应时间段的模板
$find = false;
//循环每个时间段看看有没有符合条件的
for($i=0;$i<sizeof($tm);$i++)
{
$tmp1 = explode("-",$tm[$i][0]); //分解第一个时间段
$tmp2 = explode("-",$tm[$i][1]); //分解第二个时间段
$t1 = mktime(0,0,0,$tmp1[0],$tmp1[1],date("Y"));//把第一个时间段转换成时间秒数
$t2 = mktime(0,0,0,$tmp2[0],$tmp2[1],date("Y"));//把第二个时间段转换相应的时间秒数
if($t1<$time && $t2>$time) {//判断是否在当前的时间段内
$find = true;//找到
echo "现在调用时间段为:".$tm[$i][0].":::".$tm[$i][1]."的模板(<font color=red>$tm[$i][2]</font>)<br>";//好,输出看看
}
}
if(!$find) echo "没找到,还是用默认的模板吧<font color=red>$default_tpl</font>";//没找到
?>
PHP代码:--------------------------------------------------------------------------------
<?
$name="zhaohf";
setcookie("cookiename",$name);
echo $_cookie["name"];
echo "<meta http-equiv=refresh content='1; url=6.php'>";
//2.php
?>
<?
echo $cookiename;
echo "<meta http-equiv=refresh content='1; url=10.php'>";
//6.php
?>
<?
setcookie("cookiename","");
echo "<meta http-equiv=refresh content='1; url=11.php'>";
echo $cookiename;
//10.php
?>
<?
echo $cookiename;
//11.php
?>
--------------------------------------------------------------------------------