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令牌 Token改进版
Jul 18 PHP
PHP 文件扩展名 获取函数
Jun 03 PHP
php header示例代码(推荐)
Sep 08 PHP
php fsockopen解决办法 php实现多线程
Jan 20 PHP
ThinkPHP模板判断输出Defined标签用法详解
Jun 30 PHP
php采用curl模仿登录人人网发布动态的方法
Nov 07 PHP
php中current、next与reset函数用法实例
Nov 17 PHP
php利用ffmpeg提取视频中音频与视频画面的方法详解
Jun 07 PHP
php处理静态页面:页面设置缓存时间实例
Jun 22 PHP
PHP使用标准库spl实现的观察者模式示例
Aug 04 PHP
PHP filesize函数用法浅析
Feb 15 PHP
thinkPHP5框架实现多数据库连接,跨数据连接查询操作示例
May 29 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
PHP新手上路(五)
2006/10/09 PHP
PHP中文件读、写、删的操作(PHP中对文件和目录操作)
2012/03/06 PHP
Php中使用Select 查询语句的实例
2014/02/19 PHP
thinkphp的静态缓存用法分析
2014/11/29 PHP
php使用unset()删除数组中某个单元(键)的方法
2015/02/17 PHP
Yii框架日志记录Logging操作示例
2018/07/12 PHP
HTML5如何适配 iPhone IOS 底部黑条
2021/03/09 HTML / CSS
国外Lightbox v2.03.3 最新版 下载
2007/10/17 Javascript
jquery单行文字向上滚动效果示例
2014/03/06 Javascript
jQuery关键词说明插件cluetip使用指南
2015/04/21 Javascript
Bootstrap框架的学习教程详解(二)
2016/10/18 Javascript
关于在vue-cli中使用微信自动登录和分享的实例
2017/06/22 Javascript
jQuery Collapse1.1.0折叠插件简单使用
2017/08/28 jQuery
Express使用html模板的详细代码
2017/09/18 Javascript
vue+element搭建后台小总结 el-dropdown下拉功能
2020/04/10 Javascript
基于vue+uniapp直播项目实现uni-app仿抖音/陌陌直播室功能
2019/11/12 Javascript
日常整理python执行系统命令的常见方法(全)
2015/10/22 Python
老生常谈Python基础之字符编码
2017/06/14 Python
Python2随机数列生成器简单实例
2017/09/04 Python
Python2中文处理纪要的实现方法
2018/03/10 Python
Python实现统计给定字符串中重复模式最高子串功能示例
2018/05/16 Python
Python Pillow Image Invert
2019/01/22 Python
python三引号输出方法
2019/02/27 Python
python3+PyQt5 创建多线程网络应用-TCP客户端和TCP服务器实例
2019/06/17 Python
用python wxpy管理微信公众号并利用微信获取自己的开源数据
2019/07/30 Python
Python进阶之迭代器与迭代器切片教程
2020/01/29 Python
解决Python数据可视化中文部分显示方块问题
2020/05/16 Python
10种CSS3实现的loading动画,挑一个走吧?
2020/11/16 HTML / CSS
请写出 float x 与"零值"比较的 if 语句
2016/01/04 面试题
法制宣传实施方案
2014/03/13 职场文书
关爱残疾人演讲稿
2014/05/24 职场文书
个人简历自荐信
2014/06/26 职场文书
见习期个人总结
2015/03/05 职场文书
导游词之苏州盘门景区
2019/11/12 职场文书
vue3获取当前路由地址
2022/02/18 Vue.js
Redis 中使用 list,streams,pub/sub 几种方式实现消息队列的问题
2022/03/16 Redis