燕之庐网站建设 - 优质网站设计公司

Posts Tagged ‘ThinkPhp’

ThinkPhp

2010/04/20

thinkphp session

Tags: ,

ThinkPHP官方的说明文档

  1. start 启 动session
  2. pause 暂停session
  3. clear 清除session
  4. destroy 销毁session
  5. get 获取session
  6. getLocal 获取私有session
  7. set 设置session
  8. setLocal 设置私有session
  9. name 获取或者设置session _name
  10. is_set 是否设置session
  11. is_setLocal 是否设置私有session
  12. id 获取或者设置session _id
  13. path 获取或者设置session _save_path
  14. setExpire 设置session 过期时间
  15. setCookieDomain 设置有效域名
  16. setCallback 设置Session 对象反序列化时候的回调函数

最常用的操作方法示例:

代码 :

// 检测Session变量是否存在
Session :: is_set ( ‘name’ );
// 给Session变量赋值
Session :: set ( ‘name’ , ‘value’ );
// 获取Session变量
Session :: get ( ‘name’ );

和Session相关的配置参数:

代码 :
‘SESSION_NAME’ => ‘ThinkID’ , // 默认Session_name
‘SESSION_PATH’ => , // 采用默认的Session save path
‘SESSION_TYPE’ => ‘File’ , // 默认Session类型 支持 DB 和 File
‘SESSION_EXPIRE’ => ‘300000′ , // 默认Session有效期
‘SESSION_TABLE’ => ‘think_session , // 数据库Session方式表名
‘SESSION_CALLBACK’ => , // 反序列化对象的回调方法

其中SESSION_NAME 参数需要注意,如果需要在不同的项目之间不共享传递Session的值,请设置不同的值,否则请保留相同的默认值。
如果设置了相同的SESSION_NAME的值,但是又希望创建基于项目的私有Session空间,应该怎么处理呢?ThinkPHP还支持以项目为 Session空间的私有Session操作,以之前的常用操作为例,我们更改如下:

代码 :
// 检测Session变量是否存在(当前项目有效)
Session :: is_setLocal ( ‘name’ );
// 给Session变量赋值(当前项目有效)
Session :: setLocal ( ‘name’ , ‘value’ );
// 获取Session变量(当前项目有效)

    Session :: getLocal ( ‘name’ );

这样,和全局的Session操作就不会冲突,可以用于一些特殊情况的需要。

ThinkPHP支持数据库方式的Session操作,设置SESSION_TYPE的值为DB就可以了,如果使用数据库方式,还要确保设置好 SESSION_TABLE的值,并且导入下面的DDL到你的数据库(以MySQL为例子):

代码 :
CREATE TABLE ` think_session ` (
` id ` int ( 11 ) unsigned NOT NULL auto_increment ,
`session _id ` varchar ( 255 ) NOT NULL ,
`session _expires ` int ( 11 ) NOT NULL ,
`session _data ` blob ,
PRIMARY KEY (` id `)
)

注意,Db Session方式的数据库连接会采用项目的数据库配置信息进行连接。除了数据库方式外,还可以增加其它方式的Session保存机制,例如内存方式、 Memcache方式等,我们只要增加相应的过滤器就行了,使用session _set_save_handler方法,具体的方法定义参考Think.Util.Filter下面的 FilterSessionDb.class.php 文件的实现。

制作了一个简单的登陆判断

登陆检测之后赋予Session值,使Session的值为非空即为假的 false

$_SESSION[C('USER_AUTH_KEY')] = $logInFind['id'] ;
其中[C('USER_AUTH_KEY')]为ThinkPHP的内置方法和函数类。在未配置config.php文件时默认为空
把$logInFind['id']取出的帐号值赋予它,默认为关闭页面Session就自动删除消失!

其它页面使用下面格式判断
if(!isset($_SESSION[C('USER_AUTH_KEY')])) {  //isset 是检测变量是否赋值!
$this->redirect(’Login’,'Login’); //转到注册页面
}

页面模版:

<if condition=”$_SESSION['login'] eq true”>
欢迎您!<span><a href=”__APP__/userindex”>{@UserIndex.username}</a></span>
<else/>
<a href=”__APP__/login/tologin.shtml”>登录</a> |     <a href=”__APP__/login/toreg.shtml”>注册</a>
</if>

php

2009/10/13

第六节–访问属性和方法 — Classes and Objects in PHP5 [6]

Tags: , ,

/*
——————————————————————————-
| = 本文为Haohappy读<<Core PHP Programming>>
| = 中Classes and Objects一章的笔记
| = 翻译为主 个人心得
| = 为避免可能发生的不必要的麻烦请勿转载,谢谢
| = 欢迎批评指正,希望和所有PHP爱好者共同进步!
| = PHP5研究中心: http://blog.csdn.net/haohappy2004
——————————————————————————-
*/

第六节–访问属性和方法

一个对象实例的属性是变量,就像PHP的其他变量一样. 但是你必须使用->运算符来引用它们. 不需要在属性前使用美元符$. 例如, 6.1中打印User对象的name属性那一行.

可以联用->,如果一个对象的属性包含了一个对象,你可以使用两个->运算符来得到内部对象的属性. 你甚至可以用双重引用的字符串来放置这些表达式. 看6.5中的例子,对象House中的属性room包含了一组Room对象.

访问方法和访问属性类似. ->运算符用来指向实例的方法. 在例子6.1中调用getLastLogin就是. 方法执行起来和类外的函数几乎相同.

如果一个类从另一类中继承而来,父类中的属性和方法将在子类中都有效,即使在子类中没有声明. 像以前提到过的,继承是非常强大的. 如果你想访问一个继承的属性,你只需要像访问基类自己的属性那样引用即可,使用::运算符.

<?php 

   class Room 

   { 

       public $name; 

       function __construct($name="unnamed") 

       { 

           $this->name = $name; 

       } 

   } 

   class House 

   { 

       //array of rooms 

       public $room; 

   } 

   //create empty house 

   $home = new house; 

   //add some rooms 

   $home->room[] = new Room("bedroom"); 

   $home->room[] = new Room("kitchen"); 

   $home->room[] = new Room("bathroom"); 

   //show the first room of the house 

   print($home->room[0]->name); 

?>

PHP有两个特殊的命名空间:parent命名空间指向父类,self命名空间指向当前的类. 例子6.6中显示了如何用parent命名空间来调用父类中的构造函数. 同时也用self来在构造函数中调用另一个类方法.

<?php 

   class Animal //动物 

   { 

       public $blood; //热血or冷血属性 

       public $name; 

       public function __construct($blood, $name=NULL) 

       { 

           $this->blood = $blood; 

           if($name) 

           { 

               $this->name = $name; 

           } 

       } 

   } 

   class Mammal extends Animal  //哺乳动物 

   { 

       public $furColor; //皮毛颜色 

       public $legs; 

       function __construct($furColor, $legs, $name=NULL) 

       { 

           parent::__construct("warm", $name); 

           $this->furColor = $furColor; 

           $this->legs = $legs; 

       } 

   } 

   class Dog extends Mammal   

   { 

       function __construct($furColor, $name) 

       { 

           parent::__construct($furColor, 4, $name); 

           self::bark(); 

       } 

       function bark() 

       { 

           print("$this->name says 'woof!'"); 

       } 

   } 

   $d = new Dog("Black and Tan", "Angus"); 

?>

第四章中介绍了如何调用函数. 对于对象的成员来是这样调用的:如果你需要在运行时确定变量的名称,你可以用$this->$Property这样的表达式. 如果你想调用方法,可以用$obj->$method().

你 也可以用->运算符来返回一个函数的值,这在PHP以前的版本中是不允许的. 例如,你可以写一个像这样的表达式: $obj->getObject()->callMethod(). 这样避免了使用一个中间变量,也有助于实现某些设计模式,如Factory模式.

注:本文章为原创文章,版权归文章作者与超越PHP网站所有,未经本站同意,禁止任何商业转载。非盈利网站及个人网站转载请注明出处,谢谢合作!

php

第十节–抽象方法和抽象类 — Classes and Objects in PHP5 [10]

Tags: , ,

/*
——————————————————————————-
| = 本文为Haohappy读<<Core PHP Programming>>
| = 中Classes and Objects一章的笔记
| = 翻译为主 个人心得
| = 为避免可能发生的不必要的麻烦请勿转载,谢谢
| = 欢迎批评指正,希望和所有PHP爱好者共同进步!
| = PHP5研究中心: http://blog.csdn.net/haohappy2004
——————————————————————————-
*/

第十节–抽象方法和抽象类

面 向对象程序通过类的分层结构构建起来. 在单重继承语言如PHP中, 类的继承是树状的. 一个根类有一个或更多的子类,再从每个子类继承出一个或更多下一级子类. 当然,可能存在多个根类,用来实现不同的功能. 在一个良好设计的体系中,每个根类都应该有一个有用的接口, 可以被应用代码所使用. 如果我们的应用代码被设计成与根类一起工作,那么它也可以和任何一个从根类继承出来的子类合作.

抽象方法是就像子类中一般的方法的占位符(占个地方但不起作用),它与一般方法不同—没有任何代码. 如果类中存在一个或更多抽象方法, 那么这个类就成了抽象类. 你不能实例化抽象类. 你必须继承它们,然后实例化子类. 你也可以把抽象类看成是子类的一个模板.

如果你覆写所有的抽象方法, 子类就变成一个普通的类. 如果没有覆写所有方法, 子类仍是抽象的. 如果一个类中中包含有抽象方法(哪怕只有一个), 你必须声明这个类是抽象的, 在class关键字前加上abstract.

声明抽象方法的语法与声明一般方法不同. 抽象方法的没有像一般方法那样包含在大括号{}中的主体部份,并用分号;来结束.

在例子6.13中, 我们定义了一个含有getArea方法的类Shape. 但由于不知道形状不可能确定图形的面积,确良我们声明了getArea方法为抽象方法. 你不能实例化一个Shape对象,但你可以继承它或在一个表达式中使用它, 就像例6.13中那样.

如 果你建立了一个只有抽象方法的类,你就定义了一个接口(interface). 为了说明这种情况, PHP中有interface 和implements关键字. 你可以用interface来代替抽象类, 用implements来代替extends来说明你的类定义或使用一个接口. 例如, 你可以写一个myClass implements myIterface. 这两种方法可以依个人偏爱来选择.

/*注:
两种方法即指:
1. abstract class aaa{} (注意aaa中只有抽象方法,没有一般方法)
class bbb extends aaa{} (在bbb中覆写aaa中的抽象方法)
2. interface aaa{}
class bbb implements aaa{} (在bbb中覆写aaa中的抽象方法)
*/

Listing 6.13 Abstract classes

<?php 

   //abstract root class 抽象根类 

   abstract class Shape 

   { 

       abstract function getArea(); //定义一个抽象方法 

   } 

   //abstract child class 抽象子类 

   abstract class Polygon extends Shape //多边形 

   { 

       abstract function getNumberOfSides(); 

   } 

   //concrete class 实体类 三角形类 

   class Triangle extends Polygon 

   { 

       public $base; 

       public $height; 

       public function getArea() //覆写计算面积方法 

       { 

           return(($this->base * $this->height)/2); 

       } 

       public function getNumberOfSides() //覆写边数统计方法 

       { 

           return(3); 

       } 

   } 

   //concrete class 实体类四边形 

   class Rectangle extends Polygon 

   { 

       public $width; 

       public $height; 

       public function getArea() 

       { 

           return($this->width * $this->height); 

       } 

       public function getNumberOfSides() 

       { 

           return(4); 

       } 

   } 

   //concrete class 实体类 圆形 

   class Circle extends Shape 

   { 

       public $radius; 

       public function getArea() 

       { 

           return(pi() * $this->radius * $this->radius); 

       } 

   } 

   //concrete root class 定义一个颜色类 

   class Color 

   { 

       public $name; 

   } 

   $myCollection = array(); //建立形状的集合,放入数组 

   //make a rectangle 

   $r = new Rectangle; 

   $r->width = 5; 

   $r->height = 7; 

   $myCollection[] = $r; 

   unset($r); 

   //make a triangle 

   $t = new Triangle; 

   $t->base = 4; 

   $t->height = 5; 

   $myCollection[] = $t; 

   unset($t); 

   //make a circle 

   $c = new Circle; 

   $c->radius = 3; 

   $myCollection[] = $c; 

   unset($c); 

   //make a color 

   $c = new Color; 

   $c->name = "blue"; 

   $myCollection[] = $c; 

   unset($c); 

   foreach($myCollection as $s) 

   { 

       if($s instanceof Shape) //如果$s是Shape类的实例 

       { 

           print("Area: " . $s->getArea() . 

               "<br>\n"); 

       } 

       if($s instanceof Polygon) 

       { 

           print("Sides: " . 

               $s->getNumberOfSides() . 

               "<br>\n"); 

       } 

       if($s instanceof Color) 

       { 

           print("Color: $s->name<br>\n"); 

       } 

       print("<br>\n"); 

   } 

?>

注:本文章为原创文章,版权归文章作者与超越PHP网站所有,未经本站同意,禁止任何商业转载。非盈利网站及个人网站转载请注明出处,谢谢合作!

php

session全教程(二)

Tags: ,

二、php3,4中session的实现

在 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:a/pache,并将phplib下的pages 目录下的文件和目录一起拷贝到 d:/apache/htdocs下,注意不带目录本身。phplib的类库需要根据系统进行初始化,你可以修改local.inc文件,其中包含着一些 基本参数,你可以根据自己机器的实际情况来进行修改。 将d:/apache/php/prepend.php3文件中的一段程序改为如下样子:

if (!isset($_PHPLIB) or !is_array($_PHPLIB)) {
$_PHPLIB["libdir"] = “d:/apache/php/”; //这儿改为你放phplib下php目录的路径
}

然后将d:/apache/php/local.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例子如下:

<?php
page_open(array(”sess” => “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文件中是否包含了空行,这也是一个非常容易出错的地方。为了减少出 错的可能,我们可以这样书写初始化程序:
<?
page_open(array(”sess” => “Example_Session”));
?>
<html>
…..
</html>

第三步,具体使用。
当 一个用户访问了该网站后,随即用户的session就开始了,如果用户的浏览器支持cookie的话,将会建立一个session的id放入 cookie,这个唯一的ID是由PHP3随机生成,然后又用随机种子字串进行md5加密过了的,这里的cookie应该叫做session cookie,因为这个cookie是不会写到用户硬盘里去的,当一个session期结束的时候,该cookie也被完结了。如果用户浏览器不支持 cookie的话,那么 该session的id将会放入url链中,因为是加密过的,所以窃取了也没用。session ID存放着用户的有关信息,如用户已认证、认证到期时间、用户权限,和其他一些你可能需要的信息,方便我们取用。Session其实就是用户一次会话的过 程。Session并不是仅仅用来跟踪用户的注册,实际上,它还可以有其它的使用场合,你可以用它来存储任何你想要存贮的信息,这些信息可以在用户随后访 问的页面中派上用场,当然前提是那些页面要使用PHPLIB。方法很简单,注册一个变量后即可在随后的页面中使用它,直至session结束。方法:
<?php $sess->register( “variable_name”); ?>

注意,这里的variable_name不是变量值,而是变量名,可以先指定变量名,随后再赋值。你在某个页面中可以改变变量的值,随后的页面访问该变量会得到改变后的值。变量的类型是多样的,可以是一个字串,一个数字,一个数组。举例来说明:

第一页:
<?php
page_open(array(”sess” => “Example_Session”));
$sess->register( “first”); //注意变量名前不需要加$
if (iset($firstname)) {
$first = $firstname;
}
…..
page_close();
?>

第二页:
<?php
page_open();//开始session
echo $first;//看看效果

page_close();//保存状态信息
?>

注 册完一个变量,当页面最后调用page_close()函数后,各个session变量会被写回到数据库中。如果你忘记调用page_close()函数 的话,变量就不会被写回数据库,将出现不可预知的后果。当变量被使用完毕,你不再需要用到时,可以调用以下函数将变量删除:

<?php
page_open(array(”sess” => “Example_Session”));

$sess->unregister( “variable_name”);

page_close();
?>

PHPLIB 7.0中,使用了一种存储结构,它允许你存储session数据到数据库中、共享内存中或者LDAP中。PHPLIB使用了数据库类,这使得你有了更多的选择,你可以选用oracle8,mysql,postgresql等等数据库来保存状态信息。

关于phplib中的其它功能以及有关session的其它函数的使用,你可以参看它带的手册,或上它的网站看在线文档。它的老家在http://phplib.netuse.de/index.php3。 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_start()?>
<html>
….
<body>
<?
$var=”hello”;
session_register(”var”);//注册$var变量,注意没有$符号
if(session_is_registered(”var”))//检查变量是否注册
echo “haha,注册了!”;
else
echo “sorry,还没有注册!”;

?>
</body>
</html>
php4中session处理的定制

我们需要扩充6个函数,当然这些函数不需你去调用,对我们来说是透明的。

这几个函数是:
sess_open($sess_path, $session_name);

这 个函数被session处理程序调用来作初始化工作。需要传给它的两个参数是$sess_path,它对应你的php.ini文件中的 session.save_path选项;$session_name,它对应php.ini中的session.name 选项。它们具体怎样工作,请看下面的例子。

sess_close();

这个函数在页面结束执行并且session处理程序需要关闭时被调用。(注意,不要和sess_destory混淆了,它是用来结束session的)

sess_read($key);

这个函数在session处理程序读取指定session键值($key)时。
这个函数检索并返回标识为$key的session数据.(注意:你不用担心怎样序列化和反序列化数据,如果你不知道这是什么意思,不要担心它)

译者注:序列化是将变量或对象在程序结束或需要时保存在文件中,在下次程序运行或需要时再
调入内存的技术,有别于只保存数据的方法。

sess_write($key, $val);

这个函数据在session处理程序需要将数据保存时调用,这种情况经常在你的程序结束时发生。它负责将数据保存在下次能用sess_read($key)函数检索的地方。

sess_destroy($key);

这个函数在需要消毁session时。它负责删除session并且清除环境。
sess_gc($maxlifetime);
这个函数负责清理碎片。在这种情况下,它负责删除过时的session数据。session处理程序会偶尔调用它们。

现在我们已经清楚了我们提供的函数。

定制程序可以用mysql数据库或DBM文件保存session数据。取决于你的需要。
如果你决定使用mysql作支持,那需要作以下工作:

首先我们在mysql中创建一个sessions数据库,并且创建一个sessions表。先运行你的mysql客户端并且执行下面的命令:
mysql> CREATE DATABASE sessions;

mysql> GRANT select, insert, update, dele ON sessions.* TOphpsession@localhost
-> IDENTIFIED BY ‘phpsession’;

mysql> CREATE TABLE sessions (
-> sesskey char(32) not null,
-> expiry int(11) unsigned not null,
-> value text not null,
-> PRIMARY KEY (sesskey)
-> );

下一步,修改session_mysql.php文件的$SESS_DB* 变量使其匹配你机器上的数据库设置。

(很抱歉,由于版权原因,我不能把以下代码中的英文去掉,只好加些注释了
==================================================================================
<?
/* ————————————————————————
* session_mysql.php
* ————————————————————————
* PHP4 MySQL Session Handler
* Version 1.00
* by Ying Zhang (ying@zippydesign.com)
* Last Modified: May 21 2000
*
* ————————————————————————
* TERMS OF USAGE:
* ————————————————————————
* You are free to use this library in any way you want, no warranties are
* expressed or implied. This works for me, but I don’t guarantee that it
* works for you, USE AT YOUR OWN RISK.
*
* While not required to do so, I would appreciate it if you would retain
* this header information. If you make any modifications or improvements,
* please send them via email to Ying Zhang <ying@zippydesign.com>.
*
* ————————————————————————
* DESCRIPTION:
* ————————————————————————
* This library tells the PHP4 session handler to write to a MySQL database
* instead of creating individual files for each session.
*
* Create a new database in MySQL called “sessions” like so:
*
* CREATE TABLE sessions (
* sesskey char(32) not null,
* expiry int(11) unsigned not null,
* value text not null,
* PRIMARY KEY (sesskey)
* );
*
* ————————————————————————
* INSTALLATION:
* ————————————————————————
* Make sure you have MySQL support compiled into PHP4. Then copy this
* script to a directory that is accessible by the rest of your PHP
* scripts.
* 确信你的php4有mysql支持,然后把这个脚本拷贝到和你的php脚本有关的目录。
* ————————————————————————
* USAGE:(使用方法)
* ————————————————————————
* Include this file in your scripts before you call session_start(), you
* don’t have to do anything special after that.
* 包含这个文件到你要使用session的文件中,必须在调用session_start()之前,否则,
* 会很惨的,不要怪我没告诉你。 这样就不需要再做什么工作了,还和你以前用session的方法一样。
*/

$SESS_DBHOST = “localhost”; /* database server hostname */
$SESS_DBNAME = “sessions”; /* database name */
$SESS_DBUSER = “phpsession”; /* database user */
$SESS_DBPASS = “phpsession”; /* database password */

$SESS_DBH = “”;
$SESS_LIFE = get_cfg_var(”session.gc_maxlifetime”);

function sess_open($save_path, $session_name) {
global $SESS_DBHOST, $SESS_DBNAME, $SESS_DBUSER, $SESS_DBPASS, $SESS_DBH;

if (! $SESS_DBH = mysql_pconnect($SESS_DBHOST, $SESS_DBUSER, $SESS_DBPASS)) {
echo “<li>Can’t connect to $SESS_DBHOST as $SESS_DBUSER”;
echo “<li>MySQL Error: “, mysql_error();
die;
}

if (! mysql_select_db($SESS_DBNAME, $SESS_DBH)) {
echo “<li>Unable to select database $SESS_DBNAME”;
die;
}

return true;
}

function sess_close() {
return true;
}

function sess_read($key) {
global $SESS_DBH, $SESS_LIFE;

$qry = “SELECT value FROM sessions WHERE sesskey = ‘$key’ AND expiry > ” . time();
$qid = mysql_query($qry, $SESS_DBH);

if (list($value) = mysql_fetch_row($qid)) {
return $value;
}

return false;
}

function sess_write($key, $val) {
global $SESS_DBH, $SESS_LIFE;

$expiry = time() $SESS_LIFE;
$value = addslashes($val);

$qry = “INSERT INTO sessions VALUES (’$key’, $expiry, ‘$value’)”;
$qid = mysql_query($qry, $SESS_DBH);

if (! $qid) {
$qry = “UPDATE sessions SET expiry = $expiry, value = ‘$value’ WHERE sesskey
= ‘$key’ AND expiry > ” . time();
$qid = mysql_query($qry, $SESS_DBH);
}

return $qid;
}

function sess_destroy($key) {
global $SESS_DBH;

$qry = “DELETE FROM sessions WHERE sesskey = ‘$key’”;
$qid = mysql_query($qry, $SESS_DBH);

return $qid;
}

function sess_gc($maxlifetime) {
global $SESS_DBH;

$qry = “DELETE FROM sessions WHERE expiry < ” . time();
$qid = mysql_query($qry, $SESS_DBH);

return mysql_affected_rows($SESS_DBH);
}

session_set_save_handler(
“sess_open”,
“sess_close”,
“sess_read”,
“sess_write”,
“sess_destroy”,
“sess_gc”);
?>
=================================================================
定制使用dbm文件时的接口
=================================================================
<?
/* ————————————————————————
* session_dbm.php
* ————————————————————————
* PHP4 DBM Session Handler
* Version 1.00
* by Ying Zhang (ying@zippydesign.com)
* Last Modified: May 21 2000
*
* ————————————————————————
* TERMS OF USAGE:
* ————————————————————————
* You are free to use this library in any way you want, no warranties are
* expressed or implied. This works for me, but I don’t guarantee that it
* works for you, USE AT YOUR OWN RISK.
*
* While not required to do so, I would appreciate it if you would retain
* this header information. If you make any modifications or improvements,
* please send them via email to Ying Zhang <ying@zippydesign.com>.
*
* ————————————————————————
* DESCRIPTION:
* ————————————————————————
* This library tells the PHP4 session handler to write to a DBM file
* instead of creating individual files for each session.
*
* ————————————————————————
* INSTALLATION:
* ————————————————————————
* Make sure you have DBM support compiled into PHP4. Then copy this
* script to a directory that is accessible by the rest of your PHP
* scripts.
* 确信你的php4有DBM支持。拷贝这个文件在你的php脚本目录。
* ————————————————————————
* USAGE:
* ————————————————————————
* Include this file in your scripts before you call session_start(), you
* don’t have to do anything special after that.
* 在调用session_start()之前请包含这个文件。之后就不需要作什么工作了。
*/

$SESS_DBM = “”;
$SESS_LIFE = get_cfg_var(”session.gc_maxlifetime”);

function sess_open($save_path, $session_name) {
global $SESS_DBM;

$SESS_DBM = dbmopen(”$save_path/$session_name”, “c”);
return ($SESS_DBM);
}

function sess_close() {
global $SESS_DBM;

dbmclose($SESS_DBM);
return true;
}

function sess_read($key) {
global $SESS_DBM, $SESS_LIFE;

$var = “”;
if ($tmp = dbmfetch($SESS_DBM, $key)) {
$expires_at = substr($tmp, 0, strpos($tmp, “│”));

if ($expires_at > time()) {
$var = substr($tmp, strpos($tmp, “│”) 1);
}
}

return $var;
}

function sess_write($key, $val) {
global $SESS_DBM, $SESS_LIFE;

dbmreplace($SESS_DBM, $key, time() $SESS_LIFE . “│” . $val);
return true;
}

function sess_destroy($key) {
global $SESS_DBM;

dbmdele($SESS_DBM, $key);
return true;
}

function sess_gc($maxlifetime) {
global $SESS_DBM;

$now = time();
$key = dbmfirstkey($SESS_DBM);
while ($key) {
if ($tmp = dbmfetch($SESS_DBM, $key)) {
$expires_at = substr($tmp, 0, strpos($tmp, “│”));
if ($now > $expires_at) {
sess_destroy($key);
}
}

$key = dbmnextkey($SESS_DBM, $key);
}
}

session_set_save_handler(
“sess_open”,
“sess_close”,
“sess_read”,
“sess_write”,
“sess_destroy”,
“sess_gc”);
?>

=================================================================
具体怎么用就不用多说了,因为这些函数都是php引擎调用的,与我们无关的。我们只需照上述配
置后就行了,你用的还是以前的session函数。
看看下面的代码就知道了:)
session定制的测试代码
==================================================================
<?
/* ————————————————————————
* test.php
* ————————————————————————
* PHP4 Customer Session Handler Test Script
* Version 1.00
* by Ying Zhang (ying@zippydesign.com)
* Last Modified: May 21 2000
*/

/* default to DBM handler */
if (! isset($handler)) {
$handler = “dbm”;
}

/* default action is increment */
if (! isset($action)) {
$action = “increment”;
}

/* load up the appropriate session handling script, depending on the handler */
if ($handler == “dbm”) {
include(”session_dbm.php”);

} elseif ($handler == “mysql”) {
include(”session_mysql.php”);

} else {
echo “<li>Unrecognized handler ($handler)”;
die;
}

/* start the session and register a simple counter */
session_start();
session_register(”count”);

/* figure out what we should do, depending on the action */
switch ($action) {
case “increment” :
$count = isset($count) ? $count 1 : 0;
break;

case “destroy” :
session_destroy();
break;

case “gc” :
$maxlife = get_cfg_var(”session.gc_maxlifetime”);
sess_gc($maxlife);
break;

default:
echo “<li>Unknown action ($action)”;
break;
}
?>

<h1>Session Test Script</h1>
<ul>
<li>Handler: <b><?=$handler?></b>
<li>Action: <b><?=$action?></b>
<li>Count: <b><?=$count?></b>
</ul>

<hr size=1>
<form>
<table>
<tr>
<td>Handler:</td>
<td>
<select name=”handler”>
<option value=”dbm”>DBM</option>
<option value=”mysql”>MySQL</option>
</select>
</td>
</tr>
<tr>
<td>Action:</td>
<td>
<select name=”action”>
<option value=”increment”>Increment</option>
<option value=”destroy”>Session Destroy</option>
<option value=”gc”>Force Garbage Collection</option>
</select>
</td>
</tr>
<tr>
<td></td>
<td><br><input type=”submit”></td>
</tr>
</table>
</form>
=======================================================================

php

变量的变量,PHP和你

Tags: , ,

在我最近做的一个项目中,我发现了一个新的概念,关于在PHP中使用变量的变量。在我的程序中,我需要在一个页面同时更新多个记录,在我经?嗟背な奔涞耐 纯嗨妓髦?螅?院V信既坏厣料殖隽吮淞康谋淞浚?ariable variable)这一概念,所有的困惑就一扫而光了。

介绍

什 么叫作变量的变量?根据PHP手册,变量的变量是指取得一个变量的值并把它作为另一个变量的变量名。这表述显得相当的直接,容易和那些在一个句子中使用 “变量”这个词弄混淆。给一个简单的例子,你定义一个变量 — x 等于 this — 然后定义一个变量的变量,意味着你把 x 的值作为新变量的名,在这个例子中,这个新变量的值是 is cake。用PHP来表示如下:

<?php

$x = “this”;
$$x = “is cake”;

?>

这个符号$$是在PHP中对变量的变量的表示方法。现在我们可以用两种不同的方式来引用这两个变量 $x 和 $$x 了。

<?php

echo “$x ${$x}”;

?>

<?php

echo “$x $this”;

?>

上面两段程序都将输出 this is cake。注意,在echo语句中$$x被写成${$x},这是让PHP知道你要输出的是变量的变量而不是一个$字符与$x变量。

你是不是仍很迷惑?哦,也许吧,你想要一些更深入更有用的例子?下一节,我将向你展示怎样用变量的变量在一个页面编辑多条记录的。

例子

假设你已有一个MySQL数据库,保存了对一些感兴趣的站点的链接,库中有一个表submissions,字段如下:

SubmissionID
PostedBy
Link
Description
Approved

现在你想显示在表中所有的已创建但没有被认可的链接,这个编辑的页面应可以更正一些输入时的错误,并用适当的单选按钮来为每一个记录设置是否允许(Approved),然后一次把更新后的记录都提交到表中。

首先,当你从数据库出提取所有的记录并显示出来时,你必须为每一个记录设置一个唯一的名字,这将让我们在提交时可以循环地辩别出各个记录的值。代码如下:

<?php

//初始化变量的记数器

$index = 0;
$index_count = 0;

echo “<form method=post action=$PHP_SELF>n”;
echo “<table>n”;
echo “<tr><td><b>Posted By</b></td><td><b>Link</b></td>”.
“<td><b>Description</b></td><td><b>Approved</b></td></tr>n”;

/*********
假定我们已从数据库中检索出记录到一个数组中
$myrow = mysql_fetch_array().
下面的 do…while 循环根据名字为每一个$xstr变量分配了一个值并且连接了$index 的值到结尾,以0为开始。
这样,这个循环的第一次时,$SubmissionIDStr 的值就是 SubmissionID0 ,第二次就是 SubmissionID1 ,以此类推。
***********/

do {

$SubmissionIDStr = SubmissionID.$index;
$PostedByStr = PostedBy.$index;
$LinkStr = Link.$index;
$DescriptionStr = Description.$index;
$ApprovedStr = Aprroved.$index;

//这一段将在屏幕上显示值,以每行一条记录。

printf(”<tr><td><input type=hidden name=%s value=%s><input type=text name=%s value=%s></td>
<td><input type=text name=%s value=%s></td><td><input type=text name=%s value=%s></td>
<td><input type=radio name=%s value=-1>Yes<input type=radio name=%s value=0 checked>No</td></tr>n”,
$SubmissionIDStr, $myrow["SubmissionID"], $PostedByStr, $myrow["PostedBy"], $LinkStr, $myrow["Link"],
$DescriptionStr, $myrow["Description"], $ApprovedStr, $ApprovedStr);

//每个循环记数器加1

$index ;
$index_count ;

} while ($myrow = mysql_fetch_array($result));

// 创建一个索引记数器index_count来跟踪所有的记录数

echo “<INPUT TYPE=hidden NAME=counter VALUE=$index_count>n”;

echo “<INPUT TYPE=submit></form>n”;

?>

提交以后,我们利用$index_count变量再一次循环遍历页面上所有的变量,然后,分配这些变量给另一些变量,这就用到了变量的变量。

<?php

//这个循环遍历所有页面上显示的记录

for ($index = 0; $index <= $counter; $index ) {

/*****
这部分用我们在前面创建的名字设置了新的变量
从0开始,直到$index_count
*****/

$varSubmissionID = ‘SubmissionID’.$index;
$varPostedBy = ‘PostedBy’.$index;
$varLink = ‘Link’.$index;
$varDescription = ‘Description’.$index;
$varApproved = ‘Approved’.$index;

/******
这是变量的变量部分,把每个值分配给每个新变量的名。
例如,第一次循环时,分配给记录 SubmissionID0 是从前面得来的值,我们用变量的变量来了取到它。
*******/

$SubmissionIDvalue = $$varSubmissionID;
$PostedByvalue = $$varPostedBy;
$Linkvalue = $$varLink;
$Descriptionvalue = $$varDescription;
$Approvedvalue = $$varApproved;

//更新数据库

$sql = “UPDATE submissions SET PostedBy=’$PostedByvalue’,Link=’$Linkvalue’,”.
“Description=’$Descriptionvalue’ WHERE SubmissionID=$SubmissionIDvalue’”;
$result = mysql_query($sql);

//如果本记录被设置为approved,更新相应的字段 Approved。

if ($Approvedvalue == ‘-1′) {
$sql = “UPDATE submissions SET Approved=’-1′ WHERE SubmissionID=$SubmissionIDvalue”;
$result = mysql_query($sql);
}

}

?>

我希望这有助于你明白这个变量的变量的基本用法,并且在你将来的工作中使用它们提供一些思路。变量的变量这一概念,最初也是让我头痛的东西,但是一旦你知道了它们工作的基本原理时,它们就变成了一块美味的比萨饼。

php

PHP学习-PHP 开发环境的选择、建立及使用(7)

Tags: , , ,

ZDE基本功能
界面介绍。如下图:
下面就按照一些常用功能来介绍这款编辑器。
1. 项目管理功能。
ZDE 可以和 DW 一样建立和管理项目。点击菜单命令:Project -> New Project 来建立一个新项目。弹出的对话框中输入项目名称,我这里输入一个 OpenPHP.cn 项目,可以选择项目信息的存放路径,一般按照默认即可。点击 Next 来添加项目文件,或者点击 Finish 完成。如下图:
这 里我选择 Next 来添加一个已经存在的项目文件(一般应该把这些文件存放在 WEB 目录如 htdocs 目录下),点击 Add Path 来添加项目目录。选中文件夹后点击 Add 添加,并点击 Next 进入下一步的 Debug Server 的设置。如下图:
点 击 Next 后,我们将 Use System Defaults 前面的钩去掉,在 Temporary output files loaction 中浏览指向该项目的文件夹,这样在输出临时文件的时候才能保持路径的一致性(比如图片路径,CSS路径等)。其他按照系统默认,点击 OK、Finish 来完成项目的新建工作:
现 在来看看管理窗口,这里将列出打开的项目的详细信息。我只介绍一个比较有用的项目巡视功能。点击 Project Inspector ,这里列出了该项目、文件、PHP中所有函数、常量、类名等,给你做了一个很好的列表总结,可以双击列表上的函数、类、方法、常量跳转到相应文件的定义部 分。如果你更新了文件而这个列表没有及时更新,可以选择菜单命令来重建数据库:
其他功能可以自己看哦,非常简单的。
2. 重要的 Debug 功能
建 立项目后,我们就要开始项目的调试,ZDE 的一个很重要的功能就是 Debug 功能,首先测试一下 Debug 服务器是否能够连接。选择 Debug -> Check Debug Server Connection 来测试 Debug 服务器,如图,如果按照默认设置的话应该成功连接,否则请重新设置 Debug 选项。
OK,连接成功的话我们就来具体说说 Debug 的功能。
一、 最基本的运行功能。我们打开一个文件,选中 Debug -> GO (或者快捷键 F5),ZDE 将运行该文件,并将结果显示在输出窗口。
二、 设置断点功能:
点击编辑窗口左边的代码行号,设置该行断点。或者将光标移到该行,选择菜单命令:Debug -> Add/Remove Breakpoint 来设置断点(快捷键 F9),或者点击该行行号也可以设置断点。写一个小程序来看看断点的作用。如下图:
我 在第 5 行和第 7 行设置了断点,可以在调试窗口看到你所设置的所有断点。我们点击工具栏上的 GO 图标,运行该代码,可以看到当程序运行完第 3 行的时候,到达第 5 行停止运行了,输出 hello , World ! ,我们再点击 GO 图标或者,程序继续执行,输出 hello , zend ! 后,在第 7 行我们设置断点的地方又停止执行了,继续点击 GO 图标完成程序的执行。我想到这里应该明白断点的作用了吧,在你需要暂停执行的地方设置断点,以便检查各种错误和找出错误的地方,这个功能恐怕是调试中用得 最多的功能之一。当然我们在设置断点后,可以使用工具栏里的一系列按纽来控制输出,非常方便,我来简要介绍一些这些调试按钮的使用:
第一个 Step Over 按钮是单步调试按钮,调试的时候是逐行执行的;第二个和第三个 Step Out 和 Step Into 按钮功能是在调试时候选择是否进入函数、文件或者跳出函数、文件,当我们在函数上设置断点的时候:
点击 Step Into 将跳转到该函数:
因为这个函数包含文件,所以继续点击 Step Into,调试器将自动打开包含文件并进行调试。如果你想跳出该调试,点击 Step Out 即可。
第四个按钮是 GO 按钮,调试时候运行。
第五个按钮是跳转到光标位置,在调试的时候,将鼠标移动到任意一行,点击该按钮,调试器执行到光标处将暂停:
接下来的 Run 按钮想必大家都很熟悉了,就是不管是否设置断点,一次执行这个程序。最后一个按钮时停止调试,在调试过程中可以点击这个按钮来终止调试,而且一个更好的应用,是当你程序出现死循环导致系统运行缓慢时候,点击这个按钮来终止程序是最好的选择了。
当程序出错的时候,将会在调试信息窗口显示相应的错误:
三、 Debug URL 。
使用 URL 路径来调试。选择菜单命令 Debug -> Debug URL(快捷键 F8),输入需要调试的 URL,比如带有 get 信息的,我这里输出/ forum/index.php进行调试:
点击 OK 后,会自动打开一个浏览器,并且在代码窗口中打开该文件的代码,开始进行调试。点击工具栏上的 Run 图标跳出 Debug 并执行全部程序。
四、 程序分析图:
该功能给出文件的详细分析说明,包括性能,各个函数的使用次数,执行时间,包含文件个数等。执行菜单命令 Debug -> Profile (快捷键 F12),输出要测试的 URL,忘了说了,URL 可以带查询参数,比如我这里输入/forum/index.php?mod=list&fid=5进行性能测试(Debug URL 的时候输出的 URL 也可带查询参数):
点击 OK 后,将会打开一个浏览器窗口,并且返回一个图表对话框,第一页显示整体信息,包括各个包含文件的执行时间,总体执行时间等, 并用饼状图表示出来,如下图:
第二页是函数统计表,统计各个执行的函数、执行次数和执行时间,可以选择各种不同的视图和统计方式,非常直观,如下图:
第三页是执行追踪页面,显示所有执行函数的具体执行时间和顺序等,如下图:
这个功能我经常用,对于编写优秀的代码非常有用,可以通过该功能看到一些执行时间长而影响整体运行效率的函数,修改并优化它。真的非常的人性化。点击右上角的最小化按钮可以暂时将该结果停靠在调试信息窗口位置:
四、在浏览器中查看执行结果。
在输出窗口中点击右键,选中 Show in Browser ,将输出的代码放到浏览器中查看。程序打开一个浏览器窗口并显示执行结果。
3. 代码分析功能:
代码分析功能又是 ZDE 的一个亮点,可以帮助你发现代码中的错误、安全隐患等。具体操作如下:
打 开文件,在编辑窗口的代码上点击右键,选中 Analyze Code 或者单击图标,ZDE 将开始检测该文件的代码,检测完毕后生成报告和代码修改建议,代码检测报告窗口在调试信息窗口位置,选中其中一条报告信息后,会在其右边显示修改建议和代 码错误类型。双击该条报告,会跳转到文件中的相应行。如下图显示的是一个安全问题:
你应该明白,即使代码运行正确,也可能存在着一些隐含的问题。可以看出 Zend Studio 的作者为程序开发人员考虑得多周到,以后可以减少错误的发生了。
4. 代码缩进功能。
作为编程新手,可能代码写得杂乱无章,不用怕,ZDE 内置了代码自动缩进功能,只须一个操作就可以帮助你整理代码了。在写好的代码上面单击右键,在弹出的右键菜单中选择 Indent Code,可以看到整理前后的区别了,如下图为整理前杂乱的代码:
缩进整理后:
怎么样,很工整吧,对于长代码更有用哦,不要错过这个功能,当然,我还是建议在编写代码的时候就注意代码的书写格式,这样才能养成好的编程习惯。不要太依赖于编辑软件了。
另外一个经常用到的功能是多行缩进,选中需要缩进的文本,按 Tab 键,就可以对多行进行缩进了:
缩进后:
5. 自动填充功能:
如 Micorsoft 的 VC 一样,ZDE 也包含了自动填充功能。这样可以节省很多输出长串代码的时间了,如下图:
如 果输入一串字符(如函数),在光标下方将显示类似的函数、常量或者变量,可以使用键盘的方向键的上下箭头来选择你所需要的函数、常量、变量等。如果是函 数,那么它将显示函数的说明。点击 Open Manual ,将打开 PHP 手册中该函数的说明页面(PHP 手册的路径设置我在前面已经讲过,如果没有设置正确将不能打开相关页面)。恩,还有一个非常方便查看系统函数的方法:将光标移动到系统函数上面,按 F1 快捷键,也将打开该函数所在的 PHP 手册中的相关页面。方便吧?=_=!
当然,自动填充功能还包含 HTML 代码的自动填充等。
6. 函数的注释功能:
在输入自己自定义函数的时候,如果该函数没有注释,将提示你注释该函数,点击 Add Description 添加注释,ZDE 会自动创建PEAR 注释风格,按照提示输出即可。如下图:
写好注释以后。当你再次输入该函数的时候,就会显示相应提示了,如下图:
你也可以随时为某个函数添加注释,在代码视察窗口中,找到你需要添加注释的函数或者类,单击右键并选择添加注释即可:
7. 方便的注释功能。
ZDE 提供了注释的快捷功能,支持单行和多行注释,支持 HTML 注释和 PHP 代码段注释,能够自动识别这两种代码。快捷键均相同。单行注释快捷键为 Ctrl+/ ,多行注释的快捷键为 Ctrl+Shift+/ ,用起来非常方便。对于单行注释,只需要将光标移到该行,按快捷键即可;对于多行注释,则选择需要注释的部分,按快捷键即可。撤销注释的时候,只须重复一 次该操作。如下图:
8. FTP 服务器。
点击 File(文件)菜单,选择 Add FTP Server(添加 FTP 服务器),如下图:
打开 FTP 服务器设置对话框,从上到下分别是 服务器名,登录用户名,登录密码,按照如下输入即可:
点击 OK 完成设置,ZDE 会马上尝试连接该 FTP 服务器,如果连接成功,即可在左边 Manager Windows(管理窗口) 看到 FTP 服务器,如下图:
这里列出了 FTP 里的所有可编辑文件。这样双击FTP里的文件,即可在编辑窗口看到该文件的代码,对文件进行远程编辑,非常方便哦。
7. 查找功能
ZDE 不仅提供了普通的查找功能,还提供了正则匹配查找功能,查找功能选项算是比较丰富的了,还可以对选中文本进行搜索等,下面是正则匹配搜索 [0-9.]{8,15}:
ZDE 的使用基本上就这些了,其它一些锁碎的功能等待您的发现,更多可以参考 Zend Information Center 和帮助文件。
好了,ZDE 的使用介绍到这里,下一节将是 Zend Server Center 和其他一些周边软件的使用。

网站建设

2009/10/11

几百元钱和几千元钱的网站有什么不同的地方?

Tags:

1、网站建设基础服务
对域名了解的朋友都知道域名分为英文域名和中文域名,英文域名相对来说要比中文域名便宜许多。

如果您购买的是几百元的网站,网建公司也许根本不会赠送域名,或者勉强赠送一个英文域名;如果您购买的是几千元的网站,网建公司也许会赠送一个中文域名。

2、网站的美观与设计
网站讲究风格设计,FLASH设计,页面设计,颜色搭配,图片处理等等的要求,这些都是需要时间来构思的,几百元的网站不是太简单就是太单调,要不就是版式很老陈,根本看不上眼;而几千元的网站,会给人一种大气、优雅、美观、与众不同的风格体现。

3、网站的功能
几百元的网站功能同样非常的简单,往往就是首页和简单的几个基本功能就没了,真的是不太实用;而几千元的网站,功能非常强大,包括产品发布系统,留言系 统,网站商城,在线购物,新闻发布系统,下载系统,会员管理系统等等几十种功能,只要你需要什么样的系统功能,我们就帮你加入进去。

网站建设就好比买电脑一样,第一个人花2000多元买个组装电脑,第二个人花7000多元买个品牌电脑,虽然这2种电脑都可以使用,但是各方面性能 截然不同,等买组装电脑的出问题了,第一个人就会花更多的钱去修理或者重新配置,而第二个人会长久的使用下去。如果您一步到位买到合适自己的,何乐而不为 呢?

燕之庐 网站建设公司

产业新闻, 开源动态

2009/10/10

开源媒体播放器Amarok 2.2 发布

Tags: ,

得益于 KDE 4 的跨平台特性

,Amarok 除了可在 Linux 系统上运行之外,也能够在其他系统上使用,包括 Windows 和 Mac OS X。相比 Amarok 1.x 而言,它是一个革新的版本。Amarok 2.0 对用户界面(UI)进行了完全的重新设计,集成了 Magnatune、Jamendo、MP3tunes、Last.fm、Shoutcast 等在线服务,对脚本 API 和插件支持进行了修订,从 KDE 3 迁移到了 KDE 4 框架,以及使用了 Solid、Phonon、Plasma 等核心技术

下载:Amarok 2.2

燕之庐 网站建设

产业新闻

2009/10/03

开源虚拟系统VirtualBox 3.0.6发布

Tags:

VirtualBox最早是德国一家软件公司InnoTek所开发虚拟系统软件,后来被Sun收购,改名为Sun VirtualBox,性能有很大的提高.因为他是开源的,不同于VM,而且功能强大,可以在 Linux/Mac 和 Windows 主机中运行, 并 支持在其中安装 Windows (NT 4.0、2000、XP、Server 2003、Vista)、DOS/Windows 3.x、Linux (2.4 和 2.6)、OpenBSD 等系列的客户操作系统.假如你曾经有用过虚拟机软件的经历的话,相信使用 VirtualBox 不在话下。即便你是一个新手,也没有关系。VirtualBox 提供了详细的文档,可以助你在短期内入门。

燕之庐

产业新闻

甲骨文近日表示不会放弃MySQL

Tags:

世界上最大的私有数据库软件开发甲骨文收购世界上领先的开源数据库公司Sun,开源数据库MySQL的未来让包括欧盟在内的许多人感到忧虑。现 在Oracle首席执行官 Larry Ellison正式声明,Oracle不会分拆或放弃MySQL,因为MySQL和Oracle之间并无竞争。

Ellison称,MySQL和Oracle之间不存在竞争关系,Oracle的竞争对手是DB2,微软的SQL Server,Sybase和其它,MySQL面向的是不同的市场。Ellison督促欧洲尽快批准Oracle收购Sun的交易,认为拖延只会伤害 Sun,“时间拖得越久,Sun损失的钱便越多。”Ellison声称Oracle会保留Sun拥有的一切,包括存储技术,X86技术和SPARC 技术,并会加大投资。

燕之庐