CI MY_Controller &MY_Model

来源:互联网 发布:世界史专业就业知乎 编辑:程序博客网 时间:2024/06/14 16:00
<?php defined('BASEPATH') OR exit('No direct script access allowed'); class MY_Controller extends MX_Controller {/** * 输出数据 * * @var array */var $_data = array();/** * 是否使用缓存 * * @var bool */var $_cache = true;/** * 默认缓存时间,单位秒 * * @var int */var $memcache_time = 60;/** * 缓存键值标识前缀 * * @var string */var $_cache_key_prefix = '';public function __construct(){parent::__construct();$this->_data = array('status' => 0,'data' => array());//$this->load->library('Memcache');$this->load->helper('url');    $this->load->library('form_validation');$this->form_validation->CI =& $this;/** * $_REQUEST 参数校验 */$controller = $this->router->fetch_class();$method = $this->router->fetch_method();$rule_key = $controller.'/'.$method;$rule_key = strtolower($rule_key);log_message('debug', "apicheck ".$rule_key.":".json_encode($_REQUEST));$query_string = '';foreach ($_REQUEST as $k=>$q){$query_string .= $k.'='.$q.'&';}log_message('debug', "apicheck ".$rule_key.":".$query_string);$request_validation_bool = $this->form_validation->getRuleByMethod($rule_key);if($request_validation_bool){if (($this->form_validation->data_valid($rule_key,$this->_args)) === FALSE){log_message('debug', "MY_Form_validation ".$rule_key." run false");$this->_data['data'] = $this->form_validation->get_error_array();$this->response($this->_data, 400);}}//加载redis基类if(REDIS_ON){load_class('Redis', 'core');}//log_message('debug', 'appfront:http://'.$_SERVER['SERVER_NAME'].':'.$_SERVER["SERVER_PORT"].$_SERVER["REQUEST_URI"]);}/** * 更新记录 * */public function update($data = array(), $return = false){if(empty($data)){//post数据$data = $this->input->post();}$item = array();$model = $this->getModel();//获取有效字段$param_keys = array_keys($data);$table_fields = $model->read('getTableFields',array());foreach ($param_keys as $k=>$field){if(in_array($field,$table_fields)){$item[$field] = $data[$field];}}$this->_data = $model->write('update',$item);if($return){return $this->_data;}else {$this->response($this->_data, 200);}}/** * 新增记录 * */public function add($data = array(), $return = false){if(empty($data)){//post数据$data = $this->input->post();}$item = array();$model = $this->getModel();//获取有效字段$param_keys = array_keys($data);$table_fields = $model->read('getTableFields',array());foreach ($param_keys as $k=>$field){if(in_array($field,$table_fields)){$item[$field] = $data[$field];}}$this->_data = $model->write('add',$item);if($this->_data['status'] == 1){$key = $model->getKey();$this->_data['data']['insert_id'] = $this->_data['data'][$key];}if($return){return $this->_data;}else {$this->response($this->_data, 200);}}/** * 获取记录 * */public function getItem($id = 0){$model = $this->getModel();$key = $model->getKey();if(empty($id)){$id = $this->input->get_post($key);}$ret = $model->read('getItem',array($key => $id));if($ret){$this->_data['data'] = $ret;}$this->_data['status'] = 1;$this->response($this->_data, 200);}/** * 获取数据列表 * */public function getItems($params = array(), $return  = false){$offset = $this->input->get_post('offset');$limit= $this->input->get_post('limit');if(empty($params)){$params = $this->input->get();if(empty($params)){$params = $this->input->post();}}if(isset($params['offset'])){unset($params['offset']);}if(isset($params['limit'])){unset($params['limit']);}$order_by = array();if(isset($params['order_by'])){$order_by = json_decode( urldecode($params['order_by']), true);unset($params['order_by']);}if(isset($params['where'])){if($params['where']){$where = json_decode( urldecode($params['where']), true);log_message('debug','query:'.json_encode($where));$where_list = array();foreach ($where as $w => $wh){$w = preg_replace('/ {1,}/', '|', trim($w));$where_list[$w] = $wh;}$params = array_merge($params, $where_list);}unset($params['where']);}$model = $this->getModel();//取params中有效的字段$table_fields = $model->getTableFields();if($params){foreach ($params as $p => $v){if(in_array($p, array('where', 'order_by'))){continue;}$p = current(explode('|', $p));if(!in_array($p, $table_fields)){unset($params[$p]);}}}//对比表索引,取最优的索引$table_index_list = $model->getTableIndexFields();//表索引列表$params_keys = $params ? array_keys($params) : array();//参数字段列表$best_index = array();//最优索引if($table_index_list){$match_field_num = 0;//匹配字段个数foreach ($table_index_list as $k => $tb_index){$diff = array_diff($tb_index, $params_keys);if(empty($diff)){//有效索引if(count($diff) == count($tb_index)){//字段完全匹配,最优索引$best_index = $tb_index;break;}elseif(count($tb_index) > $match_field_num){//更多字段匹配$best_index = $tb_index;$match_field_num = count($tb_index);}}}}//生成查询条件$where = array();if($best_index){//设置最优索引查询条件foreach ($best_index as $i => $v){$where[$v] = $params[$v];unset($params[$v]);}//设置其他参数if($params){$where = array_merge($where, $params);}}else {$where = $params;}$ret = array();$ret['count'] = $model->read('getTotal',array('where' => $where));//获取数据$list = $model->read('getItems',array('where'=> $where,'order_by'  => $order_by,'offset' => $offset,'limit' => $limit));$ret['list'] = $list;//输出if($ret){$this->_data['data'] = $ret;}$this->_data['status'] = 1;if($return){return $this->_data;}else {$this->response($this->_data, 200);}}/** * 删除记录 * */public function delete(){$model = $this->getModel();$key = $model->getKey();$id = $this->input->get_post($key);$item = $model->read('getItem',array($key => $id));if($item){$this->_data = $model->write('delete',array($key => $id));}$this->response($this->_data, 200);}public function deleteByWhere(){$params = $_REQUEST;$model = $this->getModel();$key = $model->getKey();$ret = $this->getItems($params, 1);if($ret['status'] == 1 && $ret['data']['count'] > 0){$ids = array();foreach ($ret['data']['list'] as $r => $item){$ids[] = $item[$key];}$this->deleteByBatch($ids);}$this->_data['status'] = 1;$this->response($this->_data, 200);}public function deleteByBatch($ids = array()){if(empty($ids)){$ids = $this->input->post('ids');if($ids){$ids  =  explode(',', $ids);}}if(empty($ids)){$this->response($this->_data, 200);}$model = $this->getModel();$key = $model->getKey();foreach ($ids as $k => $id){$item = $model->read('getItem',array($key => $id));if($item){$this->_data = $model->write('delete',array($key => $id));}}$this->response($this->_data, 200);}public function truncateTable(){$model = $this->getModel();$key = $model->getKey();$model->write('truncate', array());$this->_data['status'] = 1; $this->response($this->_data, 200);}public  function initRedis(){$model = $this->getModel();$where = array();$items = $model->read('getItemsAll',$where);$model->read('initData',$items);exit;}public function response($data = null, $http_code = null){header('Content-Type: application/json;charset=utf-8');echo json_encode($data);exit;}}
<?php defined('BASEPATH') OR exit('No direct script access allowed');/** * A base model to provide the basic CRUD actions for all models that inherit * from it. * */class MY_Model extends CI_Model{/** * return data * * @var array */public $_data = array();/** * The database table to use, only set if you want to bypass the magic. * * @var string */protected $_table;/** * The primary key, by default set to `id`, for use in some functions. * * @var string */protected $_primary_key = 'id';/** * 表字段数组 * * @var array */protected $_fields = array();/** * 表的索引数组 * * @var array */protected $_index_fields = array();/** * 排序字段,默认取主键 * * @var unknown_type */protected $_sortby = array();/** * Wrapper to __construct for when loading class is a superclass to a regular * controller, i.e. - extends Base not extends Controller. * * @return void * @author Jamie Rumbelow */public function MY_Model(){$this->__construct();}/** * The class constructor, tries to guess the table name. * * @author Jamie Rumbelow */public function __construct(){parent::__construct();}/** * Set table name * * @param string $name The name for the table. * @return string */public function set_table_name($name = NULL){return $this->_table = $name;}}/** * 组件基础model * */class Base_Model extends MY_Model{/** * 模块名 * * @var string */public $_module;public $_redis_on = true;public function __construct(){parent::__construct();$this->load->library('Hash_Data');//model 返回数据结构$this->_data = array('status'=> 0,'data'=> array());}/** * 读操作 * * @param string $action 方法名 * @param array  $param  参数 */public function read($action, $param){if (REDIS_ON && $this->_redis_on) //读redis数据{if (false !== strpos($action, 'search')){$param['action'] = 'get'; //定义执行动作,get为获取结果}log_message('debug','redis set read'.$action);$res = $this->redisexec($action, $param);if (!empty($res)){log_message('debug','redis read'.$action);return $res;}}$res = $this->dbexec($action, $param); //读db数据//缓存查询结果,方法命中包含search,会自动执行搜索结果缓存if (false !== strpos($action, 'search')){//搜索结果保存到redis$data['data']   = $res['data'];$data['param']  = $param;$data['action'] = 'save'; //定义执行动作,save为保存结果$res            = $this->redisexec($action, $data);}return $res;} /** * 写操作 * * @param string $action 方法名 * @param array  $param  参数 */public function write($action, $param){//写db数据$result = $this->dbexec($action, $param);if (REDIS_ON && $result['status'] && $this->_redis_on){//写redis数据$result = $this->redisexec($action, $result['data']);}return $result;}/** * 库操作 * * @param string $model  模型 * @param string $action 方法名 * @param array  $param  参数 */private function dbexec($action, $param){//返回数据$data = array('status'=>0,'data'=>array());if(method_exists($this, $action)){return call_user_func_array(array(&$this,$action), array($param));}else {log_message('Debug','apicheck:'.$action.' is not exist');}return $data;}/** * Redis操作 * * @param string $action 方法名 * @param array  $param  参数 */private function redisexec($action, $param){/* check redis model */list($path, $_model) = Modules::find(strtolower($this->_table.'_redis'), $this->_module, 'redis/');//redis model存在,加载if($path){Modules::load_file($_model, $path);$model = ucfirst($_model);$class = new $model();$class->setTable($this->_table);$class->setFields($this->_fields);$class->setIndexFields($this->_index_fields);$class->setPrimarykey($this->_primary_key);$class->setSortBy($this->_sortby);if (!empty($action) && method_exists($class, $action)){return call_user_func_array(array(&$class,$action), array($param));}}}public function getTableIndexFields(){return $this->_index_fields;}/** * 获取主键字段 * * @return string */public function getKey(){return $this->_primary_key;}/** * 根据主键值获取单条记录 * * @param array $param * @return array */function getItem($param = array()){if(is_array($param)){$id = $param[$this->_primary_key];}else {$id = $param;}$this->db->where($this->_primary_key,$id);$item = $this->db->get($this->_table)->row_array();log_message('debug','querysql getitem:'.json_encode(array('sql'=>$this->db->last_query())));return $item;}/** * 添加/更新数据 * * @param array $param * @return array */function add($param = array()){//自增IDif(isset($param[$this->_primary_key])){return $this->_data;}$ret = false;//新增$ret = $this->db->insert($this->_table,$param);log_message('debug','querysql insert:'.$this->db->last_query());if($ret){$id = $this->db->insert_id();}if($ret){$this->_data['status']= 1;$param[$this->_primary_key] = $id;$this->_data['data']= $param;}return $this->_data;}/** * 添加/更新数据 * * @param array $param * @return array */function update($param = array()){//自增ID$id = 0;if(!isset($param[$this->_primary_key])){return $this->_data;}$id = $param[$this->_primary_key];$ret = false;//更新$this->db->where($this->_primary_key,$id);$ret = $this->db->update($this->_table,$param);log_message('debug','querysql update:'.json_encode(array('sql'=>$this->db->last_query())));if($ret){$this->_data['status']= 1;$param[$this->_primary_key] = $id;$this->_data['data']= $param;}return $this->_data;}/** * 删除 * * @param array $idsid集 * @return array */function delete($param = array()){$id = isset($param[$this->_primary_key]) ? $param[$this->_primary_key] : '';$where = isset($param['where']) ? $param['where'] : '';if($id){$this->db->where($this->_primary_key,$id);}if ($where){    foreach ($where as $key =>$value)    {$this->_setDbWhere($key, $value);    }}if($id || $where){if($this->db->delete($this->_table)){$this->_data['status'] = 1;$this->_data['data']= $param;}}log_message('debug','querysql delete:'.json_encode(array('sql'=>$this->db->last_query())));return $this->_data;}/** * 获取菜单数据列表 * * @return array */function getItems($param = array()){    $where = isset($param['where']) ? $param['where'] : '';$orderby = isset($param['order_by']) ? $param['order_by'] : '';$offset = isset($param['offset']) ? $param['offset'] : 0;$limit = isset($param['limit']) ? $param['limit'] : 0;    if($where)    {    foreach ($where as $key =>$value)    {$this->_setDbWhere($key, $value);    }    }        if($orderby)    {    $this->_sortby = $orderby;    }    if(empty($this->_sortby))    {    $this->db->order_by($this->_primary_key,'desc');    }    else     {    foreach ($this->_sortby as $s => $by)    {    $this->db->order_by($s,$by);    }    }        if($limit)    {    $this->db->limit($limit,$offset);    }            $ret = $this->db->get($this->_table)->result_array();        log_message('debug','querysql getitems:'.json_encode(array('sql'=>$this->db->last_query())));                return $ret;}/** * 获取数据表的所有数据 * */function getItemsAll(){        return $this->db->get($this->_table)->result_array();}/** * 获取记录总数 * * @param array $param * @return int */function getTotal($param = array()){$where = isset($param['where']) ? $param['where'] : '';    if($where)    {    foreach ($where as $key =>$value)    {$this->_setDbWhere($key, $value);    }    }            $this->db->from($this->_table);            $count =  $this->db->count_all_results();    log_message('debug','querysql gettotal:'.json_encode(array('sql'=>$this->db->last_query())));    return $count;}/** * 获取表字段 * * @return array() */function getTableFields($param = array()){return $this->_fields;}/** * 设置数据库查询类型 * * @param string $key字段名与操作符号 name|operate * @param string/int/array $value */function _setDbWhere($field_name,$value){$list = explode('|',$field_name);//字段名$key = $list[0];//操作符$operate = '';if(count($list) > 1){$operate = $list[1];}if(is_numeric($value)){$this->dataCompare($key, $value , $operate);}elseif(is_array($value) && $operate != 'mutil'){if($operate == '!='){$this->db->where_not_in($key,$value);}else {$this->db->where_in($key,$value);}}else {$this->dataCompare($key, $value , $operate);}}/** * 变量比较 * * @param var $a变量a * @param var $b变量b * @param var $comp比较符 */private function dataCompare($a , $b ,$comp){switch ($comp){case '=': $this->db->where($a,$b);break;case '!=': $this->db->where($a.' !=',$b); break;case '>': $this->db->where($a.' >',$b);  break;case '<': $this->db->where($a.' <',$b); break;case '>=': $this->db->where($a.' >=',$b); break;case '<=': $this->db->where($a.' <=',$b); break;case 'dateformat>=': $this->db->where('DATE_FORMAT('.$a.' , \'%Y-%m-%d\') >=',$b);break;//DATE_FORMAT(service_time , \'%Y-%m-%d\')|>=case 'dateformat<=': $this->db->where('DATE_FORMAT('.$a.' , \'%Y-%m-%d\') <=',$b); break;//DATE_FORMAT(service_time , \'%Y-%m-%d\')|<=case 'dateformat=': $this->db->where('DATE_FORMAT('.$a.' , \'%Y-%m-%d\') =',$b); break;//DATE_FORMAT(service_time , \'%Y-%m-%d\')|<=case 'dateformath': $this->db->where('DATE_FORMAT('.$a.' , \'%Y-%m-%d %H\') =',$b); break;//DATE_FORMAT(service_time , \'%Y-%m-%d\')|<=case 'like': $this->db->like($a,$b);break;//likecase 'or': $this->db->or_where($a,$b);break;//or_wherecase 'in': $this->db->where_in($a,$b);break;//or_wherecase 'orin': $this->db->or_where_in($a,$b);break;//or_wherecase 'mutil': $query = array();foreach ($b as $k => $v){$query[] = $k." like '%".str_replace('_', '\_', mysql_real_escape_string($v))."%'";}$sql = '(' . implode(' or ', $query) . ')';log_message('debug', 'query:'.$sql);$this->db->where($sql,  NULL, true);break;//or_wheredefault: $this->db->where($a,$b);break; }}}/* End of file MY_Model.php *//* Location: ./application/core/MY_Model.php */


0 0
原创粉丝点击