国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

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

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 额敏县| 武宣县| 皮山县| 东乌| 崇信县| 改则县| 钟祥市| 绥江县| 鄂尔多斯市| 遵义市| 三穗县| 历史| 原阳县| 浠水县| 玉田县| 巧家县| 孙吴县| 肥乡县| 光山县| 那曲县| 东宁县| 威信县| 唐山市| 江西省| 建水县| 江口县| 太保市| 花莲县| 屏边| 七台河市| 天台县| 巴林左旗| 仙游县| 凤台县| 新绛县| 喜德县| 乌鲁木齐县| 盐山县| 静海县| 门源| 旬邑县|