源码分析index.php zz

Code:
  1. ECSHOP 源码分析(index.php) 收藏  
  2.   
  3. <?php  
  4. /*********************************************** 
  5. define -- Defines a named constant 
  6. 定义常量 
  7. bool define ( string name, mixed value [, bool case_insensitive]) 
  8. 参数说明 
  9. name :常量名 
  10. value:常量值 
  11. case_insensitive:大小写区分 true 为不区分,默认为false 
  12. 例: 
  13. <?php 
  14. define("CONSTANT", "Hello world."); 
  15. echo CONSTANT; // outputs "Hello world." 
  16. echo Constant; // outputs "Constant" and issues a notice. 
  17.  
  18. define("GREETING", "Hello you.", true); 
  19. echo GREETING; // outputs "Hello you." 
  20. echo Greeting; // outputs "Hello you." 
  21.  
  22. ?> 
  23. ******************************************/  
  24. define('IN_ECS', true);  //定义一个常量IN_ECS 值为true  
  25.   
  26. /************************************** 
  27. require_once() 
  28. require_once() 语句在脚本执行期间包括并运行指定文件。此行为和 require() 语句类似, 
  29. 唯一区别是如果该文件中的代码已经被包括了,则不会再次包括。 
  30. require_once() 在 Windows 下不区分大小写 
  31.  
  32. ***************************************/  
  33. require_once('includes/init.php');  
  34.   
  35. /*************************** 
  36. 常量DEBUG_MODE是在文件init.php中定义的 
  37. ****************************/  
  38. if (!DEBUG_MODE)  
  39. {  
  40.   
  41. /*************************************** 
  42. Smarty是一个php模板引擎. 
  43. 更准确的说,它分开了逻辑程序和外在的内容,提供了一种易于管理的方法 
  44. 可以描述为应用程序员和美工扮演了不同的角色,因为在大多数情况下 ,他们不可能是同一个人. 
  45. 例如,你正在创建一个用于浏览新闻的网页,新闻标题,标签栏,作者和内容等都是内容要素,他们并不包含应该怎样去呈现. 
  46. 在Smarty的程序里,这些被忽略了.模板设计者们编辑模板,组合使用html标签和模板标签去格式化这些要素的输出(html表 
  47. 格,背景色,字体大小,样式表,等等). 
  48. 有一天程序员想要改变文章检索的方式(也就是程序逻辑的改变).这个改变不影响模板设计者,内容仍将准确的输出到模板. 
  49. 同样的,哪天美工吃多了想要完全重做界面,也不会影响到程序逻辑. 
  50. 因此,程序员可以改变逻辑而不需要重新构建模板,模板设计者可以改变模板而不影响到逻辑. 
  51.  
  52. 在init.php中 
  53. require_once(ROOT_PATH."includes/smarty/Smarty.class.php"); 
  54. ****************************************/  
  55.     $smarty->caching = TRUE;  
  56. }  
  57.   
  58. /******************************************* 
  59. $_GET变量是通过get方法从表单中获取“值”的 
  60. $_GET变量是一个包含名称[name]何值[value]的数组(这些名称和值是通过HTTP GET方法发送的,且都可以利用)。 
  61. $_GET变量使用“method=get”来获取表单信息。通过GET方法发送的信息是可见的(它将显示在浏览器的地址栏里),并且 
  62. 它有长度限制(信息的总长度不能超过100个字符[character])。 
  63.  
  64. ********************************************/  
  65.   
  66. /* Shopex系统地址转换 */  
  67. if(!emptyempty($_GET["gOo"]))  
  68. {  
  69.  /* 商品分类。*/  
  70.  if(!emptyempty($_GET["gcat"]))  
  71.  {  
  72.   $Loaction = "category.php?id=$_GET[gcat]";  
  73.  }  
  74.  /* 文章分类。*/  
  75.  elseif(!emptyempty($_GET["acat"]))  
  76.  {  
  77.   $Loaction = "article_cat.php?id=$_GET[acat]";  
  78.  }  
  79.  /* 商品详情。*/  
  80.  elseif(!emptyempty($_GET["goodsid"]))  
  81.  {  
  82.   $Loaction = "goods.php?id=$_GET[goodsid]";  
  83.  }  
  84.  /* 文章详情。*/  
  85.  elseif(!emptyempty($_GET["articleid"]))  
  86.  {  
  87.   $Loaction = "article.php?id=$_GET[articleid]";  
  88.  }  
  89.  if(!emptyempty($Loaction))  
  90.  {  
  91.  /*************************************************** 
  92.  header的用法 
  93.     标头 (header) 是服务器以 HTTP 协议传 HTML 资料到浏览器前所送出的字串,在标头 
  94.     与 HTML 文件之间尚需空一行分隔。有关 HTTP 的详细说明,可以参 RFC 2068 官方文件 
  95.     (http://www.w3.org/Protocols/rfc2068/rfc2068)。在 PHP 中送回 HTML 资料前,需先 
  96.     传完所有的标头。 
  97.  
  98.      注意: 传统的标头一定包含下面三种标头之一,并只能出现一次。 
  99.  
  100.     Content-Type: xxxx/yyyy 
  101.     Location: xxxx:yyyy/zzzz 
  102.     Status: nnn xxxxxx 
  103.  
  104.     在新的多型标头规格 (Multipart MIME) 方可以出现二次以上。 
  105.  
  106.     使用范例 
  107.  
  108.     范例一: 本例使浏览器重定向到 PHP 的官方网站。 
  109.     <?php 
  110.      Header("Location: http://www.php.net";); 
  111.      exit; 
  112.      ?> 
  113.  
  114.     范例二: 要使用者每次都能得到最新的资料,而不是 Proxy 或 cache 中的资料,可以使用下列的标头 
  115.    <?php 
  116.      header("Expires: Mon, 26 Jul 1997 05:00:00 GMT"); 
  117.      header("Last-Modified: " . gmdate("D, d M Y H:i:s") . "GMT"); 
  118.      header("Cache-Control: no-cache, must-revalidate"); 
  119.      header("Pragma: no-cache"); 
  120.    ?> 
  121.  
  122.     范例三: 让使用者的浏览器出现找不到档案的信息。 
  123.     <?php 
  124.        header("Status: 404 Not Found"); 
  125.     ?> 
  126.  
  127.       范例四:让使用者下载档案。 
  128.  
  129.     <?php 
  130.       header("Content-type: application/x-gzip"); 
  131.       header("Content-Disposition: attachment; filename=文件名"); 
  132.       header("Content-Description: PHP3 Generated Data"); 
  133.      ?>  
  134.  
  135.  ***************************************************/  
  136.   header("Location: $Loaction/n");  
  137.   exit;  
  138.  }  
  139. }  
  140. /****************************************************** 
  141.  
  142. Session常见函数及用法? 
  143. Session_start() :开始一个会话或者返回已经存在的会话。 
  144. 说明:这个函数没有参数,且返回值均为true。如果你使用基于cookie的session(cookie-based sessions),那么在使用Session_start()之前浏览器不能有任何输出,否则会发生以下错误: Warning: Cannot send session cache limiter - headers already sent 
  145. 你可以在php.ini里启动session.auto_start=1,这样就无需每次使用session之前都要调用session_start()。 
  146. 但启用该选项也有一些限制,如果确实启用了 session.auto_start,则不能将对象放入会话中,因为类定义必须在启动会话之前加载以在会话中重建对象。 
  147. 请求结束后所有注册的变量都会被序列化。已注册但未定义的变量被标记为未定义。在之后的访问中这些变量也未被会话模块定义,除非用户以后定义它们。 
  148. 警告: 有些类型的数据不能被序列化因此也就不能保存在会话中。包括 resource 变量或者有循环引用的对象(即某对象将一个指向自己的引用传递给另一个对象)。 
  149. 注册SESSION变量 : 
  150. PHP5使用$_SESSION[‘xxx’]=xxx注册SESSION全局变量。和GET,POST,COOKIE的使用方法相似。 
  151.  
  152. 注意:session_register(),session_unregister ,session_is_registered在php5下不再使用,除非在php.ini里把register_globle设为on, 
  153. 不过出于安全考虑,强烈建议关闭register_globle。HTTP_SESSION_VARS也不提倡使用了,官方建议用$_SESSION代替之。例如: 
  154.  
  155. Page1.php 
  156. <?php 
  157. Session_start(); //使用SESSION前必须调用该函数。 
  158. $_SESSION[‘name’]=”我是黑旋风李逵!”; //注册一个SESSION变量 
  159. $_SESSION[‘passwd’]=”mynameislikui”; 
  160. $_SESSION[‘time’]=time(); 
  161. echo '<br /><a href="page2.php">通过COOKIE传递SESSION</a>'; //如果客户端支持cookie,可通过该链接传递session到下一页。 
  162. echo '<br /><a href="page2.php?' . SID . '">通过URL传递SESSION</a>';//客户端不支持cookie时,使用该办法传递session. 
  163. ?> 
  164. 有两种方法传递一个会话 ID: 
  165. cookie 
  166. URL 参数 
  167. 会话模块支持这两种方法。cookie 更优化,但由于不总是可用,也提供替代的方法。第二种方法直接将会话 ID 嵌入到 URL 中间去。 
  168. PHP 可以透明地转换连接。除非是使用 PHP 4.2 或更新版本,需要手工在编译 PHP 时激活。在 Unix 下,用 --enable-trans-sid 配置选项。 
  169. 如果此配置选项和运行时选项 session.use_trans_sid 都被激活(修改php.ini),相对 URI 将被自动修改为包含会话 ID。 
  170. ● session_id 
  171. session_id() 用于设定或取得当前session_id。php5中既可以使用session_id(),也可以通过附加在url上的SID取得当前会话的session_id和session_name。 
  172. 如果session_id()有具体指定值的话,将取代当前的session_id值。使用该函数前必须启动会话:session_start(); 
  173. 当我们使用session cookies时,如果指定了一个session_id()值,每次启动session_start()都会往客户端发送一个cookie值。不论当前session_id是否与指定值相等。 
  174. session_id()如果没有指定值,则返回当前session_id();当前会话没有启动的话,则返回空字符串。 
  175. ● 检查session是否存在? 
  176. 在以往的php版本中通常使用session_is_register()检查session是否存在,如果您使用$_SESSION[‘XXX’]=XXX来注册会话变量, 
  177. 则session_is_register()函数不再起作用。你可以使用 
  178. isset($_SESSION[‘xxx’])来替代。 
  179. ● 更改session_id session_regenerate_id() 更改成功则返回true,失败则返回false。 
  180. 使用该函数可以为当前session更改session_id,但不改变当前session的其他信息。例如: 
  181.  
  182. <?php 
  183. session_start(); 
  184. $old_sessionid = session_id(); 
  185. session_regenerate_id(); 
  186. $new_sessionid = session_id(); 
  187. echo "原始 SessionID: $old_sessionid<br />"; 
  188. echo "新的 SessionID: $new_sessionid<br />"; 
  189. echo"<pre>"; 
  190. print_r($_SESSION); 
  191. echo"</pre>"; 
  192. ?> 
  193.  
  194. ● session_name() 返回当前session的name或改变当前session的name。如果要改变当前session的name,必须在session_start()之前调用该函数。 
  195. 注意:session_name不能只由数字组成,它至少包含一个字母。否则会在每时每刻都生成一个新的session id. 
  196. session改名示例: 
  197. <?php 
  198. $previous_name = session_name("WebsiteID"); 
  199. echo "新的session名为: $previous_name<br />"; 
  200. ?> 
  201.  
  202. ● 如何删除session? 
  203.  
  204. 1、unset ($_SESSION['xxx']) 删除单个session,unset($_SESSION['xxx']) 用来unregister一个已注册的session变量。其作用和session_unregister()相同。 
  205. session_unregister()在PHP5中不再使用,可将之打入冷宫。 
  206. unset($_SESSION) 此函数千万不可使用,它会将全局变量$_SESSION销毁,而且还没有可行的办法将其恢复。用户也不再可以注册$_SESSION变量。 
  207. 2、$_SESSION=array() 删除多个session 
  208. 3、session_destroy()结束当前的会话,并清空会话中的所有资源。。该函数不会unset(释放)和当前session相关的全局变量(globalvariables), 
  209. 也不会删除客户端的session cookie.PHP默认的session是基于cookie的,如果要删除cookie的话,必须借助setcookie()函数。 
  210. 功能说明:这个函数结束当前的session,此函数没有参数,且返回值均为true 
  211. session_unset() 如果使用了$_SESSION,则该函数不再起作用。由于PHP5必定要使用$_SESSION,所以此函数可以打入冷宫了。 
  212.  
  213. 返回值:布尔值。  
  214.  
  215. ******************************************************/  
  216.   
  217.   
  218. /* 缓存编号 */  
  219. $cache_id = $_SESSION['user_rank'].'-'.$_CFG['lang'];  
  220.   
  221. if (!$smarty->is_cached('index.html'$cache_id))  
  222. {  
  223.   
  224.     /************************************ 
  225.    在includes/lib_main.php中定义的函数 
  226.  *************************************/  
  227.     assign_nav();  
  228.     assign_ur_here();  
  229.     assign_categories();  
  230.     assign_dynamic('index');  
  231.     assign_help();  
  232.     assign_top10();  
  233.     assign_vote();  
  234.     assign_invoice_query();  
  235.  assign_new_articles();  
  236.     assign_plugins();  
  237.    
  238.     $smarty->assign('best_goods',       recommend_goods('best'));  
  239.     $smarty->assign('new_goods',        recommend_goods('new'));  
  240.     $smarty->assign('hot_goods',        recommend_goods('hot'));  
  241.     $smarty->assign('promotion_goods',  recommend_goods('promote'));  
  242.   
  243.     /* meta information */  
  244.     $smarty->assign('keywords',     htmlspecialchars($_CFG['shop_desc']));  
  245.     $smarty->assign('description',  htmlspecialchars($_CFG['shop_desc']));  
  246.   
  247.     /* rss url */  
  248.     $feed_url = ($_CFG['rewrite'] == 1) ? 'feed.xml' : 'feed.php';  
  249.     $smarty->assign('feed_url',         $feed_url);  
  250.     /********************************************************************** 
  251.  数据库访问采用ADODB 
  252.  在init.php 
  253.  require_once(ROOT_PATH."includes/adodb/adodb.inc.php"); 
  254.  ADODB 是 Active Data Objects Data Base 的简称,它是一种 PHP 存取数据库的函式组件。 
  255.     虽然 PHP 是建构 Web 系统强有力的工具,但是 PHP 存取数据库的功能,一直未能标准化,每一种数据库, 
  256.  都使用另一种不同且不兼容的应用程序接口(API)。为了填补这个缺憾,因此才有 ADODB 的出现。一旦存取数 
  257.  据库的接口予以标准化,就能隐藏各种数据库的差异,若欲转换至其它不同的数据库,将变得十分容易。 
  258.     目前 ADODB 支持的数据库种类非常地多,例如:MySQL, PostgreSQL, Interbase, Informix, Oracle, MS SQL 7, 
  259.   Foxpro, Access, ADO, Sybase, DB2 以及一般的 ODBC (其中 PostgreSQL、Informix、Sybase 的driver 是由自 
  260.   由软件社群发展之后贡献出来的)。 
  261.      使用 ADODB 最大的优点之一是:不管后端数据库如何,存取数据库的方式都是一致的,开发设计人员不必为了某 
  262.   一套数据库,而必须再学习另一套不同的存取方法,这大大减轻开发人员的知识负担,过去的知识往后仍可继续 
  263.   使用,转移数据库平台时,程序代码也不必做太大的更动。 
  264.  
  265.  ***********************************************************************/  
  266.     /* links */  
  267.     $sql = "SELECT * FROM " .$ecs->table('friend_link'). " ORDER BY show_order";  
  268.     $all = $db->getAll($sql);  
  269.   
  270.     $img_links = array();  
  271.     $txt_links = array();  
  272.   
  273.     foreach ($all AS $key=>$row)  
  274.     {  
  275.         if (!emptyempty($row['link_logo']))  
  276.         {  
  277.             $img_links[$key] = array(   'id'    => $key,  
  278.                                         'name'  => $row['link_name'],  
  279.                                         'url'   => $row['link_url'],  
  280.                                         'logo'  => $row['link_logo']);  
  281.         }  
  282.         else  
  283.         {  
  284.             $txt_links[$key] = array(   'id'    => $key,  
  285.                                         'name'  => $row['link_name'],  
  286.                                         'url'   => $row['link_url']);  
  287.         }  
  288.     }  
  289.      
  290.     $smarty->assign('img_links'$img_links);  
  291.     $smarty->assign('txt_links'$txt_links);  
  292. }  
  293.   
  294.   
  295. $smarty->display('index.html'$cache_id);  
  296. ?>  
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值