在本文中,我们将带你了解CodeIgniter配置之database.php用法实例分析在这篇文章中,我们将为您详细介绍CodeIgniter配置之database.php用法实例分析的方方面面,并解
在本文中,我们将带你了解CodeIgniter配置之database.php用法实例分析在这篇文章中,我们将为您详细介绍CodeIgniter配置之database.php用法实例分析的方方面面,并解答codeql php常见的疑惑,同时我们还将给您一些技巧,以帮助您实现更有效的CI(CodeIgniter)模型用法实例分析、CI(CodeIgniter)模型用法实例分析_PHP、CI(CodeIgniter)模型用法实例分析_php实例、CI(CodeIgniter)模型用法实例分析,cicodeigniter。
本文目录一览:- CodeIgniter配置之database.php用法实例分析(codeql php)
- CI(CodeIgniter)模型用法实例分析
- CI(CodeIgniter)模型用法实例分析_PHP
- CI(CodeIgniter)模型用法实例分析_php实例
- CI(CodeIgniter)模型用法实例分析,cicodeigniter
CodeIgniter配置之database.php用法实例分析(codeql php)
本文实例分析了CodeIgniter配置之database.php用法。分享给大家供大家参考,具体如下:
CodeIgniter的数据库配置文件位于application/config/database.php, 该文件中定义了$db的二维数组,参考文件如下:
$active_group = ''default''; $active_record = TRUE; $db[''default''][''hostname''] = ''localhost''; $db[''default''][''username''] = ''root''; $db[''default''][''password''] = ''123456''; $db[''default''][''database''] = ''test''; $db[''default''][''dbdriver''] = ''mysql''; $db[''default''][''dbprefix''] = ''''; $db[''default''][''pconnect''] = FALSE; $db[''default''][''db_debug''] = TRUE; $db[''default''][''cache_on''] = FALSE; $db[''default''][''cachedir''] = ''''; $db[''default''][''char_set''] = ''utf8''; $db[''default''][''dbcollat''] = ''utf8_general_ci''; $db[''default''][''swap_pre''] = ''''; $db[''default''][''autoinit''] = TRUE; $db[''default''][''stricton''] = FALSE;
配置说明
$active_group 为$db中的一维键名,表示默认使用的数据库配置,即$this->load->database()不传入参数时,将默认使用$db[$active_group]来连接数据库。
$active_record 是否开启AR模式,开启后将可以使用AR类中的方法,该值可通过$this->load->database()的第三个参数传入。
$db数组需要注意的地方
1、port 默认只列出了主机、帐号、密码等,未配置端口号,如果需要特别指定端口号则需要配置该值。
2、pconnect 长连接的问题,值默认为TRUE表示默认使用长连接。长连接的使用需要特别小心,数据库可能会出现大量的sleep的进程而导致更多的请求执行不成功,这里不建议开启长连接。
3、db_debug 为TRUE时SQL执行出错则会直接在错误页面打印,开发环境可以打开,生产环境需关闭。
4、autoinit 是否自动初始化数据库,为true时则$this->load->database()就会连接数据库,否则在查询时连接数据库。CI的类都做了单例,所以不用担心多次链接。
5、stricton 当该值为TRUE时,初始化时会执行这样一条语句,会对不规范的数据,比如字符超过长度、自增主键传入‘''等将会直接抛错。
如何连接数据库?
可通过Loader中的database方式调用,即$this->load->database(); 函数的定义如下:
/** * Database Loader * * @param string 数据库连接值,数组或DSN字符串传递。 * @param bool 是否返回数据库对象,否则将数据库对象赋值给控制器的db属性 * @param bool 是否使用AR,这里的设置会覆盖database.php中设置 * @return object */ function database($params = '''', $return = FALSE, $active_record = NULL){}
$params的值有3种情况,分别是:
1、字符串,传入$db数组一维键名,如 default test等,为空则默认$active_group定义的值
2、数组,可以直接传入类似$db的一维数组,如:
$this->load->database(array( ''hostname'' => ''localhost'', ''username'' => ''root'', ''password'' => ''123456'', ''database'' => ''test'', ''dbdriver'' => ''mysql'', ''pconnect'' => FALSE, ''db_debug'' => TRUE, ''char_set'' => ''utf8'', ''dbcollat'' => ''utf8_general_ci'', ));
3、DSN 字符串,如:
$dsn = ''mysql://root:123456@localhost/test?charset=utf8&dbcollat=utf8_general_ci''; $this->load->database($dsn);
PDO的初始化需要使用DSN字符串,那么在CI中该如何配置呢,可参考如下配置:
//当前版本2.x.x $active_group = ''default''; $active_record = TRUE; $db[''default''][''hostname''] = ''mysql:host=localhost;dbname=test''; $db[''default''][''username''] = ''root''; $db[''default''][''password''] = ''123456''; $db[''default''][''database''] = ''test''; $db[''default''][''dbdriver''] = ''pdo''; $db[''default''][''dbprefix''] = ''''; $db[''default''][''pconnect''] = FALSE; $db[''default''][''db_debug''] = TRUE; $db[''default''][''cache_on''] = FALSE; $db[''default''][''cachedir''] = ''''; $db[''default''][''char_set''] = ''utf8''; $db[''default''][''dbcollat''] = ''utf8_general_ci''; $db[''default''][''swap_pre''] = ''''; $db[''default''][''autoinit''] = TRUE; $db[''default''][''stricton''] = FALSE;
如何连接多个数据库?
$this->load->database()时会将数据库对象赋值给CI_Controller的db属性,如果已经存在了db则不会重新连接。也就是执行$this->load->database()之后再次$this->load->database(''test'')时则第二次load不会执行。
但load的第二个参数允许返回,所以可以返回并赋值给变量,达到连不同库的目的。
$DB1 = $this->load->database(''default'', TRUE); $DB2 = $this->load->database(''test'', TRUE);
但这种方式需要使用的时候主动去load,使用不太方便,我们可以在MY_Model的构造函数中实现,将返回的$DB1重新赋值给CI_Controller的一个属性,并将该属性赋值或者clone给$this->db,例如:
public function __construct($group_name = '''') { parent::__construct(); if($group_name == '''') { $db_conn_name = ''db''; } else { $db_conn_name = ''db_''.$group_name; } $CI = & get_instance(); if(isset($CI->{$db_conn_name}) && is_object($CI->{$db_conn_name})) { $this->db = $CI->{$db_conn_name}; } else { $CI->{$db_conn_name} = $this->db = $this->load->database($group_name, TRUE); } }
更多关于CodeIgniter相关内容感兴趣的读者可查看本站专题:《codeigniter入门教程》和《CI(CodeIgniter)框架进阶教程》
希望本文所述对大家基于CodeIgniter框架的PHP程序设计有所帮助。
- Codeigniter检测表单post数据的方法
- Codeigniter实现处理用户登录验证后的URL跳转
- CodeIgniter配置之autoload.php自动加载用法分析
- CodeIgniter控制器之业务逻辑实例分析
- CodeIgniter自定义控制器MY_Controller用法分析
- CodeIgniter钩子用法实例详解
- CodeIgniter多语言实现方法详解
- CI(CodeIgniter)模型用法实例分析
- CodeIgniter辅助之第三方类库third_party用法分析
- CodeIgniter扩展核心类实例详解
- CodeIgniter视图使用注意事项
- CodeIgniter读写分离实现方法详解
- CodeIgniter表单验证方法实例详解
CI(CodeIgniter)模型用法实例分析
《PHP实战:CI(CodeIgniter)模型用法实例分析》要点:
本文介绍了PHP实战:CI(CodeIgniter)模型用法实例分析,希望对您有用。如果有疑问,可以联系我们。
PHP应用本文实例分析了CI(CodeIgniter)模型用法.分享给大家供大家参考,具体如下:
MVC中的业务逻辑放在控制器中或者模型里都是不合适的,所以这里对业务逻辑进行了分离,多出一层用来处理业务逻辑,模型就只当作数据拜访层,这样子模型将会变得比较轻.CI中并未通过实体对象来传参,参数的传入和返回都由开发者控制,比较灵活.很多情况下都会以数组的方式传入或者返回.
模型的使用也比较简单,这里只提一下使用前想到的几个问题吧.
1、既然已经有了数据拜访层了,那我们就应当避免在控制器或者某些类中直接通过SQL查询数据库,所有的数据库拜访操作都应当经过模型获取,大多数情况下一个表名对应着一个模型类.
2、模型应当很方便的连接多个数据库,在database配置文件中有谈到多个库的配置问题,根据group_name的不同可以很方便的连接不同的库.如果有主从,还可以考虑到主从的切换使用问题.
3、模型是否还要按模块区分?在控制器中存在公用控制器分发的做法,在模型中这种思维可能不太好,但可以通过继承不同的公用模型类来实现,这些类再继承CI的MY_Model.在某些业务下根据模块来继承可能比较有用,大部分情况可以直接继承MY_Model,MY_Model主要实现数据库的初始化连接以及一些公用办法.
4、数据库提供的操作方式都是比较基础的,需要我们根据自身的需求去组装,但在我们日常操作中很多操作是类似的,如,根据主键获取信息,根据ID获取信息,根据属性获取信息等,可以对这些基础的操作在进行一次封装,更方便使用.因为如果要使用AR的方式来操作数据库,需要记住很多的办法,如我们根据用户名查询:
$query = $this->db->from('user')->where(array('username' => 'BobbyPeng'))->get(); return $query->row_array();
如果封装后,则只需要记住一个办法即可,如:
public function findByAttributes($where = array()) { $query = $this->db->from($this->tableName())->where($where)->get(); return $query->row_array(); }
这样子在每个模型中添加一个tableName的办法返回表名后,再通过模型就可以很方便的使用该办法了.
5、上面的办法属于一个公用办法,我们会写在MY_Model中,但这种类似的办法会很多,我们可否将该类型的办法独立于一个文件中?因为这种办法大部分情况下是不会改的,而放在MY_Model中则表示对它的修改开放了,可能会影响到这些办法.如果说该类叫ActiveRecord类,那可以让MY_Model继承ActiveRecord类,而ActiveRecord类继承CI_Model,参考代码见后面.
很多时候类库提供给我们的办法都是比较细的,我们可以封装一下,减少使用难度.关于模型中公用办法的封装一直还在考虑中,下面给出的只是一个针对单表的简单的操作,复杂的操作就得在特定的模型中实现,还有一些公用操作或者说非AR的操作方式可以统一下,看以后是否有机会再来考虑下这个问题.
公用AR封装类,可进行常用的操作,需要赋予db属性为数据库连接对象,并在模型中设置几个办法,如主键、表名
<?PHP if ( ! defined('BASEPATH')) exit('No direct script access allowed'); class ActiveRecord extends CI_Model { /** * 保存数据 * * @param array $data 需要插入的表数据 * @return boolean 插入成功返回ID,插入失败返回false */ public function save($data) { if($this->db->set($data)->insert($this->tableName())) { return $this->db->insert_id(); } return FALSE; } /** * Replace数据 * @param array $data */ public function replace($data) { return $this->db->replace($this->tableName(),$data); } /** * 根据主键更新记录 * * @param string $pk 主键值 * @param array $attributes 更新字段 * @param array $where 附加where条件 * @return boolean true更新成功 false更新失败 */ public function updateByPk($pk,$attributes,$where = array()) { $where[$this->primaryKey()] = $pk; return $this->updateall($attributes,$where); } /** * 更新表记录 * * @param array $attributes * @param array $where * @return bollean true更新成功 false更新失败 */ public function updateall($attributes,$where = array()) { return $this->db->where($where)->update($this->tableName(),$attributes); } /** * 根据主键删除数据 * * @param string $pk 主键值 * @param array $where 附加删除条件 * @return boolean true删除成功 false删除失败 */ public function deleteByPk($pk,$where = array()) { $where[$this->primaryKey()] = $pk; return $this->deleteall($where); } /** * 删除记录 * * @param array $where 删除条件 * @param int $limit 删除行数 * @return boolean true删除成功 false删除失败 */ public function deleteall($where = array(),$limit = NULL) { return $this->db->delete($this->tableName(),$where,$limit); } /** * 根据主键检索 * * @param string $pk * @param array $where 附加查询条件 * @return array 返回一维数组,未找到记录则返回空数组 */ public function findByPk($pk,$where = array()) { $where[$this->primaryKey()] = $pk; $query = $this->db->from($this->tableName())->where($where)->get(); return $query->row_array(); } /** * 根据属性获取一行记录 * @param array $where * @return array 返回一维数组,未找到记录则返回空数组 */ public function findByAttributes($where = array()) { $query = $this->db->from($this->tableName())->where($where)->limit(1)->get(); return $query->row_array(); } /** * 查询记录 * * @param array $where 查询条件,可使用模糊查询,如array('name LIKE' => "pp%") array('stat >' => '1') * @param int $limit 返回记录条数 * @param int $offset 偏移量 * @param string|array $sort 排序,当为数组的时候 如:array('id DESC','report_date ASC')可以通过第二个参数来控制是否escape * @return array 未找到记录返回空数组 */ public function findAll($where = array(),$limit = 0,$offset = 0,$sort = NULL) { $this->db->from($this->tableName())->where($where); if($sort !== NULL) { if(is_array($sort)){ foreach($sort as $value){ $this->db->order_by($value,'',false); } } else { $this->db->order_by($sort); } } if($limit > 0) { $this->db->limit($limit,$offset); } $query = $this->db->get(); return $query->result_array(); } /** * 统计满足条件的总数 * * @param array $where 统计条件 * @return int 返回记录条数 */ public function count($where = array()) { return $this->db->from($this->tableName())->where($where)->count_all_results(); } /** * 根据SQL查询,参数通过$param绑定 * @param string $sql 查询语句,如SELECT * FROM some_table WHERE id = ? AND status = ? AND author = ? * @param array $param array(3,'live','Rick') * @return array 未找到记录返回空数组,找到记录返回二维数组 */ public function query($sql,$param = array()) { $query = $this->db->query($sql,$param); return $query->result_array(); } } /* End of file ActiveRecord.PHP */ /* Location: ./application/core/database/ActiveRecord.PHP */
MY_Model可以继承该类,这样子模型中可以直接调用上面的办法.
<?PHP if ( ! defined('BASEPATH')) exit('No direct script access allowed'); require_once APPPATH.'core/database/ActiveRecord.PHP'; class MY_Model extends ActiveRecord { public function __construct($group_name = '') { $this->initDb($group_name); parent::__construct(); } protected function initDb($group_name = '') { $db_conn_name = $this->getdbname($group_name); $CI = & get_instance(); if(isset($CI->{$db_conn_name}) && is_object($CI->{$db_conn_name})) { $this->db = $CI->{$db_conn_name}; } else { $CI->{$db_conn_name} = $this->db = $this->load->database($group_name,TRUE); } } private function getdbname($group_name = '') { if($group_name == '') { $db_conn_name = 'db'; } else { $db_conn_name = 'db_'.$group_name; } return $db_conn_name; } } /* End of file MY_Model.PHP */ /* Location: ./application/core/MY_Model.PHP */
更多关于CodeIgniter相关内容感兴趣的读者可查看本站专题:《codeigniter入门教程》和《CI(CodeIgniter)框架进阶教程》
希望本文所述对大家基于CodeIgniter框架的PHP程序设计有所赞助.
小编培训学院每天发布《PHP实战:CI(CodeIgniter)模型用法实例分析》等实战技能,PHP、MysqL、LINUX、APP、JS,CSS全面培养人才。
CI(CodeIgniter)模型用法实例分析_PHP
本文实例分析了ci(codeigniter)模型用法。分享给大家供大家参考,具体如下:
MVC中的业务逻辑放在控制器中或者模型里都是不合适的,所以这里对业务逻辑进行了分离,多出一层用来处理业务逻辑,模型就只当作数据访问层,这样子模型将会变得比较轻。CI中并未通过实体对象来传参,参数的传入和返回都由开发者控制,比较灵活。很多情况下都会以数组的方式传入或者返回。
模型的使用也比较简单,这里只提一下使用前想到的几个问题吧。
1、既然已经有了数据访问层了,那我们就应当避免在控制器或者某些类中直接通过SQL查询数据库,所有的数据库访问操作都应当经过模型获取,大多数情况下一个表名对应着一个模型类。
2、模型应当很方便的连接多个数据库,在database配置文件中有谈到多个库的配置问题,根据group_name的不同可以很方便的连接不同的库。如果有主从,还可以考虑到主从的切换使用问题。
立即学习“PHP免费学习笔记(深入)”;
3、模型是否还要按模块区分?在控制器中存在公用控制器分发的做法,在模型中这种思维可能不太好,但可以通过继承不同的公用模型类来实现,这些类再继承CI的MY_Model。在某些业务下根据模块来继承可能比较有用,大部分情况可以直接继承MY_Model,MY_Model主要实现数据库的初始化连接以及一些公用方法。
4、数据库提供的操作方式都是比较基础的,需要我们根据自身的需求去组装,但在我们日常操作中很多操作是类似的,如,根据主键获取信息,根据ID获取信息,根据属性获取信息等,可以对这些基础的操作在进行一次封装,更方便使用。因为如果要使用AR的方式来操作数据库,需要记住很多的方法,如我们根据用户名查询:
$query = $this->db->from(''user'')->where(array(''username'' => ''BobbyPeng''))->get(); return $query->row_array();
如果封装后,则只需要记住一个方法即可,如:
public function findByAttributes($where = array()) { $query = $this->db->from($this->tableName())->where($where)->get(); return $query->row_array(); }
这样子在每个模型中添加一个tableName的方法返回表名后,再通过模型就可以很方便的使用该方法了。
5、上面的方法属于一个公用方法,我们会写在MY_Model中,但这种类似的方法会很多,我们可否将该类型的方法独立于一个文件中?因为这种方法大部分情况下是不会改的,而放在MY_Model中则表示对它的修改开放了,可能会影响到这些方法。如果说该类叫ActiveRecord类,那可以让MY_Model继承ActiveRecord类,而ActiveRecord类继承CI_Model,参考代码见后面。
很多时候类库提供给我们的方法都是比较细的,我们可以封装一下,减少使用难度。关于模型中公用方法的封装一直还在考虑中,下面给出的只是一个针对单表的简单的操作,复杂的操作就得在特定的模型中实现,还有一些公用操作或者说非AR的操作方式可以统一下,看以后是否有机会再来考虑下这个问题。
公用AR封装类,可进行常用的操作,需要赋予db属性为数据库连接对象,并在模型中设置几个方法,如主键、表名
<?php if ( ! defined(''BASEPATH'')) exit(''No direct script access allowed''); class ActiveRecord extends CI_Model { /** * 保存数据 * * @param array $data 需要插入的表数据 * @return boolean 插入成功返回ID,插入失败返回false */ public function save($data) { if($this->db->set($data)->insert($this->tableName())) { return $this->db->insert_id(); } return FALSE; } /** * Replace数据 * @param array $data */ public function replace($data) { return $this->db->replace($this->tableName(), $data); } /** * 根据主键更新记录 * * @param string $pk 主键值 * @param array $attributes 更新字段 * @param array $where 附加where条件 * @return boolean true更新成功 false更新失败 */ public function updateByPk($pk, $attributes, $where = array()) { $where[$this->primaryKey()] = $pk; return $this->updateAll($attributes, $where); } /** * 更新表记录 * * @param array $attributes * @param array $where * @return bollean true更新成功 false更新失败 */ public function updateAll($attributes, $where = array()) { return $this->db->where($where)->update($this->tableName(), $attributes); } /** * 根据主键删除数据 * * @param string $pk 主键值 * @param array $where 附加删除条件 * @return boolean true删除成功 false删除失败 */ public function deleteByPk($pk, $where = array()) { $where[$this->primaryKey()] = $pk; return $this->deleteAll($where); } /** * 删除记录 * * @param array $where 删除条件 * @param int $limit 删除行数 * @return boolean true删除成功 false删除失败 */ public function deleteAll($where = array(), $limit = NULL) { return $this->db->delete($this->tableName(), $where, $limit); } /** * 根据主键检索 * * @param string $pk * @param array $where 附加查询条件 * @return array 返回一维数组,未找到记录则返回空数组 */ public function findByPk($pk, $where = array()) { $where[$this->primaryKey()] = $pk; $query = $this->db->from($this->tableName())->where($where)->get(); return $query->row_array(); } /** * 根据属性获取一行记录 * @param array $where * @return array 返回一维数组,未找到记录则返回空数组 */ public function findByAttributes($where = array()) { $query = $this->db->from($this->tableName())->where($where)->limit(1)->get(); return $query->row_array(); } /** * 查询记录 * * @param array $where 查询条件,可使用模糊查询,如array(''name LIKE'' => "pp%") array(''stat >'' => ''1'') * @param int $limit 返回记录条数 * @param int $offset 偏移量 * @param string|array $sort 排序, 当为数组的时候 如:array(''id DESC'', ''report_date ASC'')可以通过第二个参数来控制是否escape * @return array 未找到记录返回空数组 */ public function findAll($where = array(), $limit = 0, $offset = 0, $sort = NULL) { $this->db->from($this->tableName())->where($where); if($sort !== NULL) { if(is_array($sort)){ foreach($sort as $value){ $this->db->order_by($value, '''', false); } } else { $this->db->order_by($sort); } } if($limit > 0) { $this->db->limit($limit, $offset); } $query = $this->db->get(); return $query->result_array(); } /** * 统计满足条件的总数 * * @param array $where 统计条件 * @return int 返回记录条数 */ public function count($where = array()) { return $this->db->from($this->tableName())->where($where)->count_all_results(); } /** * 根据SQL查询, 参数通过$param绑定 * @param string $sql 查询语句,如SELECT * FROM some_table WHERE id = ? AND status = ? AND author = ? * @param array $param array(3, ''live'', ''Rick'') * @return array 未找到记录返回空数组,找到记录返回二维数组 */ public function query($sql, $param = array()) { $query = $this->db->query($sql, $param); return $query->result_array(); } } /* End of file ActiveRecord.php */ /* Location: ./application/core/database/ActiveRecord.php */
MY_Model可以继承该类,这样子模型中可以直接调用上面的方法。
<?php if ( ! defined(''BASEPATH'')) exit(''No direct script access allowed''); require_once APPPATH.''core/database/ActiveRecord.php''; class MY_Model extends ActiveRecord { public function __construct($group_name = '''') { $this->initDb($group_name); parent::__construct(); } protected function initDb($group_name = '''') { $db_conn_name = $this->getDbName($group_name); $CI = & get_instance(); if(isset($CI->{$db_conn_name}) && is_object($CI->{$db_conn_name})) { $this->db = $CI->{$db_conn_name}; } else { $CI->{$db_conn_name} = $this->db = $this->load->database($group_name, TRUE); } } private function getDbName($group_name = '''') { if($group_name == '''') { $db_conn_name = ''db''; } else { $db_conn_name = ''db_''.$group_name; } return $db_conn_name; } } /* End of file MY_Model.php */ /* Location: ./application/core/MY_Model.php */
更多关于CodeIgniter相关内容感兴趣的读者可查看本站专题:《codeigniter入门教程》和《CI(CodeIgniter)框架进阶教程》
希望本文所述对大家基于CodeIgniter框架的PHP程序设计有所帮助。
CI(CodeIgniter)模型用法实例分析_php实例
本文实例分析了ci(codeigniter)模型用法。分享给大家供大家参考,具体如下:
MVC中的业务逻辑放在控制器中或者模型里都是不合适的,所以这里对业务逻辑进行了分离,多出一层用来处理业务逻辑,模型就只当作数据访问层,这样子模型将会变得比较轻。CI中并未通过实体对象来传参,参数的传入和返回都由开发者控制,比较灵活。很多情况下都会以数组的方式传入或者返回。
模型的使用也比较简单,这里只提一下使用前想到的几个问题吧。
1、既然已经有了数据访问层了,那我们就应当避免在控制器或者某些类中直接通过SQL查询数据库,所有的数据库访问操作都应当经过模型获取,大多数情况下一个表名对应着一个模型类。
2、模型应当很方便的连接多个数据库,在database配置文件中有谈到多个库的配置问题,根据group_name的不同可以很方便的连接不同的库。如果有主从,还可以考虑到主从的切换使用问题。
立即学习“PHP免费学习笔记(深入)”;
3、模型是否还要按模块区分?在控制器中存在公用控制器分发的做法,在模型中这种思维可能不太好,但可以通过继承不同的公用模型类来实现,这些类再继承CI的MY_Model。在某些业务下根据模块来继承可能比较有用,大部分情况可以直接继承MY_Model,MY_Model主要实现数据库的初始化连接以及一些公用方法。
4、数据库提供的操作方式都是比较基础的,需要我们根据自身的需求去组装,但在我们日常操作中很多操作是类似的,如,根据主键获取信息,根据ID获取信息,根据属性获取信息等,可以对这些基础的操作在进行一次封装,更方便使用。因为如果要使用AR的方式来操作数据库,需要记住很多的方法,如我们根据用户名查询:
$query = $this->db->from(''user'')->where(array(''username'' => ''BobbyPeng''))->get(); return $query->row_array();
如果封装后,则只需要记住一个方法即可,如:
public function findByAttributes($where = array()) { $query = $this->db->from($this->tableName())->where($where)->get(); return $query->row_array(); }
这样子在每个模型中添加一个tableName的方法返回表名后,再通过模型就可以很方便的使用该方法了。
5、上面的方法属于一个公用方法,我们会写在MY_Model中,但这种类似的方法会很多,我们可否将该类型的方法独立于一个文件中?因为这种方法大部分情况下是不会改的,而放在MY_Model中则表示对它的修改开放了,可能会影响到这些方法。如果说该类叫ActiveRecord类,那可以让MY_Model继承ActiveRecord类,而ActiveRecord类继承CI_Model,参考代码见后面。
很多时候类库提供给我们的方法都是比较细的,我们可以封装一下,减少使用难度。关于模型中公用方法的封装一直还在考虑中,下面给出的只是一个针对单表的简单的操作,复杂的操作就得在特定的模型中实现,还有一些公用操作或者说非AR的操作方式可以统一下,看以后是否有机会再来考虑下这个问题。
公用AR封装类,可进行常用的操作,需要赋予db属性为数据库连接对象,并在模型中设置几个方法,如主键、表名
<?php if ( ! defined(''BASEPATH'')) exit(''No direct script access allowed''); class ActiveRecord extends CI_Model { /** * 保存数据 * * @param array $data 需要插入的表数据 * @return boolean 插入成功返回ID,插入失败返回false */ public function save($data) { if($this->db->set($data)->insert($this->tableName())) { return $this->db->insert_id(); } return FALSE; } /** * Replace数据 * @param array $data */ public function replace($data) { return $this->db->replace($this->tableName(), $data); } /** * 根据主键更新记录 * * @param string $pk 主键值 * @param array $attributes 更新字段 * @param array $where 附加where条件 * @return boolean true更新成功 false更新失败 */ public function updateByPk($pk, $attributes, $where = array()) { $where[$this->primaryKey()] = $pk; return $this->updateAll($attributes, $where); } /** * 更新表记录 * * @param array $attributes * @param array $where * @return bollean true更新成功 false更新失败 */ public function updateAll($attributes, $where = array()) { return $this->db->where($where)->update($this->tableName(), $attributes); } /** * 根据主键删除数据 * * @param string $pk 主键值 * @param array $where 附加删除条件 * @return boolean true删除成功 false删除失败 */ public function deleteByPk($pk, $where = array()) { $where[$this->primaryKey()] = $pk; return $this->deleteAll($where); } /** * 删除记录 * * @param array $where 删除条件 * @param int $limit 删除行数 * @return boolean true删除成功 false删除失败 */ public function deleteAll($where = array(), $limit = NULL) { return $this->db->delete($this->tableName(), $where, $limit); } /** * 根据主键检索 * * @param string $pk * @param array $where 附加查询条件 * @return array 返回一维数组,未找到记录则返回空数组 */ public function findByPk($pk, $where = array()) { $where[$this->primaryKey()] = $pk; $query = $this->db->from($this->tableName())->where($where)->get(); return $query->row_array(); } /** * 根据属性获取一行记录 * @param array $where * @return array 返回一维数组,未找到记录则返回空数组 */ public function findByAttributes($where = array()) { $query = $this->db->from($this->tableName())->where($where)->limit(1)->get(); return $query->row_array(); } /** * 查询记录 * * @param array $where 查询条件,可使用模糊查询,如array(''name LIKE'' => "pp%") array(''stat >'' => ''1'') * @param int $limit 返回记录条数 * @param int $offset 偏移量 * @param string|array $sort 排序, 当为数组的时候 如:array(''id DESC'', ''report_date ASC'')可以通过第二个参数来控制是否escape * @return array 未找到记录返回空数组 */ public function findAll($where = array(), $limit = 0, $offset = 0, $sort = NULL) { $this->db->from($this->tableName())->where($where); if($sort !== NULL) { if(is_array($sort)){ foreach($sort as $value){ $this->db->order_by($value, '''', false); } } else { $this->db->order_by($sort); } } if($limit > 0) { $this->db->limit($limit, $offset); } $query = $this->db->get(); return $query->result_array(); } /** * 统计满足条件的总数 * * @param array $where 统计条件 * @return int 返回记录条数 */ public function count($where = array()) { return $this->db->from($this->tableName())->where($where)->count_all_results(); } /** * 根据SQL查询, 参数通过$param绑定 * @param string $sql 查询语句,如SELECT * FROM some_table WHERE id = ? AND status = ? AND author = ? * @param array $param array(3, ''live'', ''Rick'') * @return array 未找到记录返回空数组,找到记录返回二维数组 */ public function query($sql, $param = array()) { $query = $this->db->query($sql, $param); return $query->result_array(); } } /* End of file ActiveRecord.php */ /* Location: ./application/core/database/ActiveRecord.php */
MY_Model可以继承该类,这样子模型中可以直接调用上面的方法。
<?php if ( ! defined(''BASEPATH'')) exit(''No direct script access allowed''); require_once APPPATH.''core/database/ActiveRecord.php''; class MY_Model extends ActiveRecord { public function __construct($group_name = '''') { $this->initDb($group_name); parent::__construct(); } protected function initDb($group_name = '''') { $db_conn_name = $this->getDbName($group_name); $CI = & get_instance(); if(isset($CI->{$db_conn_name}) && is_object($CI->{$db_conn_name})) { $this->db = $CI->{$db_conn_name}; } else { $CI->{$db_conn_name} = $this->db = $this->load->database($group_name, TRUE); } } private function getDbName($group_name = '''') { if($group_name == '''') { $db_conn_name = ''db''; } else { $db_conn_name = ''db_''.$group_name; } return $db_conn_name; } } /* End of file MY_Model.php */ /* Location: ./application/core/MY_Model.php */
更多关于CodeIgniter相关内容感兴趣的读者可查看本站专题:《codeigniter入门教程》和《CI(CodeIgniter)框架进阶教程》
希望本文所述对大家基于CodeIgniter框架的PHP程序设计有所帮助。
CI(CodeIgniter)模型用法实例分析,cicodeigniter
ci(codeigniter)模型用法实例分析,cicodeigniter
本文实例分析了ci(codeigniter)模型用法。分享给大家供大家参考,具体如下:
MVC中的业务逻辑放在控制器中或者模型里都是不合适的,所以这里对业务逻辑进行了分离,多出一层用来处理业务逻辑,模型就只当作数据访问层,这样子模型将会变得比较轻。CI中并未通过实体对象来传参,参数的传入和返回都由开发者控制,比较灵活。很多情况下都会以数组的方式传入或者返回。
模型的使用也比较简单,这里只提一下使用前想到的几个问题吧。
1、既然已经有了数据访问层了,那我们就应当避免在控制器或者某些类中直接通过SQL查询数据库,所有的数据库访问操作都应当经过模型获取,大多数情况下一个表名对应着一个模型类。
2、模型应当很方便的连接多个数据库,在database配置文件中有谈到多个库的配置问题,根据group_name的不同可以很方便的连接不同的库。如果有主从,还可以考虑到主从的切换使用问题。
3、模型是否还要按模块区分?在控制器中存在公用控制器分发的做法,在模型中这种思维可能不太好,但可以通过继承不同的公用模型类来实现,这些类再继承CI的MY_Model。在某些业务下根据模块来继承可能比较有用,大部分情况可以直接继承MY_Model,MY_Model主要实现数据库的初始化连接以及一些公用方法。
4、数据库提供的操作方式都是比较基础的,需要我们根据自身的需求去组装,但在我们日常操作中很多操作是类似的,如,根据主键获取信息,根据ID获取信息,根据属性获取信息等,可以对这些基础的操作在进行一次封装,更方便使用。因为如果要使用AR的方式来操作数据库,需要记住很多的方法,如我们根据用户名查询:
$query = $this->db->from(''user'')->where(array(''username'' => ''BobbyPeng''))->get(); return $query->row_array();
如果封装后,则只需要记住一个方法即可,如:
public function findByAttributes($where = array()) { $query = $this->db->from($this->tableName())->where($where)->get(); return $query->row_array(); }
这样子在每个模型中添加一个tableName的方法返回表名后,再通过模型就可以很方便的使用该方法了。
5、上面的方法属于一个公用方法,我们会写在MY_Model中,但这种类似的方法会很多,我们可否将该类型的方法独立于一个文件中?因为这种方法大部分情况下是不会改的,而放在MY_Model中则表示对它的修改开放了,可能会影响到这些方法。如果说该类叫ActiveRecord类,那可以让MY_Model继承ActiveRecord类,而ActiveRecord类继承CI_Model,参考代码见后面。
很多时候类库提供给我们的方法都是比较细的,我们可以封装一下,减少使用难度。关于模型中公用方法的封装一直还在考虑中,下面给出的只是一个针对单表的简单的操作,复杂的操作就得在特定的模型中实现,还有一些公用操作或者说非AR的操作方式可以统一下,看以后是否有机会再来考虑下这个问题。
公用AR封装类,可进行常用的操作,需要赋予db属性为数据库连接对象,并在模型中设置几个方法,如主键、表名
<?php if ( ! defined(''BASEPATH'')) exit(''No direct script access allowed''); class ActiveRecord extends CI_Model { /** * 保存数据 * * @param array $data 需要插入的表数据 * @return boolean 插入成功返回ID,插入失败返回false */ public function save($data) { if($this->db->set($data)->insert($this->tableName())) { return $this->db->insert_id(); } return FALSE; } /** * Replace数据 * @param array $data */ public function replace($data) { return $this->db->replace($this->tableName(), $data); } /** * 根据主键更新记录 * * @param string $pk 主键值 * @param array $attributes 更新字段 * @param array $where 附加where条件 * @return boolean true更新成功 false更新失败 */ public function updateByPk($pk, $attributes, $where = array()) { $where[$this->primaryKey()] = $pk; return $this->updateAll($attributes, $where); } /** * 更新表记录 * * @param array $attributes * @param array $where * @return bollean true更新成功 false更新失败 */ public function updateAll($attributes, $where = array()) { return $this->db->where($where)->update($this->tableName(), $attributes); } /** * 根据主键删除数据 * * @param string $pk 主键值 * @param array $where 附加删除条件 * @return boolean true删除成功 false删除失败 */ public function deleteByPk($pk, $where = array()) { $where[$this->primaryKey()] = $pk; return $this->deleteAll($where); } /** * 删除记录 * * @param array $where 删除条件 * @param int $limit 删除行数 * @return boolean true删除成功 false删除失败 */ public function deleteAll($where = array(), $limit = NULL) { return $this->db->delete($this->tableName(), $where, $limit); } /** * 根据主键检索 * * @param string $pk * @param array $where 附加查询条件 * @return array 返回一维数组,未找到记录则返回空数组 */ public function findByPk($pk, $where = array()) { $where[$this->primaryKey()] = $pk; $query = $this->db->from($this->tableName())->where($where)->get(); return $query->row_array(); } /** * 根据属性获取一行记录 * @param array $where * @return array 返回一维数组,未找到记录则返回空数组 */ public function findByAttributes($where = array()) { $query = $this->db->from($this->tableName())->where($where)->limit(1)->get(); return $query->row_array(); } /** * 查询记录 * * @param array $where 查询条件,可使用模糊查询,如array(''name LIKE'' => "pp%") array(''stat >'' => ''1'') * @param int $limit 返回记录条数 * @param int $offset 偏移量 * @param string|array $sort 排序, 当为数组的时候 如:array(''id DESC'', ''report_date ASC'')可以通过第二个参数来控制是否escape * @return array 未找到记录返回空数组 */ public function findAll($where = array(), $limit = 0, $offset = 0, $sort = NULL) { $this->db->from($this->tableName())->where($where); if($sort !== NULL) { if(is_array($sort)){ foreach($sort as $value){ $this->db->order_by($value, '''', false); } } else { $this->db->order_by($sort); } } if($limit > 0) { $this->db->limit($limit, $offset); } $query = $this->db->get(); return $query->result_array(); } /** * 统计满足条件的总数 * * @param array $where 统计条件 * @return int 返回记录条数 */ public function count($where = array()) { return $this->db->from($this->tableName())->where($where)->count_all_results(); } /** * 根据SQL查询, 参数通过$param绑定 * @param string $sql 查询语句,如SELECT * FROM some_table WHERE id = ? AND status = ? AND author = ? * @param array $param array(3, ''live'', ''Rick'') * @return array 未找到记录返回空数组,找到记录返回二维数组 */ public function query($sql, $param = array()) { $query = $this->db->query($sql, $param); return $query->result_array(); } } /* End of file ActiveRecord.php */ /* Location: ./application/core/database/ActiveRecord.php */
MY_Model可以继承该类,这样子模型中可以直接调用上面的方法。
<?php if ( ! defined(''BASEPATH'')) exit(''No direct script access allowed''); require_once APPPATH.''core/database/ActiveRecord.php''; class MY_Model extends ActiveRecord { public function __construct($group_name = '''') { $this->initDb($group_name); parent::__construct(); } protected function initDb($group_name = '''') { $db_conn_name = $this->getDbName($group_name); $CI = & get_instance(); if(isset($CI->{$db_conn_name}) && is_object($CI->{$db_conn_name})) { $this->db = $CI->{$db_conn_name}; } else { $CI->{$db_conn_name} = $this->db = $this->load->database($group_name, TRUE); } } private function getDbName($group_name = '''') { if($group_name == '''') { $db_conn_name = ''db''; } else { $db_conn_name = ''db_''.$group_name; } return $db_conn_name; } } /* End of file MY_Model.php */ /* Location: ./application/core/MY_Model.php */
更多关于CodeIgniter相关内容感兴趣的读者可查看本站专题:《codeigniter入门教程》和《CI(CodeIgniter)框架进阶教程》
希望本文所述对大家基于CodeIgniter框架的PHP程序设计有所帮助。
您可能感兴趣的文章:
- CodeIgniter自定义控制器MY_Controller用法分析
- Codeigniter控制器controller继承问题实例分析
- 2个Codeigniter文件批量上传控制器写法例子
- CodeIgniter钩子用法实例详解
- CodeIgniter配置之database.php用法实例分析
- CodeIgniter多语言实现方法详解
- CodeIgniter视图使用注意事项
- CodeIgniter读写分离实现方法详解
- CI(CodeIgniter)简单统计访问人数实现方法
- CodeIgniter控制器之业务逻辑实例分析
今天关于CodeIgniter配置之database.php用法实例分析和codeql php的讲解已经结束,谢谢您的阅读,如果想了解更多关于CI(CodeIgniter)模型用法实例分析、CI(CodeIgniter)模型用法实例分析_PHP、CI(CodeIgniter)模型用法实例分析_php实例、CI(CodeIgniter)模型用法实例分析,cicodeigniter的相关知识,请在本站搜索。
本文标签: