从零开始打造自己的PHP框架——第5章

黄祖
• 阅读 2746

目标

使用medoo插件来连接和操作数据库。

原文链接:http://www.voidking.com/2017/...

medoo基础

安装medoo

1、在composer中添加依赖:

"catfan/medoo": "*"

2、更新依赖
composer update

使用medoo

1、config目录添加medoo_config.php为:

<?php

return array(
    'database_type' => 'mysql',
    'database_name' => 'vkphp',
    'server' => 'localhost',
    'username' => 'root',
    'password' => '',
    'charset' => 'utf8',
    'port' => 3306,// 可选参数
    'prefix' => 'vk_',// 可选,定义表的前缀
);

2、core目录添加medoo.php为:

<?php
namespace core;

class medoo extends \Medoo\Medoo{
    public function __construct(){
        $conf = \core\conf::all('medoo_config');
        parent::__construct($conf);
    }
}

3、app/ctrl/indexCtrl.php中添加函数:

public function medoo(){
    $medoo = new \core\medoo();
    dump($medoo);
}

访问 http://vkphp.dev/index/medoo ,即可看到medoo的相关信息。
从零开始打造自己的PHP框架——第5章

增删查改

查找

$ret = $medoo->select('user','*',['username'=>'voidking']);
dump($ret);

插入

$data = array(
    'username'=>'voidking1',
    'password'=>'voidking1'
);
$ret = $medoo->insert('user',$data);
dump($ret);

因为medoo的版本问题(1.4.5),此时并没有打印出这条记录的id,而是PDOStatement object。此时,要想获取记录id,有两个方案:

方案一:从medoo中获取

dump($medoo->id());

方案二:找到vender/catfan/medoo/src/Medoo.php的第1173行,修改为

$this->exec('INSERT INTO ' . $this->tableQuote($table) . ' (' . implode(', ', $fields) . ') VALUES ' . implode(', ', $stack), $map);
return $this->pdo->lastInsertId();

删除

$ret = $medoo->delete('user',['username'=>'voidking2']);
dump($ret->rowCount()); // 受影响的行数

修改

$ret = $medoo->update('user',['username'=>'voidking2'],['username'=>'voidking1']);
dump($ret->rowCount());

medoo进阶

回顾

yii框架,对于每个表,我们都要创建一个model类,继承ActiveRecord类。比如:

<?php
namespace app\models;
use yii\db\ActiveRecord;

// Project.php
class Project extends ActiveRecord
{
    public static function model($className=__CLASS__)
    {
        return parent::model($className);
    }

    public function getTenProject(){
        // 具体实现
    }
}

在使用的时候,新建一个model对象,调用其中的方法即可:

$project = new Project();

thinkphp框架,对于每个表,我们不用创建model类。在使用的时候,直接新建一个默认model对象,传入表名,调用其中的方法即可:

$project = M('project');

当然,thinkphp也可以自定义model类,继承Model类。比如:

<?php
// ProjectModel.class.php
class ProjectModel extends Model{
    public function getTenProject(){
        // 具体实现
    }
}

使用D方法新建自定义model对象,找不到定义类的情况下会调用M方法:

$project = D('project');

yii和thinkphp的两种实现方案,异曲同工,同样都包含了默认model类和自定义model类。
yii中,默认model类为ActiveRecord,如果要自定义model类,继承它即可。
thinkphp中,默认model类为Model,如果要自定义model类,继承它即可。

model.php

鉴于yii的实现方式,我们也来新建一个model基类,其他的model类都继承它。

1、core目录下,新建model.php,内容如下:

<?php
namespace core;

class model extends \core\medoo{
    public $table_name = '';
    public function __construct($table_name){
        $name_arr = explode('\\',$table_name);
        $this->table_name = strtolower(end($name_arr));
        parent::__construct();
        //dump($this->table_name);
    }

    public function list_all(){
        $ret = $this->select($this->table_name,'*');
        return $ret;
    }

    public function find_by_id($id){
        $ret = $this->select($this->table_name,'*',['id'=>$id]);
        return $ret;
    }

    public function find_by_condition($condition){
        $ret = $this->select($this->table_name,'*',$condition);
        return $ret;
    }

    public function add($data){
        $ret = $this->insert($this->table_name,$data);
        return $this->id();
    }

    public function del($condition){
        $ret = $this->delete($this->table_name,$condition);
        return $ret->rowCount(); // 受影响的行数
    }

    public function edit($data,$condition){
        $ret = $this->update($this->table_name,$data,$condition);
        return $ret->rowCount();
    }

}

2、在app/model目录中新建user.php,内容如下:

<?php
namespace app\model;
class user extends \core\model{
    public function __construct(){
        parent::__construct(__CLASS__);
    }
}

3、在app/ctrl/indexCtrl.php中添加函数:

$user = new \app\model\user();
dump($user->list_all());
dump($user->find_by_id(1));
dump($user->find_by_condition(['username'=>'voidking']));
dump($user->add(['username'=>'voidking1','password'=>'voidking1']));
dump($user->edit(['username'=>'voidking2'],['username'=>'voidking1']));
dump($user->del(['username'=>'voidking2']));

访问 http://vkphp.dev/index/model ,可以看到操作结果:
从零开始打造自己的PHP框架——第5章

操作完成后,也许会感觉数据库表比较乱。这时可以清空表,并且重新从1开始自增id。
truncate vk_user;

小结

至此,整个框架已经基本完成。接下来,我们会开发一个迷你项目,在开发的过程中,测试并改进我们的框架。

源码分享

https://github.com/voidking/v...

书签

从零开始打造自己的PHP框架

Medoo官方文档

Medoo中文文档

点赞
收藏
评论区
推荐文章
blmius blmius
3年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
美凌格栋栋酱 美凌格栋栋酱
6个月前
Oracle 分组与拼接字符串同时使用
SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(
Wesley13 Wesley13
3年前
java中比较两个时间的差值
项目背景1.某篇文稿的发布时间是publishDate,例如:2020072118:00:41。2.现要求判断该篇文稿的发布时间是否在近30天之内。publicstaticlongdayDiff(DatecurrentDate,DatepublishDate){LongcurrentTimecurrentDat
Jacquelyn38 Jacquelyn38
4年前
2020年前端实用代码段,为你的工作保驾护航
有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )
Stella981 Stella981
3年前
KaliTools说明书+BurpSuit实战指南+SQL注入知识库+国外渗透报告
!(https://oscimg.oschina.net/oscnet/d1c876a571bb41a7942dd9752f68632e.gif"15254461546.gif")0X00KaliLinux Tools中文说明书!(https://oscimg.oschina.net/oscnet/
Wesley13 Wesley13
3年前
PHP常用代码大全(新手入门不可错过的好文章)
php常用代码大全,可以作为php入门教程(https://www.oschina.net/action/GoToLink?urlhttp%3A%2F%2Fwww.jbxue.com%2Fwb%2Fphp)使用,确实不错,收藏一下。1、连接MYSQL数据库代码<?php$connecmysql\_connect("localhost
Wesley13 Wesley13
3年前
MySQL总结(十一)子查询
!(https://oscimg.oschina.net/oscnet/upa344f41e81d3568e3310b5da00c57ced8ea.png)子查询1\.什么是子查询需求:查询开发部中有哪些员工selectfromemp;通
Wesley13 Wesley13
3年前
PHP创建多级树型结构
<!lang:php<?php$areaarray(array('id'1,'pid'0,'name''中国'),array('id'5,'pid'0,'name''美国'),array('id'2,'pid'1,'name''吉林'),array('id'4,'pid'2,'n
Stella981 Stella981
3年前
PHP7安装redis扩展
1、查看自己PHP的版本echophpinfo()查看自己的版本:VC是14,系统是64位的,所以一定要选对版本,因为这个版本我折腾了好久。2、根据自己的PHP版本、编译器的版本以及cpu我的是php是7.0、VC14、X64。附上我的下载链接redis、igbinary的链接:Redis:http://windows.php.n
Wesley13 Wesley13
3年前
thinkphp5.0数据库操作
ThinkPHP数据库处理:1.MySQL的数据库连接首先配置database.php文件使用{dump(config('database));}来查看数据库的配置项使用{$resDb::connect();dump($res);}来查看数据库的连接信息我们可以在{Db::connect()}中来配置数据库的连接,具体
Stella981 Stella981
3年前
PHP+jQuery寥寥几行代码轻松实现百度搜索那样的无刷新PJAX的分页列表和导航链接
!(https://static.oschina.net/uploads/space/2016/1208/171419_U00R_561214.png)PHP寥寥几行代码轻松实现百度搜索那样的分页列表和导航链接,某些语言的拥趸哭晕在厕所.<?php$apparray('db_prefix''