如何在Codeigniter v3中集成Medoo?v3.1.8版本配置咨询
CodeIgniter 3.1.8 集成 Medoo 完整指南(亲测可用)
我之前在CI3.1.8版本上折腾过Medoo的集成,踩过几个小坑,给你整理了完整的步骤和避坑方案,两种集成方式按需选就行:
一、先搞定Medoo的准备工作
先去Medoo官网下载对应PHP版本的库——CI3.1.8支持PHP5.6及以上,如果你服务器是PHP5.6,就选Medoo v1.x;PHP7.1+的话直接用最新的v2.x就行。解压后把核心的medoo.php文件单独拿出来备用。
二、两种集成方式,看你需求选
方式1:直接引入(快速测试/小型项目)
这种方式不用改CI的任何配置,适合临时测试或者小项目快速上手:
- 把
medoo.php放到CI项目的application/libraries或者application/third_party目录(看你自己习惯放哪)。 - 在需要用的控制器/模型里直接引入并初始化,建议复用CI的数据库配置,避免重复写一遍:
// 先引入Medoo文件,路径根据你放的位置调整 require APPPATH . 'libraries/medoo.php'; class TestController extends CI_Controller { public function index() { // 拿CI的数据库配置,省得再写一遍账号密码 $ci_db_config = $this->config->item('database'); // 初始化Medoo $this->medoo = new Medoo([ 'database_type' => 'mysql', 'database_name' => $ci_db_config['database'], 'server' => $ci_db_config['hostname'], 'username' => $ci_db_config['username'], 'password' => $ci_db_config['password'], 'charset' => $ci_db_config['char_set'], 'port' => $ci_db_config['port'] ?? 3306, // 要是CI设置了表前缀,这里也加上,保持一致 'prefix' => $ci_db_config['dbprefix'] ]); // 测试一下查询,没问题的话就能正常用了 $user_list = $this->medoo->select('users', ['id', 'nickname']); var_dump($user_list); } }
方式2:作为CI库集成(规范推荐,全局可用)
如果是中大型项目,建议把Medoo做成CI的标准库,这样全局都能调用,更符合CI的开发习惯:
- 把
medoo.php放到application/libraries目录。 - 在同一个目录下新建一个
Medoo_lib.php文件(CI的库文件名首字母要大写,注意命名规则),内容如下:
<?php defined('BASEPATH') OR exit('No direct script access allowed'); // 引入Medoo核心文件 require APPPATH . 'libraries/medoo.php'; class Medoo_lib extends Medoo { public function __construct() { // 拿到CI的全局实例,获取数据库配置 $CI =& get_instance(); $db_config = $CI->config->item('database'); // 组装Medoo的配置,复用CI的配置项 $medoo_config = [ 'database_type' => 'mysql', 'database_name' => $db_config['database'], 'server' => $db_config['hostname'], 'username' => $db_config['username'], 'password' => $db_config['password'], 'charset' => $db_config['char_set'], 'port' => $db_config['port'] ?? 3306, 'prefix' => $db_config['dbprefix'] ]; // 调用Medoo的构造函数完成初始化 parent::__construct($medoo_config); } }
- 现在就可以在任何控制器/模型里轻松调用了:
class Home extends CI_Controller { public function __construct() { parent::__construct(); // 加载Medoo库 $this->load->library('medoo_lib'); // 给个短别名,写起来更顺手 $this->db_medoo =& $this->medoo_lib; } public function get_user_info() { // 用Medoo查数据,语法和CI的Active Record不一样,别搞混了 $user = $this->db_medoo->get('users', ['id', 'email'], ['id' => 1]); print_r($user); } }
三、解决你遇到的“无法协同工作”问题
我当时踩过的坑,大概率也是你遇到的问题:
- PHP版本不兼容:Medoo v2.x要求PHP7.1+,如果你的服务器还是PHP5.6,直接用v1.x版本就行,不然会报语法错误。
- 数据库连接冲突:别同时让CI原生DB和Medoo用不同的配置,尽量复用CI的配置,避免连接数超标或者事务冲突。
- 命名冲突:千万别把Medoo实例命名为
$this->db,会直接覆盖CI原生的数据库对象,到时候想用CI的原生查询就傻了。 - 命名空间问题:如果用的是带命名空间的Medoo版本,记得在CI的文件里加上
use Medoo\Medoo;,或者直接用全局类名初始化。
四、小提醒
- 要是需要多数据库连接,直接在Medoo的初始化配置里单独指定就行,不用改CI的默认配置。
- Medoo的查询语法和CI的Active Record差异不小,写的时候别搞混了,比如Medoo的插入是
$this->medoo->insert('table', [...]),和CI的写法不一样。
内容的提问来源于stack exchange,提问作者Sid
相关产品推荐
相关产品推荐

