Ecshop Source Code Study Serialize

ECShop 源码分析--index.php

http://www.w3ccollege.org/ecshop/ecshop-source-analysis-index-php.html

<?php
/***********************************************
define — Defines a named constant
定义常量
bool define ( string name, mixed value [, bool case_insensitive])
参数说明
name :常量名
value:常量值
case_insensitive:大小写区分 true 为不区分,默认为false
例:
<?php
define(“CONSTANT”, “Hello world.”);
echo CONSTANT; // outputs “Hello world.”
echo Constant; // outputs “Constant” and issues a notice.
 
define(“GREETING”, “Hello you.”, true);
echo GREETING; // outputs “Hello you.”
echo Greeting; // outputs “Hello you.”
 
?>
******************************************/
define(IN_ECS’, true); //定义一个常量IN_ECS 值为true
 
/**************************************
require_once()
require_once() 语句在脚本执行期间包括并运行指定文件。此行为和 require() 语句类似,
唯一区别是如果该文件中的代码已经被包括了,则不会再次包括。
require_once() 在 Windows 下不区分大小写
 
***************************************/
require_once(includes/init.php);
 
/***************************
常量DEBUG_MODE是在文件init.php中定义的
****************************/
if (!DEBUG_MODE)
{
 
/***************************************
Smarty是一个php模板引擎.
更准确的说,它分开了逻辑程序和外在的内容,提供了一种易于管理的方法
可以描述为应用程序员和美工扮演了不同的角色,因为在大多数情况下 ,他们不可能是同一个人.
例如,你正在创建一个用于浏览新闻的网页,新闻标题,标签栏,作者和内容等都是内容要素,他们并不包含应该怎样去呈现.
在Smarty的程序里,这些被忽略了.模板设计者们编辑模板,组合使用html标签和模板标签去格式化这些要素的输出(html表
格,背景色,字体大小,样式表,等等).
有一天程序员想要改变文章检索的方式(也就是程序逻辑的改变).这个改变不影响模板设计者,内容仍将准确的输出到模板.
同样的,哪天美工吃多了想要完全重做界面,也不会影响到程序逻辑.
因此,程序员可以改变逻辑而不需要重新构建模板,模板设计者可以改变模板而不影响到逻辑.
 
在init.php中
 
require_once(ROOT_PATH.”includes/smarty/Smarty.class.php”);
****************************************/
$smarty->caching = TRUE;
}
/*******************************************
$_GET变量是通过get方法从表单中获取“值”的
$_GET变量是一个包含名称[name]何值[value]的数组(这些名称和值是通过HTTP GET方法发送的,且都可以利用)。
$_GET变量使用“method=get”来获取表单信息。通过GET方法发送的信息是可见的(它将显示在浏览器的地址栏里),并且
它有长度限制(信息的总长度不能超过100个字符[character])。
 
********************************************/
 
/* Shopex系统地址转换 */
if(!empty($_GET["gOo"]))
{
/* 商品分类。*/
if(!empty($_GET["gcat"]))
{
$Loaction = “category.php?id=$_GET[gcat]“;
}
/* 文章分类。*/
elseif(!empty($_GET["acat"]))
{
$Loaction = “article_cat.php?id=$_GET[acat]“;
}
/* 商品详情。*/
elseif(!empty($_GET["goodsid"]))
{
$Loaction = “goods.php?id=$_GET[goodsid]“;
}
/* 文章详情。*/
elseif(!empty($_GET["articleid"]))
{
$Loaction = “article.php?id=$_GET[articleid]“;
}
if(!empty($Loaction))
{
/***************************************************
header的用法
标头 (header) 是服务器以 HTTP 协议传 HTML 资料到浏览器前所送出的字串,在标头
与 HTML 文件之间尚需空一行分隔。有关 HTTP 的详细说明,可以参 RFC 2068 官方文件
(http://www.w3.org/Protocols/rfc2068/rfc2068)。在 PHP 中送回 HTML 资料前,需先
传完所有的标头。
 
注意: 传统的标头一定包含下面三种标头之一,并只能出现一次。
 
Content-Type: xxxx/yyyy
Location: xxxx:yyyy/zzzz
Status: nnn xxxxxx
 
在新的多型标头规格 (Multipart MIME) 方可以出现二次以上。
 
使用范例
 
范例一: 本例使浏览器重定向到 PHP 的官方网站。
<?php
Header(“Location: http://www.php.net“;);
exit;
?>
 
范例二: 要使用者每次都能得到最新的资料,而不是 Proxy 或 cache 中的资料,可以使用下列的标头
 
<?php
header(“Expires: Mon, 26 Jul 1997 05:00:00 GMT”);
header(“Last-Modified: ” . gmdate(“D, d M Y H:i:s”) . “GMT”);
header(“Cache-Control: no-cache, must-revalidate”);
header(“Pragma: no-cache”);
?>
 
范例三: 让使用者的浏览器出现找不到档案的信息。
<?php
header(“Status: 404 Not Found”);
?>
 
范例四:让使用者下载档案。
 
<?php
header(“Content-type: application/x-gzip”);
header(“Content-Disposition: attachment; filename=文件名”);
header(“Content-Description: PHP3 Generated Data”);
?>
 
***************************************************/
header(Location: $Loactionn);
exit;
}
}
/******************************************************
 
Session常见函数及用法?
Session_start() :开始一个会话或者返回已经存在的会话。
说明:这个函数没有参数,且返回值均为true。如果你使用基于cookie的session(cookie-based sessions),那么在使用Session_start()之前浏览器不能有任何输出,
否则会发生以下错误: Warning: Cannot send session cache limiter – headers already sent
你可以在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.
?>
 
有两种方法传递一个会话 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>”;
?>
 
● 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 />”;
?>
 
● 如何删除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,所以此函数可以打入冷宫了。
 
返回值:布尔值。
 
******************************************************/
 
/* 缓存编号 */
$cache_id = $_SESSION['user_rank'].’-’.$_CFG['lang'];
 
if (!$smarty->is_cached(index.html’, $cache_id))
{
 
/************************************
在includes/lib_main.php中定义的函数
*************************************/
assign_nav();
assign_ur_here();
assign_categories();
assign_dynamic(index);
assign_help();
assign_top10();
assign_vote();
assign_invoice_query();
assign_new_articles();
assign_plugins();
 
$smarty->assign(best_goods’, recommend_goods(best));
$smarty->assign(new_goods’, recommend_goods(new));
$smarty->assign(hot_goods’, recommend_goods(hot));
$smarty->assign(promotion_goods’, recommend_goods(promote));
 
/* meta information */
$smarty->assign(keywords’, htmlspecialchars($_CFG['shop_desc']));
$smarty->assign(description’, htmlspecialchars($_CFG['shop_desc']));
 
/* rss url */
$feed_url = ($_CFG['rewrite'] == 1) ? ‘feed.xml’ : ‘feed.php’;
$smarty->assign(feed_url’, $feed_url);
/**********************************************************************
数据库访问采用ADODB
在init.php
require_once(ROOT_PATH.”includes/adodb/adodb.inc.php”);
ADODB 是 Active Data Objects Data Base 的简称,它是一种 PHP 存取数据库的函式组件。
虽然 PHP 是建构 Web 系统强有力的工具,但是 PHP 存取数据库的功能,一直未能标准化,每一种数据库,
都使用另一种不同且不兼容的应用程序接口(API)。为了填补这个缺憾,因此才有 ADODB 的出现。一旦存取数
据库的接口予以标准化,就能隐藏各种数据库的差异,若欲转换至其它不同的数据库,将变得十分容易。
目前 ADODB 支持的数据库种类非常地多,例如:MySQL, PostgreSQL, Interbase, Informix, Oracle, MS SQL 7,
Foxpro, Access, ADO, Sybase, DB2 以及一般的 ODBC (其中 PostgreSQL、Informix、Sybase 的driver 是由自
由软件社群发展之后贡献出来的)。
使用 ADODB 最大的优点之一是:不管后端数据库如何,存取数据库的方式都是一致的,开发设计人员不必为了某
一套数据库,而必须再学习另一套不同的存取方法,这大大减轻开发人员的知识负担,过去的知识往后仍可继续
使用,转移数据库平台时,程序代码也不必做太大的更动。
 
***********************************************************************/
 
/* links */
$sql = “SELECT * FROM ” .$ecs->table(friend_link). ” ORDER BY show_order”;
$all = $db->getAll($sql);
 
$img_links = array();
$txt_links = array();
 
foreach ($all AS $key=>$row)
{
if (!empty($row['link_logo']))
{
$img_links[$key] = array(id’ => $key,
‘name’ => $row['link_name'],
‘url’ => $row['link_url'],
‘logo’ => $row['link_logo']);
}
else
{
$txt_links[$key] = array(id’ => $key,
‘name’ => $row['link_name'],
‘url’ => $row['link_url']);
}
}
 
$smarty->assign(img_links’, $img_links);
$smarty->assign(txt_links’, $txt_links);
}
 
$smarty->display(index.html’, $cache_id);
?>