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 相关文章推荐
PHP4实际应用经验篇(5)
Oct 09 PHP
php 8小时时间差的解决方法小结
Dec 22 PHP
php 归并排序 数组交集
May 10 PHP
关于php内存不够用的快速解决方法
Oct 26 PHP
php文件夹的创建与删除方法
Jan 24 PHP
简单了解将WordPress中的工具栏移到底部的小技巧
Dec 31 PHP
php上传图片类及用法示例
May 11 PHP
CI框架(ajax分页,全选,反选,不选,批量删除)完整代码详解
Nov 01 PHP
PHP之将POST数据转化为字符串的实现代码
Nov 03 PHP
php检测mysql表是否存在的方法小结
Jul 20 PHP
php实现数组中出现次数超过一半的数字的统计方法
Oct 14 PHP
PHP实现通过二维数组键值获取一维键名操作示例
Oct 11 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
一键删除顽固的空文件夹 软件下载
2007/01/26 PHP
php基础学习之变量的使用
2011/06/09 PHP
PHP curl 并发最佳实践代码分享
2012/09/05 PHP
PHP执行批量mysql语句的解决方法
2013/05/02 PHP
PHP 登录完成后如何跳转上一访问页面
2014/01/14 PHP
用JavaScript调用WebService的示例
2008/04/07 Javascript
JS 有名函数表达式全面解析
2010/03/19 Javascript
实用jquery操作表单元素的简单代码
2016/07/04 Javascript
基于jQuery实现咖啡订单管理简单应用
2017/02/10 Javascript
详解如何在NodeJS项目中优雅的使用ES6
2017/04/22 NodeJs
JS回调函数基本定义与用法实例分析
2017/05/24 Javascript
zTree获取当前节点的下一级子节点数实例
2017/09/05 Javascript
JavaScript登录验证基础教程
2017/11/01 Javascript
JS计算两个时间相差分钟数的方法示例
2018/01/10 Javascript
JavaScript模板引擎应用场景及实现原理详解
2018/12/14 Javascript
JavaScript函数式编程(Functional Programming)高阶函数(Higher order functions)用法分析
2019/05/22 Javascript
解决vue无法侦听数组及对象属性的变化问题
2020/07/17 Javascript
[35:44]2014 DOTA2华西杯精英邀请赛 5 24 iG VS VG
2014/05/26 DOTA
Python函数参数类型*、**的区别
2015/04/11 Python
Pycharm学习教程(6) Pycharm作为Vim编辑器使用
2017/05/03 Python
Django实战之用户认证(初始配置)
2018/07/16 Python
Python unittest 简单实现参数化的方法
2018/11/30 Python
Python删除n行后的其他行方法
2019/01/28 Python
解决pycharm 工具栏Tool中找不到Run manager.py Task的问题
2019/07/01 Python
安装2019Pycharm最新版本的教程详解
2019/10/22 Python
解决Python数据可视化中文部分显示方块问题
2020/05/16 Python
宏碁西班牙官网:Acer西班牙
2021/01/08 全球购物
品管员岗位职责
2013/11/10 职场文书
新学期校长寄语
2014/01/18 职场文书
食堂采购员岗位职责
2014/03/17 职场文书
医院领导班子整改方案
2014/10/01 职场文书
2015年青年志愿者工作总结
2015/05/20 职场文书
新学期感想
2015/08/10 职场文书
《女娲补天》教学反思
2016/02/20 职场文书
CSS 实现多彩、智能的阴影效果
2021/05/12 HTML / CSS
mybatis 解决从列名到属性名的自动映射失败问题
2021/06/30 Java/Android