月度归档:2009年12月

PHP中$_GET变量与$_REQUEST变量中取得的GET的值

PHP中$_GET变量与$_REQUEST变量中取得的GET的值
曾经我以为$_REQUEST变量的值是$_GET、$_POST、$_COOKIE三个变量的集合,所不同的是它会依据php.ini的配置进行合并

然而当有一天我以赋值的方式改变了$_GET的值,并从$_REQUEST变量中取时,我无法取到我所需要的值。
于是,我做了如下DEMO:
代码所示:

1
2
3
4
5
<?php
var_dump($_GET);
$_GET['test'] = 1;
var_dump($_GET);
var_dump($_REQUEST);

访问localhost/test/index.php?tt=1
输出如下:
array ‘tt’ => string ’1′ (length=1)
array ‘tt’ => string ’1′ (length=1) ‘test’ => int 1
array ‘tt’ => string ’1′ (length=1)
结果是$_REQUEST并没有$_GET的值。

思考。。。

【思考结果】
$_REQUEST变量的值是$_GET、$_POST、$_COOKIE三个变量的集合这并没有错
只是它是在PHP的生命周期开始时,这几个变量产生就产生了,分别作为一个全局变量存储在hash_table中
当以赋值的方式改变$_GET的值时,并没有改变$_REQUEST的值。它们是独立存在的。

【扩展代码阅读】
在研究过程中查看了PHP相关源码,$_REQUEST的生成过程如下:
其过程如下:

1
2
3
4
5
[sapi/apache/mod_php5.c line 939] hp_init_handler(server_rec *s, pool *p)
-->[sapi/apache/mode_php5.c line 290] php_apache_startup(&apache_sapi_module)
-->[main/main.c line 1630] php_module_startup(sapi_module_struct *sf, zend_module_entry *additional_modules, uint num_additional_modules)
-->[main/php_variables.c line 881] php_startup_auto_globals(TSRMLS_D)
-->[main/php_varables.c line 834] php_auto_globals_create_request(char *name, uint name_len TSRMLS_DC)

over.

变量的取值过程可以参考雪候鸟的“在PHP Module中获取$_GET/$_POST/$_COOKIE的方法研究”
地址如下:http://www.laruence.com/2008/04/04/17.html

存储过程和触发器

存储过程和触发器

【存储过程的定义】
将常用的或很复杂的工作,预先用SQL语句写好并用一个指定的名称存储起来, 那么以后要叫数据库提供与已定义好的存储过程的功能相同的服务时,只需调用execute,即可自动完成命令。

【存储过程的优点】
1、更快的速度
存储过程只在创造时进行编译,以后每次执行存储过程都不需再重新编译,而一般SQL语句每执行一次就编译一次,所以使用存储过程可提高数据库执行速度。
2、代码重用,避免代码冗余
当对数据库进行复杂操作时(如对多个表进行Update,Insert,Query,Delete时),可将此复杂操作用存储过程封装起来与数据库提供的事务处理结合一起使用。
开发人员进行数据库操作时,仅需要调用定义好的存储过程就可以了
3、提高安全性
一些敏感的数据直接在数据层完成,数据层可以对其进行权限控制,提高安全性

【触发器】
google得如下文章:
地址:http://fishermen.javaeye.com/blog/24026

触发器是一种特殊类型的存储过程,它不同于我们前面介绍过的存储过程。触发器主要是通过事件进行触发而被执行的,而存储过程可以通过存储过程名字而被直接调用。当对某一表进行诸如UPDATE、 INSERT、 DELETE 这些操作时,SQL Server 就会自动执行触发器所定义的SQL 语句,从而确保对数据的处理必须符合由这些SQL 语句所定义的规则。
触发器的主要作用就是其能够实现由主键和外键所不能保证的复杂的参照完整性和数据的一致性。除此之外,触发器还有其它许多不同的功能:
【 强化约束 Enforce restriction】
触发器能够实现比CHECK 语句更为复杂的约束。

【跟踪变化Auditing changes】
触发器可以侦测数据库内的操作,从而不允许数据库中未经许可的指定更新和变化。

【级联运行 Cascaded operation】
触发器可以侦测数据库内的操作,并自动地级联影响整个数据库的各项内容。例如,某个表上的触发器中包含有对另外一个表的数据操作(如删除,更新,插入)而该操作又导致该表上触发器被触发。

【存储过程的调用 Stored procedure invocation】
为了响应数据库更新触,发器可以调用一个或多个存储过程,甚至可以通过外部过程的调用而在DBMS( 数据库管理系统)本身之外进行操作。
由此可见,触发器可以解决高级形式的业务规则或复杂行为限制以及实现定制记录等一些方面的问题。例如,触发器能够找出某一表在数据修改前后状态发生的差异,并根据这种差异执行一定的处理。此外一个表的同一类型(INSERT、 UPDATE、 DELETE)的多个触发器能够对同一种数据操作采取多种不同的处理。
总体而言,触发器性能通常比较低。当运行触发器时,系统处理的大部分时间花费在参照其它表的这一处理上,因为这些表既不在内存中也不在数据库设备上,而删除表和插入表总是位于内存中。可见触发器所参照的其它表的位置决定了操作要花费的时间长短。

fishermen已经说得差不多了,补充一点:触发器也好,存储过程也好,这些都是一堆SQL,只是将一些业务流程、控制流程或基于规则的数据和业务控制功能封装在数据库层

视图的定义及其4个优点

视图的定义及其4个优点
【视图的定义】
视图是从一个或几个基本表(或视图)导出的表,它是一个虚表。数据库中存储了视图的定义,视图所显示的数据依然存放在原来的基本表中。
视图和基本表一样可以被查询、删除。在一个视力之上再定义新的视图,此时对视图的更新操作(增加,删除,修改)操作则有一定的限制

ps: 个人觉得视图是一个类似于窗口或接口性的东西

【简化用户操作】
视图可以将用户的注意力集中到所关心的数据上。可以通过定义视图让数据库看起来结构简单清晰,并且可以简化用户的查询操作

【聚集数据】
视图可以让不同的用户以不同的方式看待同一数据,特别是当许多不同的用户共享同一个数据库时

【一定程度的松耦合】
定义视图可以在一定程度上保持基本表的物理独立性,当修改数据的基本表时,只需要修改视图的定义而不用修改用户的应用程序;这里的不影响只是一定程度上的,当应用程序中有修改数据的操作时,则可能需要修改应用程序。这在一定程序让保证了数据的逻辑独立性。

【一定程序的安全保护】
由于视图的聚集数据的作用,对不同的人定义不同的视图,保证用户只能看到他可以看到的数据。也就是说,通过视图将要保密的数据对无权查看地的用户隐藏起来,从而在一定程度上对数据朝代安全保护。