PHP基于ORM方式操作MySQL数据库实例


Posted in PHP onJune 21, 2017

本文实例讲述了PHP基于ORM方式操作MySQL数据库。分享给大家供大家参考,具体如下:

ORM----Oriented Relationship Mapper,即用面向对象的方式来操作数据库。归根结底,还是对于SQL语句的封装。

首先,我们的数据库有如下一张表:

PHP基于ORM方式操作MySQL数据库实例

我们希望能够对这张表,利用setUserid("11111"),即可以设置userid;getUserid()既可以获得对象的userid。所以,我们需要建立model对象,与数据库中的表对应。

由于每张表所对应的model都应该是有set/get操作,所以,我们用一个父类BasicModel进行定义。其他model都是继承至这个model。

BasicModel的代码如下:

<?php
  /*
   * author:Tammy Pi
   * function:Model类的基类,封装set/get操作
   */
  class BasicModel{
    private $map = null;
    function TbUser() {
      $this->map = array();
    }
    function __set($key,$value){
      $this->map[$key] = $value;
    }
    function __get($key){
      return $this->map[$key];
    }
    function __call($name,$arguments) {
      if(substr($name,0,3)=='set'){
        $this->__set(strtolower(substr($name,3)),$arguments[0]);
      }else{
        return $this->__get(strtolower(substr($name,3)));
      }
    }
  }
?>

那么,与tb_user表相互对应的model类TbUser则对它进行继承。

<?php
  require_once("BasicModel.php");
  class TbUser extends BasicModel{
  }
?>

这样,我们就可以对TbUser的实例进行set/get操作了。

要用ORM进行操作数据库,就必须可以findByWhere($where)进行查询,返回的为对象数组;save($tbUser)进行保存;delete($obj)进行删除;update($obj)进行更新操作。

本质上,就是用户传入的是对象,我们再利用代码将对象转换为SQL语句。本质上,执行的还是SQL语句。

所以,我们对一系列的操作用接口表示。IBasicDAO的代码如下:

<?php
  interface IBasicDAO {
    public function findByWhere($where);
    public function findWhereOrderBy($where,$order,$start=null,$limit=null);
    public function save($obj);
    public function delete($obj);
    public function update($obj);
  }
?>

我们最关键,就是对此接口进行实现。完成对象和SQL的转换。
BasicDAO的代码如下:

<?php
  require_once("IBasicDAO.php");
  class BasicDAO implements IBasicDAO{
    protected $modelName = null;
    private $tableName = null;
    private $h = "localhost";
    private $user = "root";
    private $pass = "root";
    private $db = "db_toilet";
    //获得连接
    public function getConnection(){
      $conn = mysqli_connect($this->h,$this->user,$this->pass,$this->db);
      return $conn;
    }
    //初始化
    public function init() {
      //根据model的名字得到表的名字
      $this->tableName = strtolower(substr($this->modelName,0,2))."_".strtolower(substr($this->modelName,2));
    }
    //获得一个表的列名
    public function getColumn($tableName) {
      $sql = "show columns from ".$tableName;
      $conn = $this->getConnection();
      $columns = array();
      if($conn!=null){
        $rtn = mysqli_query($conn,$sql);
        while($rtn!==false&&($row=mysqli_fetch_array($rtn))!=null){
          $columns[] = $row[0];
        }
        mysqli_close($conn);
      }
      return $columns;
    }
    //条件查询
    public function findByWhere($where){
      //获得数据表的列名
      $columns = $this->getColumn($this->tableName);
      //拼接sql语句
      $sql = "select * from ".$this->tableName." where ".$where;
      $conn = $this->getConnection();
      $arr = array();
      if($conn!=null){
        $rtn = mysqli_query($conn,$sql);
        while($rtn!==false&&($row=mysqli_fetch_array($rtn))!=null){
          $index = -1;
          $obj = new $this->modelName();
          foreach($columns as $column){
            $obj->{"set".ucfirst($column)}($row[++$index]);
          }
          $arr[] = $obj;
        }
        mysqli_close($conn);
      }
      return $arr;
    }
    //分页查询;支持排序
    public function findWhereOrderBy($where,$order,$start=null,$limit=null){
      //获得数据表的列名
      $columns = $this->getColumn($this->tableName);
      //拼接sql语句
      $sql = "select * from ".$this->tableName." where ".$where." order by ".$order;
      if($start!=null&&$limit!=null){
        $sql .= "limit ".$start.",".$limit;
      }
      $conn = $this->getConnection();
      $arr = array();
      if($conn!=null){
        $rtn = mysqli_query($conn,$sql);
        while($rtn!==false&&($row=mysqli_fetch_array($rtn))!=null){
          $index = -1;
          $obj = new $this->modelName();
          foreach($columns as $column){
            $obj->{"set".ucfirst($column)}($row[++$index]);
          }
          $arr[] = $obj;
        }
        mysqli_close($conn);
      }
      return $arr;
    }
    //保存操作
    public function save($obj){
      $columns = $this->getColumn($this->tableName);
      $conn = $this->getConnection();
      $tag = false;
      if($conn!=null){
        $sql = "insert into ".$this->tableName."(";
        foreach($columns as $column){
          $sql .= $column.",";
        }
        $sql = substr($sql,0,strlen($sql)-1).") values(";
        foreach($columns as $column){
          $value = $obj->{"get".ucfirst($column)}();
          //判断$value的类型
          if($value==null){
            $sql .= "null,";
          }else if(preg_match("/^[0-9]*$/", $value)){
            //是数字
            $sql .= $value.",";
          }else{
            $sql .= "'".$value."',";
          }
        }
        $sql = substr($sql,0,strlen($sql)-1);
        $sql .= ")";
        //执行sql语句
        mysqli_query($conn,$sql);
        $tag = true;
        mysqli_close($conn);
      }
      return $tag;
    }
    //删除操作
    public function delete($obj){
      $conn = $this->getConnection();
      $tag = false;
      if($conn!=null){
        $sql = "delete from ".$this->tableName." where ";
        $columns = $this->getColumn($this->tableName);
        $value = $obj->{"get".ucfirst($columns[0])}();
        if($value!=null){
          //是数字
          if(preg_match("/^[0-9]*$/", $value)){
            $sql .= $columns[0]."=".$value;
          }else{
            $sql .= $columns[0]."='".$value."'";
          }
          //执行
          mysqli_query($conn,$sql);
          $tag = true;
        }
        mysqli_close($conn);
      }
      return $tag;
    }
    //更新操作
    public function update($obj){
      $conn = $this->getConnection();
      $columns = $this->getColumn($this->tableName);
      $tag = false;
      if($conn!=null){
        $sql = "update ".$this->tableName." set ";
        for($i=1;$i<count($columns);$i++){
          $column = $columns[$i];
          $value = $obj->{"get".ucfirst($columns[$i])}();
          if($value==null){
            $sql .= $column."=null,";
          }else if(preg_match("/^[0-9]*$/",$value)){
            $sql .= $column."=".$value.",";
          }else{
            $sql .= $column."='".$value."',";
          }
        }
        $sql = substr($sql,0,strlen($sql)-1);
        $sql .= " where ";
        $tempColumn = $columns[0];
        $tempValue = $obj->{"get".ucfirst($columns[0])}();
        if(preg_match("/^[0-9]*$/", $tempValue)){
          $sql .= $tempColumn."=".$tempValue;
        }else{
          $sql .= $tempColumn."='".$tempValue."'";
        }
        //执行操作
        mysqli_query($conn,$sql);
        $tag = true;
        mysqli_close($conn);
      }
      return $tag;
    }
  }
?>

那么,对tb_user表进行操作时,主要利用的是TbUserDAO,它将modelName设置为"TbUser",代码就得知操作的表为tb_user,然后就可以进行一系列操作了。

<?php
  require_once("BasicDAO.php");
  require_once("../model/TbUser.php");
  class TbUserDAO extends BasicDAO{
    function TbUserDAO(){
      $this->modelName = 'TbUser';
      parent::init();
    }
  }
?>

那么,就可以采用面向对象的方式对数据库进行操作了。
如:

$tbUserDAO = new TbUserDAO();
$tbUser = new TbUser();
$tbUser->setUserid("fetchingsoft@163.com");
$tbUser->setUsername("fetching");
$tbUserDAO->update($tbUser);
echo "执行成功!";
print_r($list);

这样对数据库中的记录进行更新。

希望本文所述对大家PHP程序设计有所帮助。

PHP 相关文章推荐
小偷PHP+Html+缓存
Dec 20 PHP
PHP学习笔记之三 数据库基本操作
Jan 17 PHP
php设计模式 Chain Of Responsibility (职责链模式)
Jun 26 PHP
利用浏览器的Javascript控制台调试PHP程序
Jan 08 PHP
php获取客户端电脑屏幕参数的方法
Jan 09 PHP
FleaPHP框架数据库查询条件($conditions)写法总结
Mar 19 PHP
详解PHP中foreach的用法和实例
Oct 25 PHP
PHP面向对象继承用法详解(优化与减少代码重复)
Dec 02 PHP
基于php实现的验证码小程序
Dec 13 PHP
PHP批量修改文件名称的方法分析
Feb 27 PHP
PHP中常用的魔术方法
Apr 28 PHP
laravel框架分组控制器和分组路由实现方法示例
Jan 25 PHP
php 猴子摘桃的算法
Jun 20 #PHP
详解php框架Yaf路由重写
Jun 20 #PHP
PHP简单计算两个时间差的方法示例
Jun 20 #PHP
php实现的错误处理封装类实例
Jun 20 #PHP
PHP实现在windows下配置sendmail并通过mail()函数发送邮件的方法
Jun 20 #PHP
php实现的双色球算法示例
Jun 20 #PHP
php实现的二分查找算法示例
Jun 20 #PHP
You might like
摩卡咖啡
2021/03/03 咖啡文化
php读取富文本的时p标签会出现红线是怎么回事
2014/05/13 PHP
PHP异常处理Exception类
2015/12/11 PHP
php利用ob_start()清除输出和选择性输出的方法
2018/01/18 PHP
PHP实现APP微信支付的实例讲解
2018/02/10 PHP
jQuery动态改变图片显示大小(修改版)的实现思路及代码
2013/12/24 Javascript
js 通过html()及text()方法获取并设置p标签的显示值
2014/05/14 Javascript
Javascript+CSS实现影像卷帘效果思路及代码
2014/10/20 Javascript
javascript去除字符串左右两端的空格
2015/02/05 Javascript
js实现鼠标划过给div加透明度的方法
2015/05/25 Javascript
bootstrap布局中input输入框右侧图标点击功能
2016/05/16 Javascript
Bootstarp基本模版学习教程
2017/02/01 Javascript
JS实现的tab切换选项卡效果示例
2017/02/28 Javascript
vue的滚动条插件实现代码
2019/09/07 Javascript
24个解决实际问题的ES6代码片段(小结)
2020/02/02 Javascript
详解Vue中的Props与Data细微差别
2020/03/02 Javascript
vue.js实现简单购物车功能
2020/05/30 Javascript
vue 如何使用递归组件
2020/10/23 Javascript
vue项目打包后请求地址错误/打包后跨域操作
2020/11/04 Javascript
[57:22]2018DOTA2亚洲邀请赛 4.7总决赛 LGD vs Mineski 第五场
2018/04/10 DOTA
[07:01]DOTA2-DPC中国联赛正赛 Aster vs Magma 3月5日 赛后选手采访
2021/03/11 DOTA
python  创建一个保留重复值的列表的补码
2018/10/15 Python
Python3解释器知识点总结
2019/02/19 Python
在python中实现同行输入/接收多个数据的示例
2019/07/20 Python
Python将视频或者动态图gif逐帧保存为图片的方法
2019/09/10 Python
Python 代码调试技巧示例代码
2020/08/11 Python
Pytorch 扩展Tensor维度、压缩Tensor维度的方法
2020/09/09 Python
Python数据模型与Python对象模型的相关总结
2021/01/26 Python
美国一家主营日韩美妆护肤品的在线商店:iMomoko
2016/09/11 全球购物
Ralph Lauren意大利官方网站:时尚界最负盛名的品牌之一
2018/10/18 全球购物
清明节扫墓活动方案
2014/03/02 职场文书
秸秆管理实施方案
2014/03/15 职场文书
自我管理的活动方案
2014/08/25 职场文书
处级领导班子全部召开专题民主生活会情况汇报
2014/09/27 职场文书
mysql知识点整理
2021/04/05 MySQL
MySQL定时备份数据库(全库备份)的实现
2021/09/25 MySQL