首页 »
代码以及注释

app/b2core.php

1 <?php
2 /**
3  * B2Core 是由 Brant (brantx@gmail.com)发起的基于PHP的MVC架构
4  * 核心思想是在采用MVC框架的基础上最大限度的保留php的灵活性
5  * */
6
7 define('B2CORE_VERSION','2.0');
8
9 // 载入配置文件:数据库、url路由等等 
10 require(APP.'config.php');
11
12 // 如果配置了数据库则载入
13 if(isset($db_config)){
14   $db = new db($db_config);
15 }
16
17 // 获取请求的地址兼容 SAE
18 $uri '';
19 if(isset($_SERVER['PATH_INFO'])) $uri $_SERVER['PATH_INFO'];
20 if(isset($_SERVER['ORIG_PATH_INFO'])) $uri $_SERVER['ORIG_PATH_INFO'];
21 if(isset($_SERVER['SCRIPT_URL'])) $uri $_SERVER['SCRIPT_URL'];
22 render_url();
23 function render_url()
24
25   // redirect abc/def to abc/def/ to make SEO url 
26   global $uri;
27   if(strpos($uri,'.'))return;
28   if($_SERVER['QUERY_STRING'])return;
29   if(substr($uri,-1)=='/')return;
30   if($uri =='')return;
31   header("HTTP/1.1 301 Moved Permanently");
32   header ('Location:'.$_SERVER['REQUEST_URI'].'/');
33   exit(0);
34 }
35
36 //echo ' 去除Magic_Quotes';
37 if(get_magic_quotes_gpc()) // Maybe would be removed in php6
38 {
39   function stripslashes_deep($value)
40   {
41     $value is_array($value) ? array_map('stripslashes_deep'$value) : (isset($value) ? stripslashes($value) : null);
42     return $value;
43   }
44   $_POST stripslashes_deep($_POST);
45   $_GET stripslashes_deep($_GET);
46   $_COOKIE stripslashes_deep($_COOKIE);
47
48
49 // 执行 config.php 中配置的url路由
50 foreach ($route_config as $key => $val)
51
52   $key str_replace(':any''([^\/.]+)'str_replace(':num''([0-9]+)'$key));
53   if (preg_match('#^'.$key.'#'$uri))$uri preg_replace('#^'.$key.'#'$val$uri);
54 }
55
56 //echo ' 获取URL中每一段的参数';
57 $uri rtrim($uri,'/');
58 $seg explode('/',$uri);
59 $des_dir $dir '';
60
61 /* 依次载入控制器上级所有目录的架构文件 __construct.php
62 * 架构文件可以包含当前目录下的所有控制器的父类,和需要调用的函数 
63 */
64
65 //echo 'look';
66 foreach($seg as $cur_dir
67 {
68   $des_dir.=$cur_dir."/";
69   if(is_file(APP.'c'.$des_dir.'__construct.php')) {
70     require(APP.'c'.$des_dir.'__construct.php'); 
71     $dir .=array_shift($seg).'/';
72   }
73   else {
74     break;
75   }
76 }
77
78 /* 根据 url 调用控制器中的方法,如果不存在返回 404 错误
79 * 默认请求 class home->index()
80 */
81 //echo  '默认请求 class home->index()';
82 $dir $dir $dir:'/';
83 array_unshift($seg,NULL);
84 $class  = isset($seg[1])?$seg[1]:'home';
85 $method = isset($seg[2])?$seg[2]:'index'
86 if(!is_file(APP.'c'.$dir.$class.'.php'))show_404();
87 require(APP.'c'.$dir.$class.'.php');
88 if(!class_exists($class))show_404();
89 if(!method_exists($class,$method))show_404();
90 $B2 = new $class();
91 call_user_func_array(array(&$B2$method), array_slice($seg3));
92
93 /* B2 系统函数 
94 * load($path,$instantiate) 可以动态载入对象,如:控制器、Model、库类等
95 * $path 是类文件相对 app 的地址
96 * $instantiate 为 False 时,仅引用文件,不实例化对象
97 * $instantiate 为数组时,数组内容会作为参数传递给对象 
98 */
99  
100 function &load($path$instantiate TRUE )
101 {
102   $param FALSE;
103   if(is_array($instantiate)) {
104     $param $instantiate;
105     $instantiate TRUE;
106   }
107   $file explode('/',$path);
108   $class_name array_pop($file);
109   $object_name md5($path);
110   
111   static $objects = array();
112   if (isset($objects[$object_name])) return $objects[$object_name];
113   require(APP.$path.'.php');
114   if ($instantiate == FALSE$objects[$object_name] = TRUE;
115   elseif ($param$objects[$object_name] = new $class_name($param);
116   else  $objects[$object_name] = new $class_name();
117   return $objects[$object_name];
118 }
119
120 // 取得 url 的片段,如 url 是 /abc/def/g/  seg(1) = abc
121 function seg($i)
122 {
123   global $seg;
124   return isset($seg[$i])?$seg[$i]:false;
125 }
126
127 /* 调用 view 文件
128 * function view($view,$param = array(),$cache = FALSE)
129 * $view 是模板文件相对 app/v/ 目录的地址,地址应去除 .php 文件后缀
130 * $param 数组中的变量会传递给模板文件
131 * $cache = TRUE 时,不像浏览器输出结果,而是以 string 的形式 return
132 */
133 function view($view,$param = array(),$cache FALSE)
134 {
135   if(!empty($param))extract($param);
136   ob_start();
137   if(is_file(APP.$view.'.php')) {
138     require APP.$view.'.php';
139   }
140   else {
141     echo 'view '.$view.' desn\'t exsit';
142     return false;
143   }
144   // Return the file data if requested
145   if ($cache === TRUE)
146   {
147     $buffer ob_get_contents();
148     @ob_end_clean();
149     return $buffer;
150   }
151 }
152
153 // 写入日志
154 function write_log($level ,$content 'none')
155 {
156   file_put_contents(APP.'log/'.$level.'-'.date('Y-m-d').'.log'$content FILE_APPEND );
157 }
158
159 //echo ' 显示404错误';
160 function show_404() //显示 404 错误
161 {
162   header("HTTP/1.1 404 Not Found");
163   // 调用 模板 v/404.php 
164   view('v/404');
165   exit(1);
166 }
167
168 /*  B2Core 系统类 */
169 // 抽象的控制器类,建议所有的控制器均基层此类或者此类的子类 
170 class 
171   function index()
172   {
173     echo "基于 B2 v".VERSION." 创建";
174   }
175 }
176
177 class db 
178   var $link;
179   var $last_query;
180   function __construct($conf)
181   {
182     $this->link mysql_connect($conf['host'],$conf['user'], $conf['password']);
183     if (!$this->link) {
184       die('无法连接: ' mysql_error());
185       return FALSE;
186     }
187
188     $db_selected mysql_select_db($conf['default_db']);
189     if (!$db_selected) {
190       die('无法使用 : ' mysql_error());
191     }
192     mysql_query('set names utf8',$this->link);
193   }
194
195   //执行 query 查询,如果结果为数组,则返回数组数据
196   function query($query)
197   {
198     $ret = array();
199     $this->last_query $query;
200     $result mysql_query($query,$this->link);
201     if (!$result) {
202       echo "DB Error, could not query the database\n";
203       echo 'MySQL Error: ' mysql_error();
204       echo 'Error Query: ' $query;
205       exit;
206     }
207     if($result == )return TRUE;
208     while($record mysql_fetch_assoc($result))
209     {
210       $ret[] = $record;
211     }
212     return $ret;
213   }
214
215   function insert_id() {return mysql_insert_id();}
216   
217   // 执行多条 SQL 语句
218   function muti_query($query)
219   {
220     $sq explode(";\n",$query);
221     foreach($sq  as $s){
222       if(trim($s)!= '')$this->query($s);
223     }
224   }
225   
226   function escape($str){
227     return mysql_escape_string($str);
228   }
229 }
230
231 // 模块类,封装了通用CURD模块操作,建议所有模块都继承此类。
232 class 
233   var $db;
234   var $table;
235   var $fields;
236   var $key;
237   function __construct()
238   {
239     global $db;
240     $this->db $db;
241     $this->key 'id';
242   }
243
244   public function __call($name$arg) {
245     return call_user_func_array(array($this$name), $arg);
246   }
247
248   // 向数据库插入数组格式数据
249   function add($elem FALSE)
250   {
251     $query_list = array();
252     if(!$elem)$elem $_POST;
253     foreach($this->fields as $f) {
254       if(isset($elem[$f])){
255         $elem[$f] = $this->db->escape($elem[$f]);
256         $query_list[] = "`$f` ";
257         $query_list1[] = "'$elem[$f]'";
258       }
259     }
260     $query "insert into `$this->table` (".implode(',',$query_list).") values (".implode(',',$query_list1).")";
261     $this->db->query($query);
262     return $this->db->insert_id();
263   }
264
265   // 删除某一条数据
266   function del($id)
267   {
268     $this->db->query("delete from `$this->table` where ".$this->key."='$id'");
269   }
270
271   // 更新数据
272   function update($id $elem FALSE)
273   {
274     $query_list = array();
275     if(!$elem)$elem $_POST;
276     foreach($this->fields as $f) {
277       if(isset($elem[$f])){
278         $elem[$f] = $this->db->escape($elem[$f]);
279         $query_list[] = "`$f` = '$elem[$f]'";
280       }
281     }
282     $this->db->query("update `$this->table` set ".implode(',',$query_list)." where ".$this->key." ='$id'" );
283   }
284
285   // 统计数量
286   function count($where='')
287   {
288     $res =  $this->db->query("select count(*) as a from `$this->table` where 1 $where");
289     return $res[0]['a'];
290   }
291
292   /* get($id) 取得一条数据 或 
293   *  get($postquery = '',$cur = 1,$psize = 30) 取得多条数据
294   */
295   function get()
296   {
297     $args func_get_args();
298     if(is_numeric($args[0])) return $this->__call('get_one'$args);
299     return $this->__call('get_many'$args);
300   }
301
302   function get_one($id)
303   {
304     $id is_numeric($id)?$id:0;
305     $res =  $this->db->query("select * from `$this->table` where ".$this->key."='$id'");
306     if(isset($res[0]))return $res[0];
307     return false;
308   }
309
310   function get_many($postquery '',$cur 1,$psize 30)
311   {
312     $cur $cur ?$cur:1;
313     $start = ($cur 1) * $psize;
314     $query "select * from `$this->table` where 1 $postquery limit $start , $psize";
315     return $this->db->query($query);
316   }
317 }
318