亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 開發 > 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程序設計有所幫助。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
欧美肥婆姓交大片| 亚洲九九九在线观看| 精品一区二区三区四区| 91成人天堂久久成人| 欧美在线激情网| 国产视频久久久| 在线精品高清中文字幕| 久久久久久亚洲精品不卡| 91欧美激情另类亚洲| 国产精品久久久久久久久久东京| 亚洲精品免费在线视频| 在线视频欧美性高潮| 精品视频一区在线视频| 亚洲精品网址在线观看| 91国偷自产一区二区三区的观看方式| 久久精品青青大伊人av| 韩国精品美女www爽爽爽视频| 日韩精品视频观看| 国产成人精品一区二区在线| 日韩欧美成人精品| 亚洲第一页自拍| 亚洲国产毛片完整版| 亚洲黄在线观看| 黑人极品videos精品欧美裸| 久久精品视频导航| 亚洲一区二区中文| 欧美激情va永久在线播放| 欧美成人一区在线| 亚洲在线视频福利| 午夜精品一区二区三区av| 亚洲精品国产精品自产a区红杏吧| 亚洲国产一区自拍| 精品亚洲aⅴ在线观看| 日韩欧美国产一区二区| 亚洲v日韩v综合v精品v| 欧美日韩国产中文精品字幕自在自线| 亚洲欧美另类在线观看| 日本在线观看天堂男亚洲| 欧美一级高清免费播放| 久久av中文字幕| 国产精品欧美在线| 日韩a**中文字幕| 在线观看日韩视频| 日韩电影视频免费| 欧美午夜片在线免费观看| 国产精品美女www| 欧美性猛交xxxx黑人| 国产精品中文久久久久久久| 久久成人精品视频| 亚洲精品成a人在线观看| 欧美福利视频在线| 中文字幕日韩av电影| 色婷婷av一区二区三区在线观看| 亚洲第一中文字幕在线观看| 亚洲精品网站在线播放gif| 国产精品久久久久久久久久久久久| 日韩一区二区久久久| 91社区国产高清| 国产区精品在线观看| 欧美专区日韩视频| 久久国产精品久久久| 中文字幕欧美精品日韩中文字幕| 欧美又大又硬又粗bbbbb| 久久久久久久爱| 国产在线不卡精品| 亚洲欧美精品在线| 国产精品扒开腿做爽爽爽视频| 国产欧美在线看| 91国偷自产一区二区三区的观看方式| 日韩在线小视频| 亚洲va码欧洲m码| 欧美激情免费视频| 国产欧美日韩免费| 日韩高清电影免费观看完整| 日韩不卡在线观看| 国产精品午夜一区二区欲梦| 91免费看片网站| 欧美日韩免费在线观看| 欧美大成色www永久网站婷| 久久久精品美女| 国产精品女主播视频| 亚洲欧美国产另类| 91精品视频在线| 91wwwcom在线观看| 一区二区三区 在线观看视| 日韩美女免费观看| 日韩中文在线不卡| 中文字幕亚洲一区二区三区| 欧美亚洲国产日本| 国产精品一区二区性色av| 国产a∨精品一区二区三区不卡| 成人性生交大片免费观看嘿嘿视频| 最新69国产成人精品视频免费| 中文字幕视频一区二区在线有码| 欧美中文字幕第一页| 91日韩在线视频| 亚洲xxx视频| 亚洲国产精品99久久| xvideos成人免费中文版| 国产91ⅴ在线精品免费观看| 热re99久久精品国产66热| 亚洲成人久久一区| 日韩在线视频一区| 亚洲 日韩 国产第一| 日韩亚洲精品电影| 97色在线播放视频| 国产午夜精品麻豆| 久久精品91久久久久久再现| 尤物九九久久国产精品的特点| 日本欧美在线视频| 亚洲最新av网址| 亚洲第一色中文字幕| 欧美成人在线免费视频| 日韩网站免费观看| 欧美中文字幕在线播放| 亚洲成人1234| 91亚洲精品在线观看| 国产精品美女www爽爽爽视频| 久久久噜噜噜久久中文字免| 日韩欧美亚洲国产一区| 国产91精品久| 亚洲国产小视频在线观看| 久久亚洲综合国产精品99麻豆精品福利| 欧美大肥婆大肥bbbbb| 国产男人精品视频| 欧美日韩在线一区| 国产精品老牛影院在线观看| 亚洲精品一区二区三区婷婷月| 日韩av在线免费播放| 亚洲精品国产综合久久| 亚洲精品xxx| 日韩亚洲欧美中文高清在线| 日本一区二区三区四区视频| 国产日韩精品综合网站| 国产91精品视频在线观看| 国产欧美日韩中文| 日韩中文av在线| 国产精品18久久久久久首页狼| 2019日本中文字幕| 亚洲图片在线综合| 亚洲男人的天堂网站| 国产va免费精品高清在线| 欧美激情国内偷拍| 国产精自产拍久久久久久| 久久国产天堂福利天堂| 亚洲区一区二区| 国产精品入口尤物| 久久久精品久久| 国产精品精品一区二区三区午夜版| 欧美大片在线影院| 国产精品久久婷婷六月丁香| 国产精品免费久久久| 欧美一级淫片丝袜脚交| 中文字幕国产精品| 亚洲xxxx3d| 久久躁狠狠躁夜夜爽| 91美女片黄在线观| 日本高清+成人网在线观看| 国产欧美欧洲在线观看| 国产精品视频999| 精品中文字幕在线2019| 国产精品狼人色视频一区| 欧美激情二区三区| 欧美日产国产成人免费图片|