ECSHOP 源码分析(index.php)

本文深入探讨PHP中的常量定义与使用方法,包括定义、访问及大小写敏感性等特性;同时详述Session的工作原理、函数应用及注意事项,如会话开始、变量注册与管理等关键技术点。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 

<?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: $Loaction/n");
  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);
?>

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值