用PHP已经有很长一段时间了,虽然水平也就这样,但今天还是鼓足勇气,把我自己的一些想法记录于此。方便自己日后使用。有点乱,等以后再继续完善。
首先常用的函数,类库放在一个公共目录中,网站的配置信息存放在一个公共文件中如config . php ,
条件允许的话,可以放在非WEB目录中。
我借鉴了osCommerce的一些写法,比如将公用文件放在includes / application_top . php中。
在很多时候,include_path会搞得人头痛,因此不如将它取消,全部用自己定义的include_path值
<? php
// 防止直接访问此文件
if ( eregi ( " application_top.php " , $_SERVER [ ' PHP_SELF ' ])) {
header ( " location: ../index.php " );
die ();
}
if ( preg_match ( ' /windows/i ' , $_ENV [ ' OS ' ])) {
$include_separator = ' ; ' ;
} else {
$include_separator = ' : ' ;
}
require_once ( ' config.php ' );
$include_path = DIR_WS_INCLUDES . $include_separator .
DIR_WS_INCLUDES . ' smarty ' . $include_separator .
DIR_WS_INCLUDES . ' class ' . $include_separator .
DIR_WS_INCLUDES . ' PEAR ' . $include_separator ;
ini_set ( ' include_path ' , $include_path );
require_once ( " function.php " );
?>
数据库连接
最好采用数据库连接层,如PEAR :: DB,不要直接用具体的PHP数据连接函数如:mysql_connect等,
如果非要用的话,等有一天你要换数据库的时候,你就知道了什么叫。现在php5 . 1有了一个PDO,以后这种情况可能好些。
说到数据库连接,就要讲到SQL语句了,因为网站的SQL语句会出现多次重复使用的情况,因此我将一些通用的SQL语句
全部放在了一个PHP文件,然后需要用的时候,就调用它们如:
<? php
define ( ' _SQL_CATEGORIES_BY_SID ' , " SELECT c.categories_id, c.categories_name FROM " .
TABLE_CATEGORIES . " c INNER JOIN " . TABLE_CATEGORIES . " sub_c " .
" ON c.categories_id = sub_c.parent_id WHERE sub_c.categories_id = %d LIMIT 1 " );
?>
这样就避免了数据库结构有变化的时候,大规模的修改SQL语句的情况。
在数据库资料的入库和出库的时候,需要进行处理,这些处理最好中放到单独的函数中,避免直接用类似于addslashes()之类
的函数来处理,那样很不灵活,当要增加一些额外的动作时,就需要更改所有使用到它们的地方。
<? php
// 处理传递过来的值
$_GET = array_map ( ' getSafeValue ' , $_GET );
$_POST = array_map ( ' getSafeValue ' , $_POST );
?>
<? php
function getSafeValue( $value )
{
// 如果get_magic_quotes_gpc打开了,则不处理,否则用addslashes处理
if ( ! get_magic_quotes_gpc ()) {
return addslashes ( $value );
} else {
return $value ;
}
}
?>
模板
用模板的好处,就是在当你要改版面的时候,工作量少一点。我用的是Smarty模板,以前在模板中用了很多的模板
自己的逻辑判断,觉得这样不好,应该尽量地将这些逻辑判断交给PHP来处理,模板只要显示就可以了:
<% $variable %>
另外如果采用DIV + CSS的话,改起版面来就可以更加方便。
如 < div id = " product " ><% $variable %></ div >
缓存加速
打开Smarty的Cache功能,这样第二次访问页面就是访问接近HTM的页面了,结合GZIP压缩输出,使访问速度可以更快一些。
<? php
// if gzip_compression is enabled, start to buffer the output
if ( ( $ext_zlib_loaded = extension_loaded ( ' zlib ' )) && ( PHP_VERSION >= ' 4 ' ) ) {
if (( $ini_zlib_output_compression = (int) ini_get ( ' zlib.output_compression ' )) < 1 ) {
if ( PHP_VERSION >= ' 4.0.4 ' ) {
ob_start ( ' ob_gzhandler ' );
}
} else {
ini_set ( ' zlib.output_compression_level ' , 9 );
}
}
?>
<? php
/*
$Id: jxyuhua.php,v 1.4 February 26, 2006, 8:24 pm hpdl Exp $
*/
require_once ' includes/application_top.php ' ;
if ( ! $class_smarty -> is_cached(TPL_NAME , $cache_id )) {
// 逻辑处理
}
// 显示内容
$class_smarty -> display(TPL_NAME , $cache_id );
require_once DIR_WS_INCLUDES . ' includes/application_bottom.php ' ;
?>
首先常用的函数,类库放在一个公共目录中,网站的配置信息存放在一个公共文件中如config . php ,
条件允许的话,可以放在非WEB目录中。
我借鉴了osCommerce的一些写法,比如将公用文件放在includes / application_top . php中。
在很多时候,include_path会搞得人头痛,因此不如将它取消,全部用自己定义的include_path值
<? php
// 防止直接访问此文件
if ( eregi ( " application_top.php " , $_SERVER [ ' PHP_SELF ' ])) {
header ( " location: ../index.php " );
die ();
}
if ( preg_match ( ' /windows/i ' , $_ENV [ ' OS ' ])) {
$include_separator = ' ; ' ;
} else {
$include_separator = ' : ' ;
}
require_once ( ' config.php ' );
$include_path = DIR_WS_INCLUDES . $include_separator .
DIR_WS_INCLUDES . ' smarty ' . $include_separator .
DIR_WS_INCLUDES . ' class ' . $include_separator .
DIR_WS_INCLUDES . ' PEAR ' . $include_separator ;
ini_set ( ' include_path ' , $include_path );
require_once ( " function.php " );
?>
数据库连接
最好采用数据库连接层,如PEAR :: DB,不要直接用具体的PHP数据连接函数如:mysql_connect等,
如果非要用的话,等有一天你要换数据库的时候,你就知道了什么叫。现在php5 . 1有了一个PDO,以后这种情况可能好些。
说到数据库连接,就要讲到SQL语句了,因为网站的SQL语句会出现多次重复使用的情况,因此我将一些通用的SQL语句
全部放在了一个PHP文件,然后需要用的时候,就调用它们如:
<? php
define ( ' _SQL_CATEGORIES_BY_SID ' , " SELECT c.categories_id, c.categories_name FROM " .
TABLE_CATEGORIES . " c INNER JOIN " . TABLE_CATEGORIES . " sub_c " .
" ON c.categories_id = sub_c.parent_id WHERE sub_c.categories_id = %d LIMIT 1 " );
?>
这样就避免了数据库结构有变化的时候,大规模的修改SQL语句的情况。
在数据库资料的入库和出库的时候,需要进行处理,这些处理最好中放到单独的函数中,避免直接用类似于addslashes()之类
的函数来处理,那样很不灵活,当要增加一些额外的动作时,就需要更改所有使用到它们的地方。
<? php
// 处理传递过来的值
$_GET = array_map ( ' getSafeValue ' , $_GET );
$_POST = array_map ( ' getSafeValue ' , $_POST );
?>
<? php
function getSafeValue( $value )
{
// 如果get_magic_quotes_gpc打开了,则不处理,否则用addslashes处理
if ( ! get_magic_quotes_gpc ()) {
return addslashes ( $value );
} else {
return $value ;
}
}
?>
模板
用模板的好处,就是在当你要改版面的时候,工作量少一点。我用的是Smarty模板,以前在模板中用了很多的模板
自己的逻辑判断,觉得这样不好,应该尽量地将这些逻辑判断交给PHP来处理,模板只要显示就可以了:
<% $variable %>
另外如果采用DIV + CSS的话,改起版面来就可以更加方便。
如 < div id = " product " ><% $variable %></ div >
缓存加速
打开Smarty的Cache功能,这样第二次访问页面就是访问接近HTM的页面了,结合GZIP压缩输出,使访问速度可以更快一些。
<? php
// if gzip_compression is enabled, start to buffer the output
if ( ( $ext_zlib_loaded = extension_loaded ( ' zlib ' )) && ( PHP_VERSION >= ' 4 ' ) ) {
if (( $ini_zlib_output_compression = (int) ini_get ( ' zlib.output_compression ' )) < 1 ) {
if ( PHP_VERSION >= ' 4.0.4 ' ) {
ob_start ( ' ob_gzhandler ' );
}
} else {
ini_set ( ' zlib.output_compression_level ' , 9 );
}
}
?>
<? php
/*
$Id: jxyuhua.php,v 1.4 February 26, 2006, 8:24 pm hpdl Exp $
*/
require_once ' includes/application_top.php ' ;
if ( ! $class_smarty -> is_cached(TPL_NAME , $cache_id )) {
// 逻辑处理
}
// 显示内容
$class_smarty -> display(TPL_NAME , $cache_id );
require_once DIR_WS_INCLUDES . ' includes/application_bottom.php ' ;
?>