Chinaunix

标题: [代码 推荐] 整理了一些网上的代码一是自己用,也提供大家共享! [打印本页]

作者: cyhchenz    时间: 2005-09-11 03:01
标题: [代码 推荐] 整理了一些网上的代码一是自己用,也提供大家共享!
这是网址: http://photo.chenz.com/shows.php?show=sj&name=php
http://www.chenz.com/shows.php?show=sj&name=php

也希望有人提供自己常用的代码!
作者: HonestQiao    时间: 2005-09-11 09:55
标题: [代码 推荐] 整理了一些网上的代码一是自己用,也提供大家共享!
php实现多session并发运行 的详细信息
发表时间: 2005.09.11 发布人/作者:



首先介绍一下session的概念:

  所谓session是微软首先提出的,在asp中最先集成。由于session的采用,大大方便了web开发员的工作。一时间asp风靡全球。现在php4也加入session的支持,再度显示出open source 的强大力量。和Cookie类似,设计Session的目的也是为了在一个访问期间在不同的页面间传输数据以解决http协议无状态的问题,但Session更加简单、更加安全。Session 中文没有一个统一的译法,我习惯上译为会话。关于session的意义大家都应该清楚: 其实是在浏览某个网站时,在浏览器没有关闭的情形之下,一个web应用的开始和结束。一个session可以包括数次http的请求和应答,比如我们用freemail.263.net,从login到logout或者超时就作为一个session 的生存期。每一个被创建的Session都有一个唯一的标识串,叫session ID , 这个串被发送到客户端,同时在服务器端也生成了同样唯一的标识串入口,这个标识串或者放在文本文件中,或者放在一个数据库中。然后程序可以在这个sessionID下注册一些Session 变量。这些变量如同一般的变量一样可以保存文本或数值信息,可以通过Session被读出或写入。 session 的唯一标识一般是在系统内部唯一的session ID,一般是一个挺长的字符串。

问题的提出:

  解了session概念后,我在为我单位编写一个进销存系统中发现需要让多个用户可以同时进入一个php应用程序。原来设计的静态的唯一的session ID导致数据混乱。这样,动态生成一个唯一的session ID成为当务之急。

  解决办法很简单:我用了php文件名+时间戳为唯一的session ID,这样在我的程序中的每个session就各就各位,不再混乱了。
下面把我的源代码公布,方便也有同样的问题的朋友多一个解决方法。

//Start a PHP session to preserve variables.
      if ( empty($mysessionname) ) {
         $micro = microtime();
         $micro = str_replace(" ","",$micro); // strip out the blanks
         $micro = str_replace(".","",$micro); // strip out the periods
         $mysessionname = "po_maint" . $micro;
      }
      session_name($mysessionname);
      session_start();

程序注释:

  我用mysessionname为页面间唯一的sessionname传递变量,如果你也用到这个名字必须把上述程序做个小小的改动。Mysessionname不能为session的内部变量名,因为他在session开始之前就已经存在了。Mysessionname也不能用cookie方式存放,因为多个session肯定会覆盖掉原先的cookie文件。你可以用隐含表单的域来保存它。这样就不会有问题。欢迎来信讨论。让我们一起做得更好。
作者: HonestQiao    时间: 2005-09-11 09:56
标题: [代码 推荐] 整理了一些网上的代码一是自己用,也提供大家共享!
用PHP和MySQL保存和输出图片 的详细信息
发表时间: 2005.09.11 发布人/作者:


本文实际是讲解一个保存二进制文件的基本方法。

在我们设计和制作网站的过程中,有时把图片保存到数据库中要比存成文件的形式更加方便。PHP和MySQL这对黄金组合可以很容易的实现上述功能。在本文中,我们将会向读者介绍如何把图片保存到MySQL数据库中以及如何将数据库中的图片显示出来。
设置数据库
  我们通常在数据库中所使用的文本或整数类型的字段和需要用来保存图片的字段的不同之处就在于两者所需要保存的数据量不同。MySQL数据库使用专门的字段来保存大容量的数据,数据类型为BLOB。
  MySQL数据库为BLOB做出的定义如下:BLOB数据类型是一种大型的二进制对象,可以保存可变数量的数据。BLOB具有四种类型,分别是TINYBLOB,BLOB, MEDIUMBLOB 和LONGBLOB,区别在于各自所能够保存的最大数据长度不同。
  在介绍了所需要使用的数据类型之后,我们可以使用以下语句创建保存图象的数据表。
  CREATE TABLE Images ( PicNum int NOT NULL AUTO_INCREMENT PRIMARY KEY, Image BLOB );
编写上传脚本
  关于如何实现文件的上传,我们在这里就不再介绍了,感兴趣的读者可以参见“网页陶吧”内的相关文章。现在,我们主要来看一下如何接收上传文件并将其存入到MySQL数据库中。具体的脚本代码如下,其中我们假定文件上传域的名称为Picture。
If($Picture != "none" { $PSize = filesize($Picture);
$mysqlPicture = addslashes(fread(fopen($Picture, "r", $PSize));
mysql_connect($host,$username,$password) or die("Unable to connect to SQL server";
@mysql_select_db($db) or die("Unable to select database";
mysql_query("INSERT INTO Images (Image) VALUES '($mysqlPicture')"
or die("Can't Perform Query";
}
else
{ echo"You did not upload any picture"; }
?>;
  这样,我们就可以成功的把图片保存到数据库中。如果在将图片插入MySQL的过程中出现问题,可以检查一下MySQL数据库所允许的最大数据包的大小。如果设置值过小的话,我们会在数据库的错误日志中找到相应的记录。
  下面,我们简单说明一下上述脚本程序。首先,我们通过“If($Picture != "none"”检查是否有文件被上传。然后,使用addslashes()函数避免出现数据格式错误。最后,连接MySQL,选择数据库并插入图片。
显示图片
  在知道了如何将图片存入数据库之后,我们就需要考虑怎样才能从数据库中取出图片并在HTML页面中显示出来。这个过程要稍微复杂一些,下面我们就来介绍一下实现过程。
因为PHP显示图片需要发送相应的标头,所以我们就会面临这样一个问题,那就是一次只能显示一副图片,因为我们无法在发出标头之后再发送其它的标头。
为了有效的解决这一问题,我们编写了两个文件。其中,第一个文件作为HTML页面的模板,定位图片的显示位置。第二个文件则被用来从数据库中实际输出文件流,作为标签的SRC属性。
第一个文件的简单形式可以如下:


mysql_connect($host,$username,$password)
or die("Unable to connect to SQL server";
@mysql_select_db($db) or die("Unable to select database";
$result=mysql_query("SELECT * FROM Images" or die("Can't Perform Query");
While($row=mysql_fetch_object($result)) {
echo "<IMG SRC=\"Second.php3? PicNum=$row->icNum\">";
}
?>;


  当HTML页面被浏览时,每显示一副图片就会调用一次Second.php3文件。当第二个文件被调用时会传入相应的Picture ID,我们可以借此从数据库中取回对应的图片并显示。
Second.php3文件如下:
$result=mysql_query("SELECT * FROM Images WHERE PicNum=$PicNum")
or die("Can't perform Query"); $row=mysql_fetch_object($result);
Header( "Content-type: image/gif"); echo $row->;Image;
?>;
到此,我们就介绍完了使用PHP和MySQL保存和显示图片的全过程。文中所举得都是一些最简单的实例,读者可以根据自己的实际需要加入其它一些功能,使整个程序更加完善。
作者: HonestQiao    时间: 2005-09-11 09:56
标题: [代码 推荐] 整理了一些网上的代码一是自己用,也提供大家共享!
PHP随机显示图像代码 的详细信息
发表时间: 2005.09.11 发布人/作者:

<?php

$url='./';
//图片地址,用相对路径

$files=array();
if ($handle=opendir("$url") {
while(false !== ($file = readdir($handle))) {
if ($file != "." && $file != ".." {
if(substr($file,-3)=='gif' ││ substr($file,-3)=='jpg') $files[count($files)] = $file;
}
}
}
closedir($handle);

$random=rand(0,count($files)-1);
if(substr($files[$random],-3)=='gif') header("Content-type: image/gif";
elseif(substr($files[$random],-3)=='jpg') header("Content-type: image/jpeg";
readfile("$url/$files[$random]";

?>;
作者: HonestQiao    时间: 2005-09-11 09:57
标题: [代码 推荐] 整理了一些网上的代码一是自己用,也提供大家共享!
一个可以删除字符串中HTML标记的PHP函数 的详细信息
发表时间: 2005.09.11 发布人/作者:


当访客留言和发帖时,我们并不希望访客在留言和帖子中使用HTML标记,所以在访客提交留言和帖子时我门得把HTML标记删除,下面的函数就是实现此功能的函数
<?
function delete_htm($scr)
{
for($i=0;$i<strlen($scr);$i++)
{
if(substr($scr,$i,1)=="<"
{
while(substr($scr,$i,1)!=">;"$i++;
$i++;
}
$str=$str.substr($scr,$i,1);
}
return($str);
}
?>;
作者: HonestQiao    时间: 2005-09-11 09:59
标题: [代码 推荐] 整理了一些网上的代码一是自己用,也提供大家共享!
多个域名绑定一个空间互不影响 的详细信息
发表时间: 2005.09.11 发布人/作者:

<?
$domain_net="abc.com";
$dot_net_url="bbs/";
$dot_com_url="flash";
if(($HTTP_HOST=="$domain_net"or($HTTP_HOST=="www.$domain_net")
{
Header("Location: $dot_net_url";
}
else
{
Header("Location: $dot_com_url";
}
?>;
作者: HonestQiao    时间: 2005-09-11 09:59
标题: [代码 推荐] 整理了一些网上的代码一是自己用,也提供大家共享!
仅用PHP4Session实现的迷你购物篮 的详细信息
发表时间: 2005.09.11 发布人/作者:



介绍
  如果你还没有用PHP 实现你自已的购物篮,在读完这篇文章之后你应该可以创建一个了。甚至你可能已经有了一个购物篮,我在这里所提供的一些技巧可能会帮助你改善你的系统。

  我将给你一些提示,关于如何去做也许才能减少对购物篮表的无限的查询,或减少无限的文本文件填充你的文件系统,因为应用程序只会做但不会删除它们。

  如果你对这类的题目是个新手,不要害怕。它实际上相当简单和有效,你只需要一个支持php4的主机,象notepad或vi之类的html编辑器,你宝贵的几分种,和这个小例子。


想法
  在1998年,我有一个在硬件商店工作的朋友要求我为他们编写一个在线商店。需要快速和简单,同时还要有在线管理。当我发着39度高烧的时候我变得想当有创建力,所以我用perl写了那个东西,使用minisql作为后端。在整个处理中我插入了我所提到的迷你购物篮。

  这个迷你购物篮与平常的购物车只有很小的不同,它会在每一页显示你的购物车的东西,不需要在放入一件东西后在购物车来回跳转。这就是我写这篇文章的初衷。


目标
  人们喜欢控制,那么为什么不给他们些透明度,以便让他们相信拥有了控制?这个迷你购物篮演示了一个完美的方法:它提供给人们所必须的信息,并且节省了他们一次点击,接近了在线商店的3击范例。

  所以,目标就是在任何时候将这个迷你购物篮显示为你的页面上的一部分,在结尾处提供一个摘要用以修改购物篮中的物品,接着在最后发送一个订单。

要求
  你应该知道什么是session。如果不知道,这里有一个快速的纲要。已经有很多文章关于这个话题,你可以从中找到所有你需要的代码例子。在你的开始页面打开一个session,使用

<?php

session_start();

?>

  这样将创建一个session名字和一个session id。你现在既可以使用缺省的通过基于cookie的设置session的方式,通过一个表单来传递session id,或把它作为一个变量附在你的链接上(get方法)的方法。不要忘记在最后释放session。

  你的商品应该有一个名字,价格和唯一标识,以便能用在这个例子中,如果不这样,你可能需要做一点修改。这里我使用mysql作为后端以便建立页面及其它,为了让购物能工作这不是必须的。

  你应该了解数组。现在如果有人有时间利用我的代码并且创建一个它的类,我理所当然地要感激得到它。

定义
  为了简化这个例子,我使用了四个独立的数组和一些额外的变量。代码可以被优化。这样可以很容易地显示想法和阅读代码。可以使用类更好的完成,但是我不能十分肯定是否能够把对象保存到session 里。有人想对此发表评论吗?

  我们还需要一个项目计数器。当然可以使用count() 命令来实现,我只不过认为它足够好,以便总能知道有多少的项目,并且它也为循环提供了一个好的计数器。

工作
  让我们假设在你的HTML页中有一个商品列表

ID Name Price
1 Mouse 25.00 add
2 Key 100.00 add
3 Car 5000.00 add
4 Game 25.00 add

向你的页面增加链接

  上面的'add'字段应该是一个链接,用来将商品放到迷你购物篮中。使用$PHP_SELF将这个链接指向它自已。然后向它增加商品信息。这里是商品1的例子。

add

  商品的名称能够包含空格,所以将它放在链接的最后。Get方法好象对这个很挑剔。

准备迷你购物篮

  为了代码重用,让我们创建一个额外的文件minibasket.inc。我使用.inc扩展名来标识我的包括文件。
使用这个外部文件的原因是,尽管你将使用session变量来传递给购物篮,代码仍然需要有效。这个文件将
包含显示迷你购物篮的代码,也包话增加项目的函数。实现它的最好的地方是将 命令放在你需要的地方。

minibasket.inc的逻辑

  花些时间考虑一下这个。迷你购物篮应该是个什么样子,它需要些什么特性?这里显示的迷你购物篮应
该看上去象这样:

# Name Price
1 Mouse 25.00
3 Game 75.00
Total 100.00

  你可以很容易的通过使用一个外部样式表格式化这个输出。可是,它不应该太大。这个迷你购物篮是一
个信息,然而它不应该成为你所显示页面的焦点。

  这个文件的逻辑非常简单。

检查是否需要增加一个新的项目。
如果true,增加项目
在加入中,它要检查复重的记录,通过更新数量和价格来更新存在的记录。
片段1。检查将要增加的新的项目

  这是一个正常的IF语句,用于检查$basket变量的值。

<?php

if ($basket!=""{
//向篮子中加入项目
}

?>

片段2。在浏览器中显示篮子

<?php

if ($ses_basket_items>;0){
// 如果在篮子中有项目
for ($basket_counter=0;$basket_counter<$ses_basket_items;$basket_counter++){
// 遍历篮子,打印出每一行
// 你当然可以用格表来格式化显示
// 需要通过格式化来显示价格的分值。如果没有格式化,则.00是不会显示出来的
$price=sprintf("%01.2f",$ses_basket_price[$basket_counter]);
$amount=$ses_basket_amount[$basket_counter];
$name=$ses_basket_name[$basket_counter];
echo "$amount $name $price";
echo "
\n";
}
} else {
// 在篮子中没有商品
// 设置项目计数为0,且清除所有的变量
// 这是一个清除处理。它防止人们得到旧的数组
$ses_basket_items=0;
unset($ses_basket_name);
unset($ses_basket_amount);
unset($ses_basket_price);
unset($ses_basket_id);
}

?>

  这段代码不会产生任何结果。项目还没有被填充,篮子总是空的,所以篮子不会被显示。那么让我们向这个篮子中加些项目吧。

片段3。创建新的篮子并向其中增加一条项目

<?php

// 将项目计数设为1
$ses_basket_items=1;

// 填充4个数组的第0个位置,使用从href链接传过来的值
// 链接是在‘给你的页面增加链接’部分所讲的
$ses_basket_name[0]=$basket;
$ses_basket_amount[0]=1;
$ses_basket_price[0]=$price;
$ses_basket_id[0]=$id;

// 在session中注册新的篮子
session_register("ses_basket_items";
session_register("ses_basket_name";
session_register("ses_basket_amount";
session_register("ses_basket_price";
session_register("ses_basket_id";

?>

  这样将创建一个篮子,将所以的值填在数组第0个位置上,并利用session注册数组。一个篮子诞生了。


片段4。填充篮子

<?php

$basket_position_counter=0; //篮子中的位置
$double=0; //双重入口标志设为NO
if ($ses_basket_items>;0){
// 检查是否篮子包含的项目中有双重入口
foreach ($ses_basket_name as $basket_item){
// 遍历数组所包含的名字,检查是否与从href所传来的相配匹
if ($basket_item==$basket){
// 如果在篮子中已经有了一个项目,将flag设为1
$double=1;
// 记住项目的位置,将进行更新
$basket_position=$basket_position_counter;
}
$basket_position_counter++; //增加篮子中的实际位置
}
}

// 更新篮子
if ($double==1){
// 如果项目在你的篮子中已经存在则更新在$basket_position处理的数量和位置
$oldamount=$ses_basket_amount[$basket_position];
$ses_basket_amount[$basket_position]++;
$amount=$ses_basket_amount[$basket_position];
$oldprice=$ses_basket_price[$basket_position];
//更新价格
$newprice=($oldprice/$oldamount)*$amount;
$ses_basket_price[$basket_position]=$newprice;
}else{
// 如果它不在你的篮子中,则在数组末尾增加新的项目
$ses_basket_name[]=$basket;
$ses_basket_amount[]=1;
$ses_basket_price[]=$price;
$ses_basket_id[]=$id;
$ses_basket_items++;
}

?>

  太好了,现在你可以填充迷你购物篮并显示它了。

将代码片断组织到一起

  让我们将代码组织到一起并且存为minibasket.inc。

<?php

// 记住在代码片段1中, 决定是不是要增加?
// 让我们在这里重复它
if ($basket!=""{
// 在这里,项目将要加到篮中。让我们检查一下是否存在一个注册过的篮子
if (session_is_registered("ses_basket_items"){
// 存在一个注册过的篮子,将代码片段4放在这里。
// 它增加项目到注册过的篮子中,检查重复记录,更新它们或在数组的最后增加项目
} else {
// 不存在注册过的篮子,将代码片段3放在这里。它创建一个新的篮子,并且
// 通过session注册它。
}
}
// 剩下的都是代码片段2。如果篮子中有物品时用于显示它们。
// 加到这里。

?>

  瞧,不错吧。"c'est tout", 法国人会这样说。如果都做好了,你可以保存这个文件为minibasket.inc 并且将其包括到显示商品的PHP页面中。

Zip格式的minibasket.inc和basket.php
作者: HonestQiao    时间: 2005-09-11 10:00
标题: [代码 推荐] 整理了一些网上的代码一是自己用,也提供大家共享!
检查输入数据合法性的类 的详细信息
发表时间: 2005.09.11 发布人/作者:

<?php
// ========================== 文件说明 ==========================//
// 文件名 :    check.php
// 本文件说明:数据合法性检查类
// 本文件主要作者 : RainX
// Homepage:     http://www.amphp.com      
// -------------------------------------------------------------//
//                      V 3.0.0.1            
// Copyright (C) Aptitude Manager PHP Team All Rights Reserved.
// =============================================================//

///////////////////////////////////////////////////////////////
class check{
        
       var $maxlength;              //最大长度
       var $minlength;           //最少长度



//////////////////////////////////////////////////////////////////////
//未判断非法字符
//////////////////////////////////////////////////////////////////////
function string($string = array ())
{
       if (empty($string[text]))
       {
               echo"传入数据为空或未正确传入数据";
               return false;
       }
       if (empty($string[maxlength]))
       {
               echo"传入长度数据为空或未正确传入长度数据";
               return false;
       }
        if (empty($string[minlength]))
       {
               $string[minlength] == 1;
       }
       $string[length] = intval($string[length]);
       if(strlen($string[text])>;$maxlength)
       {
               echo"".$string[text]."字符长度太长";
               return false;
       }
       if(strlen($string[text])<$minlength)
       {
               echo"".$string[text]."字符长度太短";
               return false;
       }


}


function email($string = array())
{
       if (empty($string[email]))
       {
               echo"传入email数据为空或未正确传入数据";
               return false;
       }
       if (empty($$string[length]))
       {
               echo"传入email长度数据为空或未正确传入长度数据";
               return false;
       }
        if(!trim($string[email])==""
       {
               if(strlen($string[email])>;100)
               {
                       $result.="Email 地址过长<br>;";
                       return $result;
               }
               if(!eregi("^[_.0-9a-z-]+@([0-9a-z][0-9a-z-]+.)+[a-z]{2,3}$",$email))
               {
                       $result.="Email 格式不正确<br>;";
                       return $result;
               }
       }
       return true;
}

#######################################################################################
#如果想做详细检查,请参阅php手册有关于is_int,is_float,is_numric
#######################################################################################
function number($string = array())
{
       if (empty($string[num]))
       {
            echo"传入number数据为空或未正确传入数据";
            return false;
       }
       if (empty($string[maxlength]))
       {
           $string[maxlength] = 19;
       }
       if (empty($string[minlength]))
       {
            $string[minlength] = 1;
       }
       if (empty($string[alarm]))
       {
          $string[alarm] = "输入".$string."必须全是数字";
       }

       $string == (string)$string;
       if($string[format] == 'int')
       {
           if($string!=intval($string))   
           {
               echo "$string[alarm]";
               return false;
           }
       }
       else
       {
           if($string!=is_numeric($string))   
           {
               echo "$string[alarm]";
               return false;
           }
       }
       return true;
}



}
?>;
作者: HonestQiao    时间: 2005-09-11 10:01
标题: [代码 推荐] 整理了一些网上的代码一是自己用,也提供大家共享!
令你的网站获得任意GooglePR值的方法 的详细信息
发表时间: 2005.09.11 发布人/作者:

令你的网站获得任意Google PR值的方法
[ 繁体中文/BIG5 ] [ 简体中文/GB ]

在你网站的首页顶部加上以下代码(PHP代码)
在Location: 后面填上一个任意PR值的网址,如 Google.com 就是 10, msn.com 就是 9 了,只要选对网址,哪N(7<N<30)天后,你的网站就会显示相应的PR值了
<?php
if (preg_match("#(google)#si", $_SERVER['HTTP_USER_AGENT']))
{
header("HTTP/1.1 301 Moved Permanently"
header("Location:http://www.google.com/"
exit();
}
?>;
作者: HonestQiao    时间: 2005-09-11 10:01
标题: [代码 推荐] 整理了一些网上的代码一是自己用,也提供大家共享!
php中数据的批量导入(csv文件) 的详细信息
发表时间: 2005.09.11 发布人/作者:

有时写程序时后台要求把大量数据导入数据库中,比如计算机考试成绩的查询、电话簿的数据等一般都是存放在excel中的,这时我们可把数据导出成csv文件,然后通过以下程序即可在后台批量导入数据到数据库中。
  下面只是主要程序部分:

<?php
/*****************************************
**********作者:冲星/arcow****************
**********njj@nuc.edu.cn*******************
**********php导入csv文件到数据库**********
**********同时计算程序执行时间***********
**********www.knowsky.com***********
****************************************/
//定义获取时间函数
function getmicrotime(){
    list($usec, $sec) = explode(" ",microtime());
    return ((float)$usec + (float)$sec);
}
?>;

<?php
$time_start = getmicrotime();
include("db.inc.php";//连接数据库
$db=new testcsv;
?>;
<?php
$handle = fopen ("test.csv","r";
$sql="insert into scores(idcard,names,num,sex,nation,score) values('";
while ($data = fgetcsv ($handle, 1000, ",") {
   $num = count ($data);
   for ($c=0; $c < $num; $c++) {
       if($c==$num-1){$sql=$sql.$data[$c]."')";break;}
       $sql=$sql.$data[$c]."','";
   }
print "<br>;";
echo $sql."<br>;";
$db->;query($sql);
echo "SQL语句执行成功!<br>;";
$sql="insert into scores(idcard,names,num,sex,nation,score) values('";
}
fclose ($handle);
$time_end = getmicrotime();
$time = $time_end - $time_start;
echo "程序执行时间:".$time."秒";
?>;
作者: HonestQiao    时间: 2005-09-11 10:02
标题: [代码 推荐] 整理了一些网上的代码一是自己用,也提供大家共享!
高质量缩略图的生成函数 的详细信息
发表时间: 2005.09.11 发布人/作者:

/**

* 可扩展的缩略图生成函数

* 在http://yodoo.com的论坛里可以获得最新版本(注册用户)

* 演示效果也请登录http://yodoo.com看看,该站所有的缩略图(jpg,png)都是使用该函数生成的

*

* 转载请保留完整信息

*

* @author Austin Chin <austinfay@hotmail.com>;

* @version $Revision: 1.7 $

*

*

* version

*

* + 表示增加的功能

* - 表示丢弃的功能

* C 表示修正的功能

* E 表示扩展了功能

*

* v1.5

* makeThumb($srcFile, $dstFile, $dstW, $dstH, $option=1)

*

* v1.6

* + 增加了剪切模式

* + $option 8: 宽度最佳缩放

* + $option 16: 高度最佳缩放

* makeThumb($srcFile, $dstFile, $dstW, $dstH, $option=1, $cutmode=0, $startX=0,

*     $startY=0)

*

* v1.7

* E 返回值改为数组,第一个元素是代码 0 表示正常, 其它位错误代码;第二个元素是错误描述。

* 错误代码:

* -1 源文件不存在。

* -2 不支持的图片输出函数

* -3 不支持的图片创建函数

* -4 HTTP头信息已经输出,无法向浏览器输出图片。

* -5 无法检测输出的图片类型

* + 增加函数 message2Image 可以把字符串输出成图片格式

*/





/**

* 可扩展的缩略图生成函数

*

* @param string $srcFile 源文件

* @param string $srcFile 目标文件

* @param int $dstW 目标图片的宽度(单位:像素)

* @param int $dstH 目标图片的高度(单位:像素)

* @param int $option 附加参数,可以相加使用,如1+2(或者 1|2)表示同时执行1和2的功能。

*      1: 默认,输出到指定文件 2: 图片内容输出到浏览器 4: 不保持图片比例

*      8:宽度最佳缩放 16:高度最佳缩放

* @param int $cutmode 剪切模式 0: 默认模式,剪切模式 1: 左或上 2: 中 3: 右或下

* @param int $startX 剪切的起始横坐标(像素)

* @param int $startY 剪切的起始纵坐标(像素)

* @return array return[0]=0: 正常; return[0] 为错误代码 return[1] string: 错误描述

*/

define(OP_TO_FILE, 1);              //输出到指定文件

define(OP_OUTPUT, 2);               //图片内容输出到浏览器

define(OP_NOT_KEEP_SCALE, 4);       //不保持图片比例, 即使用拉伸

define(OP_BEST_RESIZE_WIDTH, ;    //宽度最佳缩放

define(OP_BEST_RESIZE_HEIGHT, 16);  //高度最佳缩放



define(CM_DEFAULT,  0);             // 默认模式

define(CM_LEFT_OR_TOP,  1);         // 左或上

define(CM_MIDDLE,       2);         // 中

define(CM_RIGHT_OR_BOTTOM,  3);     // 右或下



function makeThumb($srcFile, $dstFile, $dstW, $dstH, $option=OP_TO_FILE,

    $cutmode=CM_DEFAULT, $startX=0, $startY=0) {



    $img_type = array(1=>;"gif", 2=>;"jpeg", 3=>;"png";

    $type_idx = array("gif"=>;1, "jpg"=>;2, "jpeg"=>;2, "jpe"=>;2, "png"=>;3);



    if (!file_exists($srcFile)) {

        return array(-1, "Source file not exists: $srcFile.";

    }



    $path_parts = @pathinfo($dstFile);

    $ext = strtolower ($path_parts["extension"]);

    if ($ext == "" {

        return array(-5, "Can't detect output image's type.";

    }

    $func_output = "image" . $img_type[$type_idx[$ext]];

    if (!function_exists ($func_output)) {

        return array(-2, "Function not exists for output:$func_output.";

    }



    $data = @GetImageSize($srcFile);

    $func_create = "imagecreatefrom" . $img_type[$data[2]];

    if (!function_exists ($func_create)) {

        return array(-3, "Function not exists for create:$func_create.";

    }



    $im = @$func_create($srcFile);



    $srcW = @ImageSX($im);

    $srcH = @ImageSY($im);

    $srcX = 0;

    $srcY = 0;

    $dstX = 0;

    $dstY = 0;

   



    if ($option & OP_BEST_RESIZE_WIDTH) {

        $dstH = round($dstW * $srcH / $srcW);

    }



    if ($option & OP_BEST_RESIZE_HEIGHT) {

        $dstW = round($dstH * $srcW / $srcH);

    }



    $fdstW = $dstW;

    $fdstH = $dstH;



    if ($cutmode != CM_DEFAULT) { // 剪切模式 1: 左或上 2: 中 3: 右或下

        $srcW -= $startX;

        $srcH -= $startY;

        if ($srcW*$dstH >; $srcH*$dstW) {

            $testW = round($dstW * $srcH / $dstH);

            $testH = $srcH;

        } else {

            $testH = round($dstH * $srcW / $dstW);

            $testW = $srcW;

        }

        switch ($cutmode) {

            case CM_LEFT_OR_TOP: $srcX = 0; $srcY = 0; break;

            case CM_MIDDLE: $srcX = round(($srcW - $testW) / 2);

                            $srcY = round(($srcH - $testH) / 2); break;

            case CM_RIGHT_OR_BOTTOM: $srcX = $srcW - $testW;

                                     $srcY = $srcH - $testH;

        }

        $srcW = $testW;

        $srcH = $testH;

        $srcX += $startX;

        $srcY += $startY;

    } else { // 原始缩放



        if (!($option & OP_NOT_KEEP_SCALE)) {

            // 以下代码计算新大小,并保持图片比例

            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;

            }

        

            $dstX=($dstX<0)?0dstX;

            $dstY=($dstX<0)?0dstY;

            $dstX=($dstX>;($dstW/2))?floor($dstW/2)dstX;

            $dstY=($dstY>;($dstH/2))?floor($dstH/s)dstY;

        }

    } /// end if ($cutmode != CM_DEFAULT) { // 剪切模式



    if( function_exists("imagecopyresampled" and

        function_exists("imagecreatetruecolor" ){

        $func_create = "imagecreatetruecolor";

        $func_resize = "imagecopyresampled";

    } else {

        $func_create = "imagecreate";

        $func_resize = "imagecopyresized";

    }



    $newim = @$func_create($dstW,$dstH);

    $black = @ImageColorAllocate($newim, 0,0,0);

    $back = @imagecolortransparent($newim, $black);

    @imagefilledrectangle($newim,0,0,$dstW,$dstH,$black);

    @$func_resize($newim,$im,$dstX,$dstY,$srcX,$srcY,$fdstW,$fdstH,$srcW,$srcH);



    if ($option & OP_TO_FILE) {

        @$func_output($newim,$dstFile);

    }



    if ($option & OP_OUTPUT) {

        if (function_exists("headers_sent") {

            if (headers_sent()) {

                return array(-4, "HTTP already sent, can't output image to browser.";

            }

        }

        header("Content-type: image/" . $img_type[$type_idx[$ext]]);

        @$func_output($newim);

    }



    @imagedestroy($im);

    @imagedestroy($newim);



    return array(0, "OK");

}
作者: gydoesit    时间: 2005-09-11 11:43
标题: [代码 推荐] 整理了一些网上的代码一是自己用,也提供大家共享!
版主在2楼说session ID是唯一的,几个人同时进就乱了???

不会吧,各是各的呀




欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2