首页 > 开发 > PHP > 正文

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

2024-05-04 23:36:19
字体:
来源:转载
供稿:网友

这篇文章主要介绍了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程序设计有所帮助。

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表