在这里让我们一起学习,一起提高!

php生成缩略图的类 不指定

jed , 2009-5-11 13:14 , 代码编程 , 评论(0) , 阅读(2925) , Via 本站原创


<?php    
  
/**  
  * 功能:生成缩略图  
  * 作者:phpox  
  * 日期:Thu May 17 09:57:05 CST 2007  
  */  
  
class CreatMiniature    
{    
    //公共变量    
    var $srcFile="";        //原图    
    var $echoType;            //输出图片类型,link--不保存为文件;file--保存为文件    
    var $im="";                //临时变量    
    var $srcW="";            //原图宽    
    var $srcH="";            //原图高    
  
    //设置变量及初始化    
    function SetVar($srcFile,$echoType)    
    {    
        if (!file_exists($srcFile)){    
            echo '源图片文件不存在!';    
            exit();    
        }    
        $this->srcFile=$srcFile;    
        $this->echoType=$echoType;    
  
        $info = "";    
        $data = GetImageSize($this->srcFile,$info);    
        switch ($data[2])    
        {    
         case 1:    
           if(!function_exists("imagecreatefromgif")){    
            echo "你的GD库不能使用GIF格式的图片,请使用Jpeg或PNG格式!<a href='javascript:go(-1);'>返回</a>";    
            exit();    
           }    
           $this->im = ImageCreateFromGIF($this->srcFile);    
           break;    
        case 2:    
          if(!function_exists("imagecreatefromjpeg")){    
           echo "你的GD库不能使用jpeg格式的图片,请使用其它格式的图片!<a href='javascript:go(-1);'>返回</a>";    
           exit();    
          }    
          $this->im = ImageCreateFromJpeg($this->srcFile);        
          break;    
        case 3:    
          $this->im = ImageCreateFromPNG($this->srcFile);        
          break;    
      }    
      $this->srcW=ImageSX($this->im);    
      $this->srcH=ImageSY($this->im);    
    }    
        
    //生成扭曲型缩图    
    function Distortion($toFile,$toW,$toH)    
    {    
        $cImg=$this->CreatImage($this->im,$toW,$toH,0,0,0,0,$this->srcW,$this->srcH);    
        return $this->EchoImage($cImg,$toFile);    
        ImageDestroy($cImg);    
    }    
        
    //生成按比例缩放的缩图    
    function Prorate($toFile,$toW,$toH)    
    {    
        $toWH=$toW/$toH;    
        $srcWH=$this->srcW/$this->srcH;    
        if($toWH<=$srcWH)    
        {    
            $ftoW=$toW;    
            $ftoH=$ftoW*($this->srcH/$this->srcW);    
        }    
        else  
        {    
              $ftoH=$toH;    
              $ftoW=$ftoH*($this->srcW/$this->srcH);    
        }    
        if($this->srcW>$toW||$this->srcH>$toH)    
        {    
            $cImg=$this->CreatImage($this->im,$ftoW,$ftoH,0,0,0,0,$this->srcW,$this->srcH);    
            return $this->EchoImage($cImg,$toFile);    
            ImageDestroy($cImg);    
        }    
        else  
        {    
            $cImg=$this->CreatImage($this->im,$this->srcW,$this->srcH,0,0,0,0,$this->srcW,$this->srcH);    
            return $this->EchoImage($cImg,$toFile);    
            ImageDestroy($cImg);    
        }    
    }    
        
    //生成最小裁剪后的缩图    
    function Cut($toFile,$toW,$toH)    
    {    
          $toWH=$toW/$toH;    
          $srcWH=$this->srcW/$this->srcH;    
          if($toWH<=$srcWH)    
          {    
               $ctoH=$toH;    
               $ctoW=$ctoH*($this->srcW/$this->srcH);    
          }    
          else  
          {    
              $ctoW=$toW;    
              $ctoH=$ctoW*($this->srcH/$this->srcW);    
          }    
        $allImg=$this->CreatImage($this->im,$ctoW,$ctoH,0,0,0,0,$this->srcW,$this->srcH);    
        $cImg=$this->CreatImage($allImg,$toW,$toH,0,0,($ctoW-$toW)/2,($ctoH-$toH)/2,$toW,$toH);    
        return $this->EchoImage($cImg,$toFile);    
        ImageDestroy($cImg);    
        ImageDestroy($allImg);    
    }    
  
    //生成背景填充的缩图    
    function BackFill($toFile,$toW,$toH,$bk1=255,$bk2=255,$bk3=255)    
    {    
        $toWH=$toW/$toH;    
        $srcWH=$this->srcW/$this->srcH;    
        if($toWH<=$srcWH)    
        {    
            $ftoW=$toW;    
            $ftoH=$ftoW*($this->srcH/$this->srcW);    
        }    
        else  
        {    
              $ftoH=$toH;    
              $ftoW=$ftoH*($this->srcW/$this->srcH);    
        }    
        if(function_exists("imagecreatetruecolor"))    
        {    
            @$cImg=ImageCreateTrueColor($toW,$toH);    
            if(!$cImg)    
            {    
                $cImg=ImageCreate($toW,$toH);    
            }    
        }    
        else  
        {    
            $cImg=ImageCreate($toW,$toH);    
        }    
        $backcolor = imagecolorallocate($cImg, $bk1, $bk2, $bk3);        //填充的背景颜色    
        ImageFilledRectangle($cImg,0,0,$toW,$toH,$backcolor);    
        if($this->srcW>$toW||$this->srcH>$toH)    
        {        
            $proImg=$this->CreatImage($this->im,$ftoW,$ftoH,0,0,0,0,$this->srcW,$this->srcH);    
             if($ftoW<$toW)    
             {    
                 ImageCopy($cImg,$proImg,($toW-$ftoW)/2,0,0,0,$ftoW,$ftoH);    
             }    
             else if($ftoH<$toH)    
             {    
                 ImageCopy($cImg,$proImg,0,($toH-$ftoH)/2,0,0,$ftoW,$ftoH);    
             }    
             else  
             {    
                 ImageCopy($cImg,$proImg,0,0,0,0,$ftoW,$ftoH);    
             }    
        }    
        else  
        {    
             ImageCopyMerge($cImg,$this->im,($toW-$ftoW)/2,($toH-$ftoH)/2,0,0,$ftoW,$ftoH,100);    
        }    
        return $this->EchoImage($cImg,$toFile);    
        ImageDestroy($cImg);    
    }    
        
  
    function CreatImage($img,$creatW,$creatH,$dstX,$dstY,$srcX,$srcY,$srcImgW,$srcImgH)    
    {    
        if(function_exists("imagecreatetruecolor"))    
        {    
            @$creatImg = ImageCreateTrueColor($creatW,$creatH);    
            if($creatImg)    
                ImageCopyResampled($creatImg,$img,$dstX,$dstY,$srcX,$srcY,$creatW,$creatH,$srcImgW,$srcImgH);    
            else  
            {    
                $creatImg=ImageCreate($creatW,$creatH);    
                ImageCopyResized($creatImg,$img,$dstX,$dstY,$srcX,$srcY,$creatW,$creatH,$srcImgW,$srcImgH);    
            }    
         }    
         else  
         {    
            $creatImg=ImageCreate($creatW,$creatH);    
            ImageCopyResized($creatImg,$img,$dstX,$dstY,$srcX,$srcY,$creatW,$creatH,$srcImgW,$srcImgH);    
         }    
         return $creatImg;    
    }    
        
    //输出图片,link---只输出,不保存文件。file--保存为文件    
    function EchoImage($img,$to_File)    
    {    
        switch($this->echoType)    
        {    
            case "link":    
                if(function_exists('imagejpeg')) return ImageJpeg($img);    
                else return ImagePNG($img);    
                break;    
            case "file":    
                if(function_exists('imagejpeg')) return ImageJpeg($img,$to_File);    
                else return ImagePNG($img,$to_File);    
                break;    
        }    
    }    
}    
?>  


Tags: ,

PHP5之完全SESSION篇 不指定

jed , 2009-5-4 14:24 , 代码编程 , 评论(0) , 阅读(4707) , Via 本站原创
1、什么是session?

Session的中文译名叫做"会话",其本来的含义是指有始有终的一系列动作/消息,比如打电话时从拿起电话拨号到挂断电话这中间的一系列过程可以称之为一个session。目前社会上对session的理解非常混乱:有时候我们可以看到这样的话"在一个浏览器会话期间,...",这里的会话是指从一个浏览器窗口打开到关闭这个期间; 也可以看到"用户(客户端)在一次会话期间"这样一句话,它可能指用户的一系列动作(一般情况下是同某个具体目的相关的一系列动作,比如从登录到选购商品到结账登出这样一个网上购物的过程;然而有时候也可能仅仅是指一次连接;其中的差别只能靠上下文来推断了。

然而当session一词与网络协议相关联时,它又往往隐含了"面向连接"和/或"保持状态"这样两个含义,"面向连接"指的是在通信双方在通信之前要先建立一个通信的渠道,比如打电话,直到对方接了电话通信才能开始。"保持状态"则是指通信的一方能够把一系列的消息关联起来,使得消息之间可以互相依赖,比如一个服务员能够认出再次光临的老顾客并且记得上次这个顾客还欠店里一块钱。这一类的例子有"一个TCP session"或者"一个POP3 session"。

鉴于这种混乱已不可改变,要为session下个定义就很难有统一的标准。而在阅读session相关资料时,我们也只有靠上下文来推断理解了。不过我们可以这样理解:例如我们打电话,从拨通的那一刻起到挂断电话期间,因为电话一直保持着接通的状态,所以把这种接通的状态叫做session。它是访客与整个网站交互过程中一直存在的公有变量,在客户端不支持COOKIE的时候,为了保证数据正确、安全,就采用SESSION变量。访问网站的来客会被分配一个唯一的标识符,即所谓的会话 ID。它要么存放在客户端的 cookie,要么经由 URL 传递。

SESSION的发明填补了HTTP协议的局限:HTTP协议被认为是无状态协议,无法得知用户的浏览状态,当它在服务端完成响应之后,服务器就失去了与该浏览器的联系。这与HTTP协议本来的目的是相符的,客户端只需要简单的向服务器请求下载某些文件,无论是客户端还是服务器都没有必要纪录彼此过去的行为,每一次请求之间都是独立的,好比一个顾客和一个自动售货机或者一个普通的(非会员制)大卖场之间的关系一样。

因此通过SESSION(cookie是另外一种解决办法)记录用户的有关信息,以供用户再次以此身份对web服务器提起请求时作确认。会话的发明使得一个用户在多个页面间切换时能够保存他的信息。网站编程人员都有这样的体会,每一页中的变量是不能在下一页中使用的(虽然form,url也可以实现,但这都是非常不理想的办法),而SESSION中注册的变量就可以作为全局变量使用了。

那么SESSION到底有什么用处呢?网上购物时大家都用过购物车,你可以随时把你选购的商品加入到购物车中,最后再去收银台结帐。在整个过程中购物车一直扮演着临时存贮被选商品的角色,用它追踪用户在网站上的活动情况,这就是SESSION的作用,它可以用于用户身份认证,程序状态记录,页面之间参数传递等。

SESSION的实现中采用COOKIE技术,SESSION会在客户端保存一个包含session_id(SESSION编号)的COOKIE;在服务器端保存其他session变量,比如session_name等等。当用户请求服务器时也把session_id一起发送到服务器,通过session_id提取所保存在服务器端的变量,就能识别用户是谁了。同时也不难理解为什么SESSION有时会失效了。

当客户端禁用COOKIE时(点击IE中的"工具"—"Internet选项",在弹出的对话框里点击"安全"—"自定义级别"项,将"允许每个对话COOKIE"设为禁用),session_id将无法传递,此时SESSION失效。不过php5在linux/unix平台可以自动检查cookie状态,如果客户端设置了禁用,则系统自动把session_id附加到url上传递。windows主机则无此功能。

2、Session常见函数及用法

● 开始一个会话

Session_start()
开始一个会话或者返回已经存在的会话。
说明:这个函数没有参数,且返回值均为true。如果你使用基于cookie的session(cookie-based sessions),那么在使用Session_start()之前浏览器不能有任何输出,否则会发生以下错误:



Warning: Cannot send session cache limiter - headers already sent (output started at /usr/local/apache/htdocs/cga/member/1.php:2)


你可以在php.ini里启动session.auto_start=1,这样就无需每次使用session之前都要调用session_start()。但启用该选项也有一些限制,如果确实启用了 session.auto_start,则不能将对象放入会话中,因为类定义必须在启动会话之前加载以在会话中重建对象。

请求结束后所有注册的变量都会被序列化。已注册但未定义的变量被标记为未定义。在之后的访问中这些变量也未被会话模块定义,除非用户以后定义它们。

警告: 有些类型的数据不能被序列化因此也就不能保存在会话中。包括 resource 变量或者有循环引用的对象(即某对象将一个指向自己的引用传递给另一个对象)。

● 注册SESSION变量

PHP5使用$_SESSION['xxx']=xxx注册SESSION全局变量。和GET,POST,COOKIE的使用方法相似。
注意:session_register(),session_unregister ,session_is_registered在php5下不再使用,除非在php.ini里把register_globle设为on,不过出于安全考虑,强烈建议关闭register_globle。HTTP_SESSION_VARS也不提倡使用了,官方建议用$_SESSION代替之。例如:
Page1.php





<?php    
Session_start(); //使用SESSION前必须调用该函数。    
$_SESSION['name']="我是黑旋风李逵!"; //注册一个SESSION变量    
$_SESSION['passwd']="mynameislikui";    
$_SESSION['time']=time();    
echo '<br /><a href="page2.php">通过COOKIE传递SESSION</a>'; //如果客户端支持cookie,可通过该链接传递session到下一页。    
echo '<br /><a href="page2.php?' . SID . '">通过URL传递SESSION</a>';//客户端不支持cookie时,使用该办法传递session.    
?>  


<?php
Session_start(); //使用SESSION前必须调用该函数。
$_SESSION['name']="我是黑旋风李逵!"; //注册一个SESSION变量
$_SESSION['passwd']="mynameislikui";
$_SESSION['time']=time();
echo '<br /><a href="page2.php">通过COOKIE传递SESSION</a>'; //如果客户端支持cookie,可通过该链接传递session到下一页。
echo '<br /><a href="page2.php?' . SID . '">通过URL传递SESSION</a>';//客户端不支持cookie时,使用该办法传递session.
?>

Page2.php


<?php    
session_start();    
echo $_SESSION['name']; //    
echo $_SESSION['passwd']; //    
echo date('Y m d H:i:s', $_SESSION['time']);    
echo '<br /><a href="page1.php">返回山一页</a>';    
?>  


<?php
session_start();
echo $_SESSION['name']; //
echo $_SESSION['passwd']; //
echo date('Y m d H:i:s', $_SESSION['time']);
echo '<br /><a href="page1.php">返回山一页</a>';
?>

有两种方法传递一个会话 ID:cookie 和 URL 参数。会话模块支持这两种方法。cookie 更优化,但由于不总是可用,也提供替代的方法。第二种方法直接将会话 ID 嵌入到 URL 中间去。

PHP 可以透明地转换连接。除非是使用 PHP 4.2 或更新版本,需要手工在编译 PHP 时激活。在 Unix 下,用 --enable-trans-sid 配置选项。如果此配置选项和运行时选项 session.use_trans_sid 都被激活(修改php.ini),相对 URI 将被自动修改为包含会话 ID。

● session_id

session_id() 用于设定或取得当前session_id。php5中既可以使用session_id(),也可以通过附加在url上的SID取得当前会话的session_id和session_name。

如果session_id()有具体指定值的话,将取代当前的session_id值。使用该函数前必须启动会话:session_start();

当我们使用session cookies时,如果指定了一个session_id()值,每次启动session_start()都会往客户端发送一个cookie值。不论当前session_id是否与指定值相等。

session_id()如果没有指定值,则返回当前session_id();当前会话没有启动的话,则返回空字符串。

● 检查session是否存在?

在以往的php版本中通常使用session_is_register()检查session是否存在,如果您使用$_SESSION['XXX']=XXX来注册会话变量,则session_is_register()函数不再起作用。你可以使用isset($_SESSION['xxx'])来替代。

● 更改session_id

session_regenerate_id() 更改成功则返回true,失败则返回false。

使用该函数可以为当前session更改session_id,但不改变当前session的其他信息。例如:




<?php    
session_start();    
$old_sessionid = session_id();    
session_regenerate_id();    
$new_sessionid = session_id();    
echo "原始 SessionID: $old_sessionid<br />";    
echo "新的 SessionID: $new_sessionid<br />";    
echo"<pre>";    
print_r($_SESSION);    
echo"</pre>";    
?>  



<?php
session_start();
$old_sessionid = session_id();
session_regenerate_id();
$new_sessionid = session_id();
echo "原始 SessionID: $old_sessionid<br />";
echo "新的 SessionID: $new_sessionid<br />";
echo"<pre>";
print_r($_SESSION);
echo"</pre>";
?>


● session_name() 返回当前session的name或改变当前session的name。

如果要改变当前session的name,必须在session_start()之前调用该函数。注意:session_name不能只由数字组成,它至少包含一个字母。否则会在每时每刻都生成一个新的session id.
session改名示例:





<?php    
$previous_name = session_name("WebsiteID");    
echo "新的session名为: $previous_name<br />";    
?>  



<?php
$previous_name = session_name("WebsiteID");
echo "新的session名为: $previous_name<br />";
?>

● 如何删除session?

1、unset ($_SESSION['xxx']) 删除单个session,unset($_SESSION['xxx']) 用来unregister一个已注册的session变量。其作用和session_unregister()相同。session_unregister()在PHP5中不再使用,可将之打入冷宫。

unset($_SESSION) 此函数千万不可使用,它会将全局变量$_SESSION销毁,而且还没有可行的办法将其恢复。用户也不再可以注册$_SESSION变量。

2、$_SESSION=array() 删除多个session。

3、session_destroy()结束当前的会话,并清空会话中的所有资源。。该函数不会unset(释放)和当前session相关的全局变量(globalvariables),也不会删除客户端的session cookie.PHP默认的session是基于cookie的,如果要删除cookie的话,必须借助setcookie()函数。
返回值:布尔值。
功能说明:这个函数结束当前的session,此函数没有参数,且返回值均为true。

session_unset() 如果使用了$_SESSION,则该函数不再起作用。由于PHP5必定要使用$_SESSION,所以此函数可以打入冷宫了。

下面是PHP官方关于删除session的案例:





<?php    
// 初始化session.    
session_start();    
/*** 删除所有的session变量..也可用unset($_SESSION[xxx])逐个删除。****/    
$_SESSION = array();    
/***删除sessin id.由于session默认是基于cookie的,所以使用setcookie删除包含session id的cookie.***/    
if (isset($_COOKIE[session_name()])) {    
setcookie(session_name(), '', time()-42000, '/');    
}    
// 最后彻底销毁session.    
session_destroy();    
?>  



<?php
// 初始化session.
session_start();
/*** 删除所有的session变量..也可用unset($_SESSION[xxx])逐个删除。****/
$_SESSION = array();
/***删除sessin id.由于session默认是基于cookie的,所以使用setcookie删除包含session id的cookie.***/
if (isset($_COOKIE[session_name()])) {
setcookie(session_name(), '', time()-42000, '/');
}
// 最后彻底销毁session.
session_destroy();
?>


由此我们可以得出删除Session的步骤:
①session_start()
②$_SESSION=array()/unset($_SESSION['xxx'])
③session_destroy()

● SESSION安全

会话模块不能保证存放在会话中的信息只能被创建该会话的用户看到。根据其存放的数据,还需要采取更多措施来主动保护会话的完整性。
评估会话中携带的数据并实施附加保护措施通常要付出代价,降低用户的方便程度。例如,如果要保护用户免于受简单的社交策略侵害(注:指在 URL 中显示的会话 ID 会被别人在电脑屏幕上看到,或被别的网站通过 HTTP Referer 得到等),则应该启用 session.use_only_cookies。此情形下,客户端必须无条件启用 cookie,否则会话就不工作。

有几种途径会将现有的会话 ID 泄露给第三方。泄露出的会话 ID 使第三方能够访问所有与指定 ID 相关联的资源。第一,URL 携带会话 ID。如果连接到外部站点,包含有会话 ID 的 URL 可能会被存在外部站点的 Referer 日志中。第二,较主动的攻击者可能会侦听网段的数据包。如果未加密,会话 ID 会以明文方式在网络中流过。对此的解决方式是在服务器上实施 SSL 并强制用户使用。

默认情况下,所有与特定会话相关的数据都被存储在由 INI 选项 session.save_path 指定的目录下的一个文件中。对每个会话会建立一个文件(不论是否有数据与该会话相关)。这是由于每打开一个会话即建立一个文件,不论是否有数据写入到该文件中。注意由于和文件系统协同工作的限制,此行为有个副作用,有可能造成用户定制的会话处理器(例如用数据库)丢失了未存储数据的会话。

session_encode
函数功能:sesssion信息编码
函数原型:string session_encode(void);
返回值:字符串
功能说明:返回的字符串中包含全局变量中各变量的名称与值,形式如:a|s:12:"it is a test\";c|s:4:"lala"; a是变量名 s:12代表变量a的值"it is a test的长度是12 变量间用分号";"分隔。


session_decode
函数功能:sesssion信息解码
函数原型:boolean session_decode (string data)
返回值:布尔值
功能说明:这个函数可将session信息解码,成功则返回逻辑值true

Php5不再使用session_id,而是把它变成一个常量SID,并保存在cookie中。如果客户端禁用了cookie,php会自动通过url自动传动传递SID,其条件是设置php.ini中的session.use_trans_sid = 1。此时即使客户端即使禁用了cookie也没关系了。
用 strip_tags() 来输出 SID 以避免 XSS 相关的攻击。

Session跨页传递问题

session跨页传递需要考虑三种情况:
①客户端禁用了cookie。
②浏览器出现问题,暂时无法存取cookie
③php.ini中的session.use_trans_sid = 0或者编译时没有打开--enable-trans-sid选项

为什么会这样呢?下面解释一下原因:
Session文件分为两部分:session变量保存在服务器端(默认以文件方式存储session);而session id则以cookie形式保存在客户端。(注意:session默认是基于cookie的)。

当用户的浏览器向服务器提出请求时,同时发送包含session id的cookie(默认情况下)。服务器根据客户端提供的session id来得到用户的文件,即保存在服务器端的session变量值。事实上,session id可以使用客户端的Cookie或者Http1.1协议的Query_String(就是访问的URL的"?"后面的部分)来传送给服务器,然后服务器读取Session的目录……。也就是说,session id是取得存储在服务上的session变量的身份证。当代码session_start();运行的时候,就在服务器上产生了一个session文件,随之也产生了与之唯一对应的一个session id,定义session变量以一定形式存储在刚才产生的session文件中。通过session id,可以取出定义的变量。跨页后,为了使用session,你必须又执行session_start();将又会产生一个session文件,与之对应产生相应的session id,用这个session id是取不出前面提到的第一个session文件中的变量的,因为这个session id不是打开它的"钥匙"。如果在session_start();之前加代码session_id($session id);将不产生新的session文件,直接读取与这个id对应的session文件。

PHP中的session在默认情况下是使用客户端的Cookie来保存session id的,所以当客户端的cookie出现问题的时候就会影响session了。必须注意的是:session不一定必须依赖cookie,这也是session相比cookie的高明之处。当客户端的Cookie被禁用或出现问题时,PHP会自动把session id附着在URL中,这样再通过session id就能跨页使用session变量了。但这种附着也是有一定条件的,其一:"php.ini中的session.use_trans_sid = 1或者编译时打开打开了--enable-trans-sid选项";其二:运行PHP的服务器必须是unix/linux系统,windows不具备此项功能。

明白了以上的道理,我们就可以得出解决session跨页传递问题的三条途径:
1、设置php.ini中的session.use_trans_sid = 1或者编译时打开打开了--enable-trans-sid选项,让PHP自动跨页传递session id。
2、手动通过URL传值、隐藏表单传递session id。
3、用文件、数据库等形式保存session_id,在跨页过程中手动调用。

下面举例说明。

第一种途径:
page1.php





<?php    
session_start();    
$_SESSION['var1']="中华人民共和国";    
$url="<a href="."\"s2.php\">下一页</a>";    
echo $url;    
?>    



page2.php    
<?php    
session_start();    
echo "传递的session变量var1的值为:".$_SESSION['var1'];    
?>  



<?php
session_start();
$_SESSION['var1']="中华人民共和国";
$url="<a href="."\"s2.php\">下一页</a>";
echo $url;
?>

page2.php


<?php
session_start();
echo "传递的session变量var1的值为:".$_SESSION['var1'];
?>


运行以上代码,在客户端cookie正常的情况下,应该可以在得到结果"中华人民共和国"。

现在你手动关闭客户端的cookie,再运行,可能得不到结果了吧。如果得不到结果,再"设置php.ini中的session.use_trans_sid = 1或者编译时打开打开了--enable-trans-sid选项",又得到结果"中华人民共和国"。

第二种途径:
s1.php





<?php    
session_start();    
$_SESSION['var1']="中华人民共和国";    
$sn = session_id();    
$url="<a href="."\"s2.php?s=".$sn."\">下一页</a>"; //PHP5定义了一个常量SID来表示session_id(),$url还可以写成$url='<a href="page2.php?' . SID . '">下一页</a>';    
echo $url;    
?>  




<?php
session_start();
$_SESSION['var1']="中华人民共和国";
$sn = session_id();
$url="<a href="."\"s2.php?s=".$sn."\">下一页</a>"; //PHP5定义了一个常量SID来表示session_id(),$url还可以写成$url='<a href="page2.php?' . SID . '">下一页</a>';
echo $url;
?>

s2.php



<?php    
session_id($_GET['s']);    
session_start();    
echo "传递的session变量var1的值为:".$_SESSION['var1'];    
?>  



<?php
session_id($_GET['s']);
session_start();
echo "传递的session变量var1的值为:".$_SESSION['var1'];
?>

第三种途径:
login.html




<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">    
<html>    
<head>    
<title>Login</title>    
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">    
</head>    
<body>  
请登录:  
<form name="login" method="post" action="mylogin1.php">    
用户名:<input type="text" name="name"><br>    
口 令:<input type="password" name="pass"><br>    
<input type="submit" value="登录">    
</form>    
</body>    
</html>  


<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>

<title>Login</title>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
</head>
<body>
请登录:
<form name="login" method="post" action="mylogin1.php">
用户名:<input type="text" name="name"><br>
口 令:<input type="password" name="pass"><br>
<input type="submit" value="登录">
</form>
</body>
</html>

mylogin1.php

<?php    
$name=$_POST['name'];    
$pass=$_POST['pass'];    
if(!$name || !$pass) {    
echo "用户名或密码为空,请<a href=\"login.html\">重新登录</a>";    
die();    
}    
if (!($name=="laogong" && $pass=="123")) {    
echo "用户名或密码不正确,请<a href=\"login.html\">重新登录</a>";    
die();    
}    
//注册用户    
ob_start();    
session_start();    
$_SESSION['user']= $name;    
$psid=session_id();    
$fp=fopen("e:\\tmp\\phpsid.txt","w+");    
fwrite($fp,$psid);    
fclose($fp);    
//身份验证成功,进行相关操作    
echo "已登录<br>";    
echo "<a href=\"mylogin2.php\">下一页</a>";    
?>  


<?php
$name=$_POST['name'];
$pass=$_POST['pass'];
if(!$name || !$pass) {
echo "用户名或密码为空,请<a href=\"login.html\">重新登录</a>";
die();
}
if (!($name=="laogong" && $pass=="123")) {
echo "用户名或密码不正确,请<a href=\"login.html\">重新登录</a>";
die();
}
//注册用户
ob_start();
session_start();
$_SESSION['user']= $name;
$psid=session_id();
$fp=fopen("e:\\tmp\\phpsid.txt","w+");
fwrite($fp,$psid);
fclose($fp);
//身份验证成功,进行相关操作
echo "已登录<br>";
echo "<a href=\"mylogin2.php\">下一页</a>";
?>





mylogin2.php

<?php    
$fp=fopen("e:\\tmp\\phpsid.txt","r");    
$sid=fread($fp,1024);    
fclose($fp);    
session_id($sid);    
session_start();    
if(isset($_SESSION['user']) && $_SESSION['user']="laogong" ) {    
echo "已登录!";    
}    
else {    
//成功登录进行相关操作    
echo "未登录,无权访问";    
echo "请<a href=\"login.html\">登录</a>后浏览";    
die();    
}    
?>  
Tags: , ,
大家都使用过google或者xunlei的搜索,输入关键字后可以出现相关提示,是个不错的功能,今天就在这里给大家把我的拙作给大家分享

点击在新窗口中浏览此图片

程序下载:
下载文件 (已下载 865 次)



数据库表:
要支持扩展,编译了好几次,也许是版本匹配的问题,
最后终于编译成功了:
把关键部分写一下:
mkdir /usr/local/modules


——————————————————————
开始编译:
tar -zxf zlib-1.2.3.tar.tar
ls
   cd zlib
  cd zlib-1.2.3
  ./configure --prefix=/usr/local/zlib
  make
  make install
   cd ..
————————————————————
  tar zxvf freetype-2.3.7.tar.gz
  cd freetype-2.3.7
ls
./configure --prefix=/usr/local/modules/freetype
  make
  make install
freetype编译完毕
——————————————————————
wget  http://prdownloads.sourceforge.net/png-mng/libpng-1.2.5.tar.gz?download
  tar zxvf libpng-1.2.5.tar.gz
  cd libpng-1.2.5
ls
cp scripts/makefile.linux makefile
cp scripts/makefile.linux makefile
make test
make install
——————————————————
cd ..
wget ftp://ftp.ro.debian.org/pub/mirrors/openwrt.org/sources/jpegsrc.v6b.tar.gz
tar -xzvf jpegsrc.v6b.tar.gz
  ls
cd jpeg-6b/
mkdir /usr/local/modules/jpeg6
mkdir /usr/local/modules/jpeg6/bin
  mkdir /usr/local/modules/jpeg6/lib
  mkdir /usr/local/modules/jpeg6/include
mkdir /usr/local/modules/jpeg6/man
mkdir /usr/local/modules/jpeg6/man/man1

./configure --prefix=/usr/local/modules/jpeg6 --enable-shared --enable-static
  make
  make install

————————————————————

cd ..
tar -xzvf gd-2.0.35.tar.gz
  cd gd-2.0.35
ls
  ./configure --prefix=/usr/local/modules/gd --with-jpeg=/usr/local/modules/jpeg6 --with-png --with-zlib --with-freetype=/usr/local/modules/freetype
  make
  make install
  cd ..

——————————————————
开始编译php:

tar -xzvf php-5.2.6.tar.gz
  cd php-5.2.6
  ./configure --prefix=/usr/local/php --with-apxs2=/usr/local/apache/bin/apxs --with-freetype-dir=/usr/local/modules/freetype/  --with-mysql=/usr/local/mysql  --with-zlib --with-libxml-dir=/usr/local/libxml --enable-shared --with-gd=/usr/local/modules/gd/ --with-jpeg-dir=/usr/local/modules/jpeg6/ --with-png-dir --enable-mbstring=all --with-mysqli=/usr/local/mysql/bin/mysql_config   --enable-gd-native-ttf
  make
  make test
  make install
———————————————————
编译完毕。
重启apache服务。
注:在编译的过程中,如果发现错误,什么目录没有,就mkdir建立。之后再编译。

看phpinfo是否支持你想要的模块,若没有再编译即可。
Tags: , , , ,
is_writeable() 函数判断指定的文件是否可写。

该函数是 is_writable() 函数的别名。

语法

is_writeable(file)

说明
如果文件存在并且可写则返回 true。file 参数可以是一个允许进行是否可写检查的目录名。



<?php
$file = "test.txt";
if(is_writeable($file))
  {
  echo ("$file is writeable");
  }
else
  {
  echo ("$file is not writeable");
  }
?>

Tags: ,
PHP 内置函数 file_put_contents 用于写入文件。

file_put_contents 函数最简单的写法,可以只用两个参数,一个是文件路径,一个是要写入的内容,语法如下:

file_put_contents(filepath,data)
如果文件不存在,file_put_contents 函数会自动创建文件;如果文件已存在,原有文件被重写。

你可以利用 file_put_contents 函数创建并写入一个新文件,或者重写一个原有文件。

下面是一个使用 file_put_contents 函数的 PHP 代码示例:

PHP获取当前url的函数 不指定

jed , 2009-3-20 16:50 , 代码编程 , 评论(0) , 阅读(4097) , Via 本站原创
预定义变量(一) $_SERVER (附:获取当前URL地址例子)
例:  我需要 获取当前的 的URL  地址
$url_this =  "http://".$_SERVER ['HTTP_HOST'].$_SERVER['PHP_SELF'];
echo $url_this;


则显示 :   http://localhost/lu.php


服务器变量:$_SERVER
注: 在 PHP 4.1.0 及以后版本使用。之前的版本,使用 $HTTP_SERVER_VARS。

$_SERVER 是一个包含诸如头部(headers)、路径(paths)和脚本位置(script locations)的数组。数组的实体由 web 服务器创建。不能保证所有的服务器都能产生所有的信息;服务器可能忽略了一些信息,或者产生了一些未在下面列出的新的信息。这意味着,大量的这些变量在 CGI 1.1 specification 中说明,所以您应该仔细研究它。

这是一个“superglobal”,或者可以描述为自动全局变量。这只不过意味这它在所有的脚本中都有效。在函数或方法中您不需要使用 global $_SERVER; 访问它,就如同使用 $HTTP_SERVER_VARS 一样。

$HTTP_SERVER_VARS 包含着同样的信息,但是不是一个自动全局变量。(注意: $HTTP_SERVER_VARS 和 $_SERVER 是不同的变量,PHP 处理它们的方式不同。)

如果设置了 register_globals 指令,这些变量也在所有脚本中可用;也就是,分离了 $_SERVER 和 $HTTP_SERVER_VARS 数组。相关信息,请参阅安全的相关章节 使用 Register Globals。这些单独的全局变量不是自动全局变量。

您或许会发现下面列出的某些 $_SERVER 元素并不可用。注意,如果以命令行方式运行 PHP,下面列出的元素几乎没有有效的(或是没有任何实际意义的)。


“PHP_SELF”
当前正在执行脚本的文件名,与 document root相关。举例来说,在URL地址为 http://example.com/test.php/foo.bar 的脚本中使用 $_SERVER['PHP_SELF'] 将会得到 /test.php/foo.bar 这个结果。

如果 PHP 以命令行方式运行,该变量无效。

“argv”
传递给该脚本的参数。当脚本运行在命令行方式时,argv 变量传递给程序 C 语言样式的命令行参数。当调用 GET 方法时,该变量包含请求的数据。

“argc”
包含传递给程序的命令行参数的个数(如果运行在命令行模式)。

“GATEWAY_INTERFACE”
服务器使用的 CGI 规范的版本。例如,“CGI/1.1”。

'SERVER_NAME'
当前运行脚本所在服务器主机的名称。如果该脚本运行在一个虚拟主机上,该名称是由那个虚拟主机所设置的值决定。

'SERVER_SOFTWARE'
服务器标识的字串,在响应请求时的头部中给出。

“SERVER_PROTOCOL”
请求页面时通信协议的名称和版本。例如,“HTTP/1.0”。

“REQUEST_METHOD”
访问页面时的请求方法。例如:“GET”、“HEAD”,“POST”,“PUT”。

“QUERY_STRING”
查询(query)的字符串。

“DOCUMENT_ROOT”
当前运行脚本所在的文档根目录。在服务器配置文件中定义。

“HTTP_ACCEPT”
当前请求的 Accept: 头部的内容。

“HTTP_ACCEPT_CHARSET”
当前请求的 Accept-Charset: 头部的内容。例如:“iso-8859-1,*,utf-8”。

“HTTP_ACCEPT_ENCODING”
当前请求的 Accept-Encoding: 头部的内容。例如:“gzip”。

“HTTP_ACCEPT_LANGUAGE”
当前请求的 Accept-Language: 头部的内容。例如:“en”。

“HTTP_CONNECTION”
当前请求的 Connection: 头部的内容。例如:“Keep-Alive”。

“HTTP_HOST”
当前请求的 Host: 头部的内容。

“HTTP_REFERER”
链接到当前页面的前一页面的 URL 地址。不是所有的用户代理(浏览器)都会设置这个变量,而且有的还可以手工修改 HTTP_REFERER。因此,这个变量不总是正确真实的。

“HTTP_USER_AGENT”
当前请求的 User_Agent: 头部的内容。该字符串表明了访问该页面的用户代理的信息。一个典型的例子是:Mozilla/4.5 [en] (X11; U; Linux 2.2.9 i586)。您也可以使用 get_browser() 得到这个信息。

“REMOTE_ADDR”
正在浏览当前页面用户的 IP 地址。

'REMOTE_HOST'
正在浏览当前页面用户的主机名。反向域名解析基于该用户的 REMOTE_ADDR。

注: 必须配置 Web 服务器来建立此变量。例如 Apache 需要在 httpd.conf 中有 HostnameLookups On。参见 gethostbyaddr()。

“REMOTE_PORT”
用户连接到服务器时所使用的端口。

“SCRIPT_FILENAME”
当前执行脚本的绝对路径名。

“SERVER_ADMIN”
该值指明了 Apache 服务器配置文件中的 SERVER_ADMIN 参数。如果脚本运行在一个虚拟主机上,则该值是那个虚拟主机的值。

“SERVER_PORT”
服务器所使用的端口。默认为“80”。如果你使用 SSL 安全连接,则这个值为您所设置的 HTTP 端口。

“SERVER_SIGNATURE”
包含服务器版本和虚拟主机名的字符串。

“PATH_TRANSLATED”
当前脚本所在文件系统(不是文档根目录)的基本路径。这是在服务器进行虚拟到真实路径的映像后的结果。

“SCRIPT_NAME”
包含当前脚本的路径。这在页面需要指向自己时非常有用。

“REQUEST_URI”
访问此页面所需的 URI。例如,“/index.html”。

“PHP_AUTH_USER”
当 PHP 运行在 Apache 模块方式下,并且正在使用 HTTP 认证功能,这个变量便是用户输入的用户名。

“PHP_AUTH_PW”
当 PHP 运行在 Apache 模块方式下,并且正在使用 HTTP 认证功能,这个变量便是用户输入的密码。

“AUTH_TYPE”
当 PHP 运行在 Apache 模块方式下,并且正在使用 HTTP 认证功能,这个变量便是认证的类型。



Tags: ,
   由于服务器的linux版本太低,apache+php+mysql版本都太低,初次学习linux经过三天除了吃饭睡觉终于把apache+php+mysql给升级了!现说下升级过程:

    一删除apache+php+mysql:

    判断是不是rpm安装如:rpm -q php 返回php版本,则是rpm安装,用 rpm -e php --nodeps 即可彻底删除系统自带的php

    如果不返回PHP版本则是二进制安装,直接删除目录就可以!同理apache mysql也一样!

    二安装apache

    下载httpd-2.2.4.tar.gz

    tar xzvf httpd-2.2.4.tar.gz
    cd httpd-2.2.4
    ./configure --prefix=/usr/local/apache2 --enable-so --enable-mods-shared=all --enable-cgi --enable-rewrite --enable-deflate --with-mpm=worker
    make
    make install

    三 安装mysql

    # chmod 755 mysql-5.0.45-linux-i686-glibc23.tar.gz //设置mysql-5.0.45-linux-i686-glibc23.tar.gz属性为755

php开发规范 不指定

jed , 2009-1-18 12:27 , 代码编程 , 评论(0) , 阅读(3154) , Via 本站原创
一、规范前言篇

标准化不是特殊的个人风格,它让程序员可以了解任何代码,弄清程序的状况;新人可
以很快的适应环境;防止新接触php的人一次次的犯同样的错误;在一致的开发环境下,
可以减少人们犯错的机会。本规范的标准在绝对多数应用上为仿照java技术体系,因为
java技术体系以其众多成功的案例成为大部分计算机应用层的工业标准,此外便于日后
公司向java技术体系转型。

二、命名定义篇

局部变量命名

使用英文名词、动词,以大写字母作为单词的分隔,其他的字母均使用小写,单词的
首个字母使用小写,不使用下划线,例:

$repeatCount = '';
$delUserSql  = '';

全局常量命名

使用英文名词、动词,所有字母都使用大写,以下划线分隔每个单词,例:
这些年来多从事Linux下PHP和C相关的开发,带过很多项目和团队,下面是根据经验整理的PHP编码规范,可以用作给大家的范例和参考,根据需要进行取舍和修改!

(可能最新的一些php5的规范不够完整,今后有机会保持更新!)

目录
1 编写目的
2 整体要求
3 安全规范
3.1 包含文件
3.1.1 命名规则
3.1.2 存放规则
3.2 安全规则
3.3 一些针对PHP的规则
3.4 其它处理规则
3.4.1 对输入参数值进行转义处理
3.4.2 操作大HTML文本
分页: 3/5 第一页 上页 1 2 3 4 5 下页 最后页 [ 显示模式: 摘要 | 列表 ]