当前位置:首页 > PHP教程 > php高级应用 > 列表

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

发布:smiling 来源: PHP粉丝网  添加日期:2021-05-28 11:58:02 浏览: 评论:0 

这篇文章主要介绍了PHP基于MySQL数据库实现对象持久层的方法,实例分析了php实现持久层的相关技巧,需要的朋友可以参考下。

本文实例讲述了PHP基于MySQL数据库实现对象持久层的方法,分享给大家供大家参考,具体如下:

心血来潮,做了一下PHP的对象到数据库的简单持久层。

不常用PHP,对PHP也不熟,关于PHP反射的大部分内容都是现学的。

目前功能比较弱,只是完成一些简单的工作,对象之间的关系还没法映射,并且对象的成员只能支持string或者integer两种类型的。

成员变量的值也没有转义一下。。。

下面就贴一下代码:

首先是数据库的相关定义,该文件定义了数据库的连接属性:

  1. <?php  
  2. /*  
  3.  * Filename: config.php  
  4.  * Created on 2012-9-29  
  5.  * Created by RobinTang  
  6.  * To change the template for this generated file go to  
  7.  * Window - Preferences - PHPeclipse - PHP - Code Templates  
  8.  */ 
  9.   // About database  
  10.   define('DBHOST''localhost'); // 数据库服务器  
  11.   define('DBNAME''db_wdid'); // 数据库名称  
  12.   define('DBUSER''root'); // 登陆用户名  
  13.   define('DBPSWD''trb'); // 登录密码  
  14. ?>  

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

  1. <?php  
  2. /*  
  3.  * Filename: database.php  
  4.  * Created on 2012-9-29  
  5.  * Created by RobinTang  
  6.  * To change the template for this generated file go to  
  7.  * Window - Preferences - PHPeclipse - PHP - Code Templates  
  8.  */ 
  9.   include_once("config.php");  
  10.   $debug = false;  
  11.   $g_out = false;  
  12.   function out($s){  
  13.     global $g_out;  
  14.     $g_out .= $s;  
  15.     $g_out .= "\r\n";  
  16.   }  
  17.   function db_openconnect(){  
  18.     $con = mysql_connect(DBHOST, DBUSER, DBPSWD);  
  19.        
  20.     if(!mysql_set_charset("utf8"$con)){  
  21.       out("set mysql encoding fail");  
  22.     }  
  23.     if (!$con){  
  24.       out('Could not connect: ' . mysql_error());  
  25.     }  
  26.     else{  
  27.       if(!mysql_select_db(DBNAME, $con)){  
  28.         $dbn = DBNAME;  
  29.         out("Could select database '$dbn' : " . mysql_error()); 
  30.       }  
  31.       $sql = "set time_zone = '+8:00';";  
  32.       if(!db_onlyquery($sql$con)){  
  33.         out("select timezone fail!" . mysql_error());  
  34.       }  
  35.     }  
  36.     return $con;  
  37.   }  
  38.   function db_colseconnect($con){  
  39.     mysql_close($con);  
  40.   }  
  41.   function db_onlyquery($sql$con){  
  42.     $r = mysql_query($sql$con);  
  43.     if(!$r){  
  44.       out("query '$sql' :fail");  
  45.       return false;  
  46.     }  
  47.     else{  
  48.       return $r;  
  49.     }  
  50.   }  
  51.   function db_query($sql){  
  52.     $con = db_openconnect();  
  53.     $r = db_onlyquery($sql$con);  
  54.     $res = false;  
  55.     if($r){  
  56.       $res = true;  
  57.     }  
  58.     db_colseconnect($con);  
  59.     return $r;  
  60.   }  
  61.   function db_query_effect_rows($sql){  
  62.     $con = db_openconnect();  
  63.     $r = db_onlyquery($sql$con);  
  64.     $res = false;  
  65.     if($r){  
  66.       $res = mysql_affected_rows($con);  
  67.       if($res==0){  
  68.         $res = -1;  
  69.       }  
  70.     }  
  71.     else{  
  72.       $res = false;  
  73.     }  
  74.     db_colseconnect($con);  
  75.     return $res;  
  76.   }  
  77.   function db_getresult($sql){  
  78.     $con = db_openconnect();  
  79.     $r = db_onlyquery($sql$con);  
  80.     $res = false;  
  81.     if($r && $arr = mysql_fetch_row($r)){  
  82.       $res = $arr[0];  
  83.     }  
  84.     db_colseconnect($con);  
  85.     return $res;  
  86.   }  
  87.   function db_getarray($sql){  
  88.     $con = db_openconnect();  
  89.     $r = db_onlyquery($sql$con);  
  90.     $ret = false;  
  91.     if($r){  
  92.       $row = false;  
  93.       $len = 0;  
  94.       $ret = Array();  
  95.       $i = 0;  
  96.       while($arr = mysql_fetch_row($r)){  
  97.         if($row == false || $len==0){  
  98.           $row = Array();  
  99.           $len = count($arr);  
  100.           for($i=0;$i<$len;++$i){  
  101.             $key = mysql_field_name($r$i);  
  102.             array_push($row$key);  
  103.           }  
  104.         }  
  105.         $itm = Array();  
  106.         for($i=0;$i<$len;++$i){  
  107.           $itm[$row[$i]]=$arr[$i];  
  108.         }  
  109.         array_push($ret$itm);  
  110.       }  
  111.     }  
  112.     db_colseconnect($con);  
  113.     return $ret;  
  114.   }  
  115. ?> 

其实上面的两个文件都是之前写好的,持久层的东西是下面的:

  1. <?php  
  2. /*  
  3.  * Filename: sinorm.php  
  4.  * Created on 2012-11-4  
  5.  * Created by RobinTang  
  6.  * To change the template for this generated file go to  
  7.  * Window - Preferences - PHPeclipse - PHP - Code Templates  
  8.  */ 
  9.   include_once("database.php");  
  10.      
  11.   function SinORM_ExecSql($sql) {  
  12.     return db_query($sql);  
  13.   }  
  14.   function SinORM_ExecArray($sql) {  
  15.     return db_getarray($sql);  
  16.   }  
  17.   function SinORM_ExecResult($sql){  
  18.     return db_getresult($sql);  
  19.   }  
  20.   function SinORM_GetClassPropertys($class) {  
  21.     $r = new ReflectionClass($class);  
  22.     if (!$r->hasProperty('tablename')) {  
  23.       throw new Exception("Class '$class' has no [tablename] property");  
  24.     }  
  25.     $table = $r->getStaticPropertyValue('tablename');  
  26.     if (!$r->hasProperty('id')) {  
  27.       throw new Exception("Class '$class' has no [id] property"); 
  28.     }  
  29.     $mpts = Array ();  
  30.     $pts = $r->getProperties(ReflectionProperty :: IS_PUBLIC);  
  31.     foreach ($pts as $pt) {  
  32.       if (!$pt->isStatic()) {  
  33.         array_push($mpts$pt);  
  34.       }  
  35.     }  
  36.     return Array (  
  37.       $table,  
  38.       $mpts 
  39.     );  
  40.   }  
  41.   function SinORM_GetPropertyString($pts$class$obj = false, $noid = false) {  
  42.     if (is_null($pts)) {  
  43.       list ($tb$pts) = SinORM_GetClassPropertys($class);  
  44.     }  
  45.     $s = false;  
  46.     $v = false;  
  47.     $l = false;  
  48.     foreach ($pts as $pt) {  
  49.       $name = $pt->name;  
  50.       if ($noid == false || $name != 'id') {  
  51.         if ($l) {  
  52.           $s = $s . ',';  
  53.         }  
  54.         $s = $s . $name;  
  55.      
  56.         if ($obj) {  
  57.           if ($l) {  
  58.             $v = $v . ',';  
  59.           }  
  60.           $val = $pt->getValue($obj);  
  61.           if (is_null($val))  
  62.             $v = $v . 'null';  
  63.           if (is_string($val))  
  64.             $v = $v . "'$val'";  
  65.           else 
  66.             $v = $v . $val;  
  67.         }  
  68.         $l = true;  
  69.       }  
  70.     }  
  71.     return Array (  
  72.       $s,  
  73.       $v 
  74.     );  
  75.   }  
  76.   function SinORM_GetTableName($class){  
  77.     $r = new ReflectionClass($class);  
  78.     if (!$r->hasProperty('tablename')) {  
  79.       throw new Exception("Class '$class' has no [tablename] property");  
  80.     }  
  81.     $table = $r->getStaticPropertyValue('tablename');  
  82.     if (!$r->hasProperty('id')) {  
  83.       throw new Exception("Class '$class' has no [id] property");  
  84.     }  
  85.     return $table;  
  86.   }  
  87.   function SinORM_ResetORM($class) {  
  88.     list ($tb$pts) = SinORM_GetClassPropertys($class);  
  89.     $sql = "CREATE TABLE `$tb` (`id` int NOT NULL AUTO_INCREMENT";  
  90.     $r = new ReflectionClass($class);  
  91.     $obj = $r->newInstance();  
  92.     foreach ($pts as $pt) {  
  93.       $val = $pt->getValue($obj);  
  94.       $name = $pt->name;  
  95.       if ($name != 'id') {  
  96.         $sql = $sql . ',';  
  97.       } else {  
  98.         continue;  
  99.       }  
  100.       if (is_null($val))  
  101.         throw new Exception($class . '->' . "name must have a default value");  
  102.       if (is_string($val))  
  103.         $sql = $sql . "`$name` text NULL";  
  104.       else 
  105.         $sql = $sql . "`$name` int NULL";  
  106.     }  
  107.     $sql = $sql . ",PRIMARY KEY (`id`));";  
  108.     $dsql = "DROP TABLE IF EXISTS `$tb`;";  
  109.     return SinORM_ExecSql($dsql) && SinORM_ExecSql($sql);  
  110.   }  
  111.   function SinORM_SaveObject($obj) {  
  112.     $class = get_class($obj);  
  113.     list ($tb$pts) = SinORM_GetClassPropertys($class);  
  114.     list ($names$vals) = SinORM_GetPropertyString($pts$class$obj, true);  
  115.     $sql = "INSERT INTO `$tb`($names) values($vals)";  
  116.     if(SinORM_ExecSql($sql)){  
  117.       $q = "SELECT `id` FROM `$tb` ORDER BY `id` DESC LIMIT 1;";  
  118.       $id = SinORM_ExecResult($q);  
  119.       if($id){  
  120.         $obj->id = $id;  
  121.       }  
  122.     }  
  123.     return false;  
  124.   }  
  125.   function SinORM_GetObjects($class) {  
  126.     list ($tb$pts) = SinORM_GetClassPropertys($class);  
  127.     $sql = "SELECT * from `$tb`;";  
  128.     $ary = SinORM_ExecArray($sql);  
  129.     $res = false;  
  130.     if (is_array($ary)) {  
  131.       $res = Array ();  
  132.       $ref = new ReflectionClass($class);  
  133.       foreach ($ary as $a) {  
  134.         $obj = $ref->newInstance();  
  135.         foreach ($pts as $pt) {  
  136.           $name = $pt->name;  
  137.           $olv = $pt->getValue($obj);  
  138.           $val = $a[$name];  
  139.           if (is_string($olv))  
  140.             $pt->setValue($obj$val);  
  141.           else 
  142.             $pt->setValue($objintval($val));  
  143.         }  
  144.         array_push($res$obj);  
  145.       }  
  146.     } else {  
  147.       echo 'no';  
  148.     }  
  149.     return $res;  
  150.   }  
  151.   function SinORM_GetObject($class$id) {  
  152.     list ($tb$pts) = SinORM_GetClassPropertys($class);  
  153.     $sql = "SELECT * from `$tb` where `id`=$id;";  
  154.     $ary = SinORM_ExecArray($sql);  
  155.     $res = null;  
  156.     if (is_array($ary) && count($ary) > 0) {  
  157.       $res = Array ();  
  158.       $ref = new ReflectionClass($class);  
  159.       $a = $ary[0];  
  160.       $obj = $ref->newInstance();  
  161.       foreach ($pts as $pt) {  
  162.         $name = $pt->name;  
  163.         $olv = $pt->getValue($obj);  
  164.         $val = $a[$name];  
  165.         if (is_string($olv))  
  166.           $pt->setValue($obj$val);  
  167.         else 
  168.           $pt->setValue($objintval($val));  
  169.       }  
  170.       return $obj;  
  171.     }  
  172.     return null;  
  173.   }  
  174.   function SinORM_Update($obj) {  
  175.     $class = get_class($obj);  
  176.     list ($tb$pts) = SinORM_GetClassPropertys($class);  
  177.     $sql = "UPDATE `$tb` SET ";  
  178.     $l = false;  
  179.     foreach ($pts as $pt) {  
  180.       $name = $pt->name;  
  181.       $val = $pt->getValue($obj);  
  182.       if ($name == 'id')  
  183.         continue;  
  184.       if ($l)  
  185.         $sql = $sql . ',';  
  186.       if (is_string($val))  
  187.         $sql = $sql . "$name='$val'";  
  188.       else 
  189.         $sql = $sql . "$name=$val";  
  190.       $l = true;  
  191.     }  
  192.     $sql = $sql . " WHERE `id`=$obj->id;";  
  193.     return SinORM_ExecSql($sql);  
  194.   }  
  195.   function SinORM_SaveOrUpdate($obj) {  
  196.     if (SinORM_GetObject(get_class($obj), $obj->id) == null) {  
  197.       SinORM_SaveObject($obj);  
  198.     } else {  
  199.       SinORM_Update($obj);  
  200.     }  
  201.   }  
  202.   function SinORM_DeleteObject($obj){  
  203.     $class = get_class($obj);  
  204.     $tb = SinORM_GetTableName($class);  
  205.     $sql = "DELETE FROM `$tb` WHERE `id`=$obj->id;";  
  206.     return SinORM_ExecSql($sql);  
  207.   }  
  208.   function SinORM_DeleteAll($class){  
  209.     $tb = SinORM_GetTableName($class);  
  210.     $sql = "DELETE FROM `$tb`;";  
  211.     return SinORM_ExecSql($sql);  
  212.   }  
  213. ?>  

下面是使用的例子:

  1. <?php  
  2. /*  
  3.  * Filename: demo.php  
  4.  * Created on 2012-11-4  
  5.  * Created by RobinTang  
  6.  * To change the template for this generated file go to  
  7.  * Window - Preferences - PHPeclipse - PHP - Code Templates  
  8.  */ 
  9.   include_once("sinorm.php");  
  10.   // 下面是一个持久对象的类的定义  
  11.   // 每个持久对象类都必须有一个叫做$tablename静态成员,它表示数据库中存储对象的表名  
  12.   // 类的每个成员都必须初始化,也就是必须给它一个初始值  
  13.   // 成员变量只能为字符串或者整型,而且请定义成public的,只有public的成员变量会被映射  
  14.   class User{  
  15.     public static $tablename = 't_user';  // 静态变量,对象的表名,必须的  
  16.     public $id = 0; // 对象ID,对应表中的主键,必须的,而且必须初始化为0  
  17.        
  18.     public $name = ''// 姓名,必须初始化  
  19.     public $age = 0; // 年龄,必须初始化  
  20.     public $email = ''// 必须初始化   
  21.   }  
  22.      
  23.   // 注意:下面的语句一定要在定义好类之后运行一下,修改了类也需要运行一下,它完成创建表的工作  
  24.   // SinORM_ResetORM('User'); // 这一句只是一开始执行一次,执行之后就会自动在数据库中建立User对应的表  
  25.      
  26.   $user1 = new User();  // 创建一个对象  
  27.   $user1->name = 'TRB';  
  28.   $user1->age = 22;  
  29.   $user1->email = 'trbbadboy@qq.com';  
  30.   SinORM_SaveObject($user1); // 把对象保存到数据库中  
  31.      
  32.   // 保存之后会自动给id的  
  33.   $id = $user1->id;  
  34.   echo $id . '<br/>';  
  35.       
  36.   $user2 = SinORM_GetObject('User'$id); // 通过ID从数据库创建一个对象  
  37.   echo $user2->name . '<br/>';  
  38.      
  39.   $user1->name = 'trb'// 改变一下  
  40.   SinORM_Update($user1); // 更新到数据库  
  41.      
  42.   $user3 = SinORM_GetObject('User'$id); // 重新读出  
  43.   echo $user3->name . '<br/>';  
  44. ?>  

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

Tags: PHP持久层 MySQL持久层

分享到: