找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 551|回复: 0
打印 上一主题 下一主题

PHP基于MySQL数据库实现对象持久层的方法

[复制链接]

2617

主题

2617

帖子

7789

积分

论坛元老

Rank: 8Rank: 8

积分
7789
跳转到指定楼层
楼主
发表于 2018-2-14 05:45:20 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

            本文实例讲述了PHP基于MySQL数据库实现对象持久层的方法。分享给大家供大家参考。具体如下:
心血来潮,做了一下PHP的对象到数据库的简单持久层。
不常用PHP,对PHP也不熟,关于PHP反射的大部分内容都是现学的。
目前功能比较弱,只是完成一些简单的工作,对象之间的关系还没法映射,并且对象的成员只能支持string或者integer两种类型的。
成员变量的值也没有转义一下。。。
下面就贴一下代码:
首先是数据库的相关定义,该文件定义了数据库的连接属性:

下面是数据库访问的简单封装:

其实上面的两个文件都是之前写好的,持久层的东西是下面的:
hasProperty('tablename')) {
      throw new Exception("Class '$class' has no [tablename] property");
    }
    $table = $r->getStaticPropertyValue('tablename');
    if (!$r->hasProperty('id')) {
      throw new Exception("Class '$class' has no [id] property");
    }
    $mpts = Array ();
    $pts = $r->getProperties(ReflectionProperty :: IS_PUBLIC);
    foreach ($pts as $pt) {
      if (!$pt->isStatic()) {
        array_push($mpts, $pt);
      }
    }
    return Array (
      $table,
      $mpts
    );
  }
  function SinORM_GetPropertyString($pts, $class, $obj = false, $noid = false) {
    if (is_null($pts)) {
      list ($tb, $pts) = SinORM_GetClassPropertys($class);
    }
    $s = false;
    $v = false;
    $l = false;
    foreach ($pts as $pt) {
      $name = $pt->name;
      if ($noid == false || $name != 'id') {
        if ($l) {
          $s = $s . ',';
        }
        $s = $s . $name;
   
        if ($obj) {
          if ($l) {
            $v = $v . ',';
          }
          $val = $pt->getValue($obj);
          if (is_null($val))
            $v = $v . 'null';
          if (is_string($val))
            $v = $v . "'$val'";
          else
            $v = $v . $val;
        }
        $l = true;
      }
    }
    return Array (
      $s,
      $v
    );
  }
  function SinORM_GetTableName($class){
    $r = new ReflectionClass($class);
    if (!$r->hasProperty('tablename')) {
      throw new Exception("Class '$class' has no [tablename] property");
    }
    $table = $r->getStaticPropertyValue('tablename');
    if (!$r->hasProperty('id')) {
      throw new Exception("Class '$class' has no [id] property");
    }
    return $table;
  }
  function SinORM_ResetORM($class) {
    list ($tb, $pts) = SinORM_GetClassPropertys($class);
    $sql = "CREATE TABLE `$tb` (`id` int NOT NULL AUTO_INCREMENT";
    $r = new ReflectionClass($class);
    $obj = $r->newInstance();
    foreach ($pts as $pt) {
      $val = $pt->getValue($obj);
      $name = $pt->name;
      if ($name != 'id') {
        $sql = $sql . ',';
      } else {
        continue;
      }
      if (is_null($val))
        throw new Exception($class . '->' . "name must have a default value");
      if (is_string($val))
        $sql = $sql . "`$name` text NULL";
      else
        $sql = $sql . "`$name` int NULL";
    }
    $sql = $sql . ",PRIMARY KEY (`id`));";
    $dsql = "DROP TABLE IF EXISTS `$tb`;";
    return SinORM_ExecSql($dsql) && SinORM_ExecSql($sql);
  }
  function SinORM_SaveObject($obj) {
    $class = get_class($obj);
    list ($tb, $pts) = SinORM_GetClassPropertys($class);
    list ($names, $vals) = SinORM_GetPropertyString($pts, $class, $obj, true);
    $sql = "INSERT INTO `$tb`($names) values($vals)";
    if(SinORM_ExecSql($sql)){
      $q = "SELECT `id` FROM `$tb` ORDER BY `id` DESC LIMIT 1;";
      $id = SinORM_ExecResult($q);
      if($id){
        $obj->id = $id;
      }
    }
    return false;
  }
  function SinORM_GetObjects($class) {
    list ($tb, $pts) = SinORM_GetClassPropertys($class);
    $sql = "SELECT * from `$tb`;";
    $ary = SinORM_ExecArray($sql);
    $res = false;
    if (is_array($ary)) {
      $res = Array ();
      $ref = new ReflectionClass($class);
      foreach ($ary as $a) {
        $obj = $ref->newInstance();
        foreach ($pts as $pt) {
          $name = $pt->name;
          $olv = $pt->getValue($obj);
          $val = $a[$name];
          if (is_string($olv))
            $pt->setValue($obj, $val);
          else
            $pt->setValue($obj, intval($val));
        }
        array_push($res, $obj);
      }
    } else {
      echo 'no';
    }
    return $res;
  }
  function SinORM_GetObject($class, $id) {
    list ($tb, $pts) = SinORM_GetClassPropertys($class);
    $sql = "SELECT * from `$tb` where `id`=$id;";
    $ary = SinORM_ExecArray($sql);
    $res = null;
    if (is_array($ary) && count($ary) > 0) {
      $res = Array ();
      $ref = new ReflectionClass($class);
      $a = $ary[0];
      $obj = $ref->newInstance();
      foreach ($pts as $pt) {
        $name = $pt->name;
        $olv = $pt->getValue($obj);
        $val = $a[$name];
        if (is_string($olv))
          $pt->setValue($obj, $val);
        else
          $pt->setValue($obj, intval($val));
      }
      return $obj;
    }
    return null;
  }
  function SinORM_Update($obj) {
    $class = get_class($obj);
    list ($tb, $pts) = SinORM_GetClassPropertys($class);
    $sql = "UPDATE `$tb` SET ";
    $l = false;
    foreach ($pts as $pt) {
      $name = $pt->name;
      $val = $pt->getValue($obj);
      if ($name == 'id')
        continue;
      if ($l)
        $sql = $sql . ',';
      if (is_string($val))
        $sql = $sql . "$name='$val'";
      else
        $sql = $sql . "$name=$val";
      $l = true;
    }
    $sql = $sql . " WHERE `id`=$obj->id;";
    return SinORM_ExecSql($sql);
  }
  function SinORM_SaveOrUpdate($obj) {
    if (SinORM_GetObject(get_class($obj), $obj->id) == null) {
      SinORM_SaveObject($obj);
    } else {
      SinORM_Update($obj);
    }
  }
  function SinORM_DeleteObject($obj){
    $class = get_class($obj);
    $tb = SinORM_GetTableName($class);
    $sql = "DELETE FROM `$tb` WHERE `id`=$obj->id;";
    return SinORM_ExecSql($sql);
  }
  function SinORM_DeleteAll($class){
    $tb = SinORM_GetTableName($class);
    $sql = "DELETE FROM `$tb`;";
    return SinORM_ExecSql($sql);
  }
?>
下面是使用的例子:
name = 'TRB';
  $user1->age = 22;
  $user1->email = 'trbbadboy@qq.com';
  SinORM_SaveObject($user1); // 把对象保存到数据库中
   
  // 保存之后会自动给id的
  $id = $user1->id;
  echo $id . '
';
   
  $user2 = SinORM_GetObject('User', $id); // 通过ID从数据库创建一个对象
  echo $user2->name . '
';
   
  $user1->name = 'trb'; // 改变一下
  SinORM_Update($user1); // 更新到数据库
   
  $user3 = SinORM_GetObject('User', $id); // 重新读出
  echo $user3->name . '
';
?>
希望本文所述对大家的php程序设计有所帮助。
            
            
您可能感兴趣的文章:
  • php将csv文件导入到mysql数据库的方法
  • php将图片保存入mysql数据库失败的解决方法
  • php简单操作mysql数据库的类
  • php实现mysql数据库分表分段备份
  • PHP将Excel导入数据库及数据库数据导出至Excel的方法
  • PHP实现上传文件并存进数据库的方法
  • PHP使用ODBC连接数据库的方法
  • php实现将Session写入数据库
  • 1亿条数据如何分表100张到Mysql数据库中(PHP)
  • 初识通用数据库操作类——前端easyui-datagrid,form(php)
  • php基于session实现数据库交互的类实例
  • php页面,mysql数据库转utf-8乱码,utf-8编码问题总结
  • 常见PHP数据库解决方案分析介绍
            
  • 分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
    收藏收藏
    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    用户反馈
    客户端