- ECSHOP 源码分析(index.php) 收藏
- <?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(!emptyempty($_GET["gOo"]))
- {
- /* 商品分类。*/
- if(!emptyempty($_GET["gcat"]))
- {
- $Loaction = "category.php?id=$_GET[gcat]";
- }
- /* 文章分类。*/
- elseif(!emptyempty($_GET["acat"]))
- {
- $Loaction = "article_cat.php?id=$_GET[acat]";
- }
- /* 商品详情。*/
- elseif(!emptyempty($_GET["goodsid"]))
- {
- $Loaction = "goods.php?id=$_GET[goodsid]";
- }
- /* 文章详情。*/
- elseif(!emptyempty($_GET["articleid"]))
- {
- $Loaction = "article.php?id=$_GET[articleid]";
- }
- if(!emptyempty($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 (!emptyempty($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);
- ?>
源码分析index.php zz
最新推荐文章于 2024-08-02 15:49:51 发布