ecshop 分析

ecshop

2015-01-08 22:15

首先每个页面都会载入 include/init.php





if (!defined('IN_ECS'))   每个页面都要设置核心常量  define('IN_ECS', true); 否则 无法调用init.php

{

    die('Hacking attempt');

}


error_reporting(E_ALL);  错误提示


if (__FILE__ == '')      不知道干啥的

{

    die('Fatal error code: 0');

}


/* 取得当前ecshop所在的根目录 */

define('ROOT_PATH', str_replace('includes/init.php', '', str_replace('\\', '/', __FILE__)));

判断 data/install.lock是否存在 是否跳转到安装install目录

if (!file_exists(ROOT_PATH . 'data/install.lock') && !file_exists(ROOT_PATH . 'includes/install.lock')

    && !defined('NO_CHECK_INSTALL'))

{

    header("Location: ./install/index.php\n");


    exit;

}


/* 初始化设置 */

@ini_set('memory_limit',          '64M');  设定了一个脚本所能够申请到的最大内存数。防止写得不好的脚本消耗光

@ini_set('session.cache_expire',  180);     指定会话页面在客户端cache中的有效期限(分钟)

@ini_set('session.use_trans_sid', 0);     是否使用明码在URL中显示会话ID。 默认是禁止,它会给你的用户带来安全危险: 

@ini_set('session.use_cookies',   1);    是否使用cookie在客户端保存会话ID

@ini_set('session.auto_start',    0);    在客户访问任何页面时都自动初始化会话,默认禁止。; 因为类定义必须在会话启动之前被载入,所以若打开这个选项,你就不能在会话中存放对象。

@ini_set('display_errors',        1);  是否将错误信息作为输出的一部分显示


if (DIRECTORY_SEPARATOR == '\\')  目录分隔符,是定义php的内置变量。在调试机器上,在windows我们习惯性的使用“\”作为文件分隔符,但是在linux上系统不认识这个标识,于是就要引入这个php内置变量了:DIRECTORY_SEPARATOR

{

    @ini_set('include_path', '.;' . ROOT_PATH);

这段代码的作用是在 php的 include_path中增加 ROOT_PATH,
由于windows和unix,linux其他操作系统分隔符不同,分别为分号和冒号。
这段代码就通过判断路径分隔符(DIRECTORY_SEPARATOR)是否为'\\'
(windows路径分隔符 \ )来区分哪一个操作系统,从而实现ini_set操作

}

else

{

    @ini_set('include_path', '.:' . ROOT_PATH);

}


require(ROOT_PATH . 'data/config.php'); 载入配置文件



if (defined('DEBUG_MODE') == false)    如果没有设置常量 自动设置为0

{

    define('DEBUG_MODE', 0);

}


if (PHP_VERSION >= '5.1' && !empty($timezone)) 如果版本大于5.1 并且timezone 不为空 设置时区

{

    date_default_timezone_set($timezone);

}


$php_self = isset($_SERVER['PHP_SELF']) ? $_SERVER['PHP_SELF'] : $_SERVER['SCRIPT_NAME'];

if ('/' == substr($php_self, -1))

{

    $php_self .= 'index.php';

}                                 如果是主目录 设置脚本首页的inde.php

define('PHP_SELF', $php_self); 定义常量

载入配置文件

require(ROOT_PATH . 'includes/inc_constant.php');  各种配置参数定义

require(ROOT_PATH . 'includes/cls_ecshop.php');   表名字 表前缀 数据目录 图片目录参数类

require(ROOT_PATH . 'includes/cls_error.php');    错误提示类

require(ROOT_PATH . 'includes/lib_time.php');  时间工具类

require(ROOT_PATH . 'includes/lib_base.php'); 常用函数

require(ROOT_PATH . 'includes/lib_common.php'); 核心函数

require(ROOT_PATH . 'includes/lib_main.php'); 各种函数 

require(ROOT_PATH . 'includes/lib_insert.php');  模板调用insert 命令的对应函数

require(ROOT_PATH . 'includes/lib_goods.php'); 商品方面的函数库

require(ROOT_PATH . 'includes/lib_article.php'); 文章方便面的函数库


/* 对用户传入的变量进行转义操作。*/

if (!get_magic_quotes_gpc())

{

    if (!empty($_GET))

    {

        $_GET  = addslashes_deep($_GET);

    }

    if (!empty($_POST))

    {

        $_POST = addslashes_deep($_POST);

    }


    $_COOKIE   = addslashes_deep($_COOKIE);

    $_REQUEST  = addslashes_deep($_REQUEST);

}


/* 创建 ECSHOP 对象 */

$ecs = new ECS($db_name, $prefix);

define('DATA_DIR', $ecs->data_dir());设置数据目录

define('IMAGE_DIR', $ecs->image_dir()); 设置图片目录


/* 初始化数据库类 */

require(ROOT_PATH . 'includes/cls_mysql.php');

$db = new cls_mysql($db_host, $db_user, $db_pass, $db_name);

$db->set_disable_cache_tables(array($ecs->table('sessions'), $ecs->table('sessions_data'), $ecs->table('cart')));

$db_host = $db_user = $db_pass = $db_name = NULL;


/* 创建错误处理对象 */

$err = new ecs_error('message.dwt'); 错误信息


/* 载入系统参数 */

$_CFG = load_config(); 读取 shop_config 表里的数据 有缓存的 在lib_common.php


/* 载入语言文件 */

require(ROOT_PATH . 'languages/' . $_CFG['lang'] . '/common.php');


if ($_CFG['shop_closed'] == 1)

{

    /* 商店关闭了,输出关闭的消息 */

    header('Content-type: text/html; charset='.EC_CHARSET);


    die('<div style="margin: 150px; text-align: center; font-size: 14px"><p>' . $_LANG['shop_closed'] . '</p><p>' . $_CFG['close_comment'] . '</p></div>');

}


if (is_spider())          is_spider()判断是否为搜索引擎蜘蛛 lib_main.php

{

    /* 如果是蜘蛛的访问,那么默认为访客方式,并且不记录到日志中 */

    if (!defined('INIT_NO_USERS'))

    {

        define('INIT_NO_USERS', true);

        /* 整合UC后,如果是蜘蛛访问,初始化UC需要的常量 */

        if($_CFG['integrate_code'] == 'ucenter')

        {

             $user = & init_users();

        }

    }

    $_SESSION = array();

    $_SESSION['user_id']     = 0;

    $_SESSION['user_name']   = '';

    $_SESSION['email']       = '';

    $_SESSION['user_rank']   = 0;

    $_SESSION['discount']    = 1.00;

}


if (!defined('INIT_NO_USERS'))

{

    /* 初始化session */

    include(ROOT_PATH . 'includes/cls_session.php');        session 存在数据库中


    $sess = new cls_session($db, $ecs->table('sessions'), $ecs->table('sessions_data'));


    define('SESS_ID', $sess->get_session_id()); cookie的值

}

if(isset($_SERVER['PHP_SELF']))

{

    $_SERVER['PHP_SELF']=htmlspecialchars($_SERVER['PHP_SELF']);

}

if (!defined('INIT_NO_SMARTY'))

{

    header('Cache-control: private');

    header('Content-type: text/html; charset='.EC_CHARSET);


    /* 创建 Smarty 对象。*/

    require(ROOT_PATH . 'includes/cls_template.php');

    $smarty = new cls_template;


    $smarty->cache_lifetime = $_CFG['cache_time'];

    $smarty->template_dir   = ROOT_PATH . 'themes/' . $_CFG['template'];

    $smarty->cache_dir      = ROOT_PATH . 'temp/caches';

    $smarty->compile_dir    = ROOT_PATH . 'temp/compiled';


    if ((DEBUG_MODE & 2) == 2) &是按位与,也就是DEBUG_MODE的值不等于0或者2时,执行下面代码

    {

        $smarty->direct_output = true; 直接输出

        $smarty->force_compile = true; 强制编译

    }

    else

    {

        $smarty->direct_output = false;

        $smarty->force_compile = false;

    }


    $smarty->assign('lang', $_LANG);

    $smarty->assign('ecs_charset', EC_CHARSET);

    if (!empty($_CFG['stylename'])) 如果有多样式设置

    {

        $smarty->assign('ecs_css_path', 'themes/' . $_CFG['template'] . '/style_' . $_CFG['stylename'] . '.css');

    }

    else

    {

        $smarty->assign('ecs_css_path', 'themes/' . $_CFG['template'] . '/style.css');

    }


}


if (!defined('INIT_NO_USERS'))

{

    /* 会员信息 */

    $user =& init_users(); 会员类 


    if (!isset($_SESSION['user_id']))

    {

        /* 获取投放站点的名称 */

        $site_name = isset($_GET['from'])   ? htmlspecialchars($_GET['from']) : addslashes($_LANG['self_site']);

        $from_ad   = !empty($_GET['ad_id']) ? intval($_GET['ad_id']) : 0;


        $_SESSION['from_ad'] = $from_ad; // 用户点击的广告ID

        $_SESSION['referer'] = stripslashes($site_name); // 用户来源


        unset($site_name);


        if (!defined('INGORE_VISIT_STATS'))

        {

            visit_stats();

        }

    }


    if (empty($_SESSION['user_id']))

    {

        if ($user->get_cookie())

        {

            /* 如果会员已经登录并且还没有获得会员的帐户余额、积分以及优惠券 */

            if ($_SESSION['user_id'] > 0)

            {

                update_user_info();

            }

        }

        else

        {

            $_SESSION['user_id']     = 0;

            $_SESSION['user_name']   = '';

            $_SESSION['email']       = '';

            $_SESSION['user_rank']   = 0;

            $_SESSION['discount']    = 1.00;

            if (!isset($_SESSION['login_fail']))

            {

                $_SESSION['login_fail'] = 0;

            }

        }

    }


    /* 设置推荐会员 */

    if (isset($_GET['u']))

    {

        set_affiliate();

    }


    /* session 不存在,检查cookie */

    if (!empty($_COOKIE['ECS']['user_id']) && !empty($_COOKIE['ECS']['password']))

    {

        // 找到了cookie, 验证cookie信息

        $sql = 'SELECT user_id, user_name, password ' .

                ' FROM ' .$ecs->table('users') .

                " WHERE user_id = '" . intval($_COOKIE['ECS']['user_id']) . "' AND password = '" .$_COOKIE['ECS']['password']. "'";


        $row = $db->GetRow($sql);


        if (!$row)

        {

            // 没有找到这个记录

           $time = time() - 3600;

           setcookie("ECS[user_id]",  '', $time, '/');

           setcookie("ECS[password]", '', $time, '/');

        }

        else

        {

            $_SESSION['user_id'] = $row['user_id'];

            $_SESSION['user_name'] = $row['user_name'];

            update_user_info();     更新用户SESSION,COOKIE及登录时间、登录次数。

        }

    }


    if (isset($smarty))

    {

        $smarty->assign('ecs_session', $_SESSION);

    }

}


if ((DEBUG_MODE & 1) == 1)

{

    error_reporting(E_ALL);

}

else

{

    error_reporting(E_ALL ^ (E_NOTICE | E_WARNING)); 

}

if ((DEBUG_MODE & 4) == 4)

{

    include(ROOT_PATH . 'includes/lib.debug.php');

}


/* 判断是否支持 Gzip 模式 */

if (!defined('INIT_NO_SMARTY') && gzip_enabled())

{

    ob_start('ob_gzhandler');

}

else

{

    ob_start();

}

------------------------------------------------------------

打开“/data/config.php”添加以下代码:

define('DEBUG_MODE', 0);

参数说明:


0 //禁用调试模式

1 //显示所有错误

2 //禁用Smarty缓存

4 //使用includes/lib.debug.php

8 //记录查询的SQL“includes/cls_mysql.php query()”到“data/mysql_query_hash_Y_M_D.log”。


lib_main.php ECSHOP 前台公用函数库


update_user_info    更新用户SESSION,COOKIE及登录时间、登录次数。

get_user_info     获取用户信息数组

assign_ur_here    取得当前位置和页面标题

get_parent_cats    获得指定分类的所有上级分类

build_pagetitle 根据提供的数组编译成页面标题

build_urhere 根据提供的数组编译成当前位置

assign_dynamic    获得指定页面的动态内容

assign_articles 分配文章列表给smarty

get_shop_help 分配帮助信息

assign_pager 创建分页信息

get_pager    生成给pager.lbi赋值的数组

get_vote 调用调查内容

get_user_browser 获得浏览器名称和版本

is_spider 判断是否为搜索引擎蜘蛛

get_os 获得客户端的操作系统

visit_stats 统计访问信息

save_searchengine_keyword 保存搜索引擎关键字

get_tags 获得指定用户、商品的所有标记

get_dyna_libs 获取指定主题某个模板的主题的动态模块

dyna_libs_replace 替换动态模块

upload_file    处理上传文件,并返回上传图片名(上传失败时返回图片名为空)

show_message 显示一个提示信息

parse_rate_value 将一个形如+10, 10, -10, 10%的字串转换为相应数字,并返回操作符号

recalculate_price    重新计算购物车中的商品价格:目的是当用户登录时享受会员价格,当用户退出登录时不享受会员价格

assign_comment 查询评论内容

assign_template 将一些常用的参数调到前台使用

time2gmt 将一个本地时间戳转成GMT时间戳

get_user_bonus 查询会员的红包金额

set_affiliate 保存推荐uid

get_affiliate 获取推荐uid

article_categories_tree    获得指定分类同级的所有分类以及该分类下的子分类

get_article_parent_cats    获得指定文章分类的所有上级分类

get_library_number 取得某模板某库设置的数量

get_navigator 取得自定义导航栏列表

license_info 授权信息内容

url_domain 获取域名


lib_common.php ECSHOP 公用函数库


db_create_in    创建像这样的查询: "IN('a','b')";

is_email 验证输入的邮件地址是否合法

is_time    检查是否为一个合法的时间格式

assign_query_info 获得查询时间和次数,并赋值给smarty

region_result 创建地区的返回信息

get_regions 获得指定国家的所有省份

get_shipping_config 获得配送区域中指定的配送方式的配送费用的计算参数

&init_users 初始化会员数据整合类

cat_list 获得指定分类下的子分类的数组

cat_options 过滤和排序所有分类,返回一个带有缩进级别的数组

load_config 载入配置信息

get_brand_list 取得品牌列表

get_brands    获得某个分类下

get_promotion_info 所有的促销活动信息

get_children 获得指定分类下所有底层分类的ID

get_article_children    获得指定文章分类下所有底层分类的ID

get_mail_template 获取邮件模板

order_action 记录订单操作记录

price_format    格式化商品价格

get_virtual_goods 返回订单中的虚拟商品

virtual_goods_ship 虚拟商品发货

virtual_card_shipping 虚拟卡发货

virtual_card_result 返回虚拟卡信息

get_snatch_result 获取指定 id snatch 活动的结果

clear_tpl_files     清除指定后缀的模板缓存或编译文件

clear_compiled_files 清除模版编译文件

clear_cache_files 清除缓存文件

clear_all_files     清除模版编译和缓存文件

smarty_insert_scripts 页面上调用的js文件

smarty_create_pages 创建分页的列表

build_uri 重写 URL 地址

formated_weight     格式化重量:小于1千克用克表示,否则用千克表示

log_account_change 记录帐户变动

article_cat_list 获得指定分类下的子分类的数组

article_cat_options 过滤和排序所有文章分类,返回一个带有缩进级别的数组

uc_call 调用UCenter的函数

exception_handler error_handle回调函数

get_image_path  重新获得商品图片与商品相册的地址

user_uc_call 调用使用UCenter插件时的函数

get_volume_price_list 取得商品优惠价格列表

get_final_price    取得商品最终使用价格

sort_goods_attr_id_array 将 goods_attr_id 的序列按照 attr_id 重新排序

is_spec 是否存在规格

get_package_info 获取指定id package 的信息

get_package_goods 获得指定礼包的商品

get_good_products 取商品的货品列表

get_good_products_select 取商品的下拉框Select列表

get_specifications_list 取商品的规格列表


lib_main.php ECSHOP 后台管理中心公用函数


read_modules 获得所有模块的名称以及链接地址

sys_msg 系统提示信息

admin_log       记录管理员的操作内容

sys_joindate    将通过表单提交过来的年月日变量合成为"2004-05-10"的格式。

set_admin_session 设置管理员的session内容

insert_config    插入一个配置信息

admin_priv 判断管理员对某一个操作是否有权限

check_authz 检查管理员权限

check_authz_json 检查管理员权限,返回JSON格式数据

get_bonus_type 取得红包类型数组(用于生成下拉列表)

get_rank_list 取得用户等级数组,按用户级别排序

get_user_rank    按等级取得用户列表(用于生成下拉列表)

get_position_list 取得广告位置数组(用于生成下拉列表)

create_html_editor    生成编辑器

get_goods_list    取得商品列表:用于把商品添加到组合、关联类、赠品类

get_article_list    取得文章列表:用于商品关联文章

get_yes_no 返回是否(图标no.gif/yes.gif)

get_where_sql 生成过滤条件:用于 get_goodslist 和 get_goods_list