当前位置:Gxlcms > PHP教程 > PHP基于ORM方式操作MySQL数据库实例

PHP基于ORM方式操作MySQL数据库实例

时间:2021-07-01 10:21:17 帮助过:62人阅读

本文实例讲述了PHP基于ORM方式操作MySQL数据库。分享给大家供大家参考,具体如下:

ORM----Oriented Relationship Mapper,即用面向对象的方式来操作数据库。归根结底,还是对于SQL语句的封装。

首先,我们的数据库有如下一张表:

我们希望能够对这张表,利用setUserid("11111"),即可以设置userid;getUserid()既可以获得对象的userid。所以,我们需要建立model对象,与数据库中的表对应。

由于每张表所对应的model都应该是有set/get操作,所以,我们用一个父类BasicModel进行定义。其他model都是继承至这个model。

BasicModel的代码如下:

  1. <?php
  2. /*
  3. * author:Tammy Pi
  4. * function:Model类的基类,封装set/get操作
  5. */
  6. class BasicModel{
  7. private $map = null;
  8. function TbUser() {
  9. $this->map = array();
  10. }
  11. function __set($key,$value){
  12. $this->map[$key] = $value;
  13. }
  14. function __get($key){
  15. return $this->map[$key];
  16. }
  17. function __call($name,$arguments) {
  18. if(substr($name,0,3)=='set'){
  19. $this->__set(strtolower(substr($name,3)),$arguments[0]);
  20. }else{
  21. return $this->__get(strtolower(substr($name,3)));
  22. }
  23. }
  24. }
  25. ?>

那么,与tb_user表相互对应的model类TbUser则对它进行继承。

  1. <?php
  2. require_once("BasicModel.php");
  3. class TbUser extends BasicModel{
  4. }
  5. ?>

这样,我们就可以对TbUser的实例进行set/get操作了。

要用ORM进行操作数据库,就必须可以findByWhere($where)进行查询,返回的为对象数组;save($tbUser)进行保存;delete($obj)进行删除;update($obj)进行更新操作。

本质上,就是用户传入的是对象,我们再利用代码将对象转换为SQL语句。本质上,执行的还是SQL语句。

所以,我们对一系列的操作用接口表示。IBasicDAO的代码如下:

  1. <?php
  2. interface IBasicDAO {
  3. public function findByWhere($where);
  4. public function findWhereOrderBy($where,$order,$start=null,$limit=null);
  5. public function save($obj);
  6. public function delete($obj);
  7. public function update($obj);
  8. }
  9. ?>

我们最关键,就是对此接口进行实现。完成对象和SQL的转换。
BasicDAO的代码如下:

  1. <?php
  2. require_once("IBasicDAO.php");
  3. class BasicDAO implements IBasicDAO{
  4. protected $modelName = null;
  5. private $tableName = null;
  6. private $h = "localhost";
  7. private $user = "root";
  8. private $pass = "root";
  9. private $db = "db_toilet";
  10. //获得连接
  11. public function getConnection(){
  12. $conn = mysqli_connect($this->h,$this->user,$this->pass,$this->db);
  13. return $conn;
  14. }
  15. //初始化
  16. public function init() {
  17. //根据model的名字得到表的名字
  18. $this->tableName = strtolower(substr($this->modelName,0,2))."_".strtolower(substr($this->modelName,2));
  19. }
  20. //获得一个表的列名
  21. public function getColumn($tableName) {
  22. $sql = "show columns from ".$tableName;
  23. $conn = $this->getConnection();
  24. $columns = array();
  25. if($conn!=null){
  26. $rtn = mysqli_query($conn,$sql);
  27. while($rtn!==false&&($row=mysqli_fetch_array($rtn))!=null){
  28. $columns[] = $row[0];
  29. }
  30. mysqli_close($conn);
  31. }
  32. return $columns;
  33. }
  34. //条件查询
  35. public function findByWhere($where){
  36. //获得数据表的列名
  37. $columns = $this->getColumn($this->tableName);
  38. //拼接sql语句
  39. $sql = "select * from ".$this->tableName." where ".$where;
  40. $conn = $this->getConnection();
  41. $arr = array();
  42. if($conn!=null){
  43. $rtn = mysqli_query($conn,$sql);
  44. while($rtn!==false&&($row=mysqli_fetch_array($rtn))!=null){
  45. $index = -1;
  46. $obj = new $this->modelName();
  47. foreach($columns as $column){
  48. $obj->{"set".ucfirst($column)}($row[++$index]);
  49. }
  50. $arr[] = $obj;
  51. }
  52. mysqli_close($conn);
  53. }
  54. return $arr;
  55. }
  56. //分页查询;支持排序
  57. public function findWhereOrderBy($where,$order,$start=null,$limit=null){
  58. //获得数据表的列名
  59. $columns = $this->getColumn($this->tableName);
  60. //拼接sql语句
  61. $sql = "select * from ".$this->tableName." where ".$where." order by ".$order;
  62. if($start!=null&&$limit!=null){
  63. $sql .= "limit ".$start.",".$limit;
  64. }
  65. $conn = $this->getConnection();
  66. $arr = array();
  67. if($conn!=null){
  68. $rtn = mysqli_query($conn,$sql);
  69. while($rtn!==false&&($row=mysqli_fetch_array($rtn))!=null){
  70. $index = -1;
  71. $obj = new $this->modelName();
  72. foreach($columns as $column){
  73. $obj->{"set".ucfirst($column)}($row[++$index]);
  74. }
  75. $arr[] = $obj;
  76. }
  77. mysqli_close($conn);
  78. }
  79. return $arr;
  80. }
  81. //保存操作
  82. public function save($obj){
  83. $columns = $this->getColumn($this->tableName);
  84. $conn = $this->getConnection();
  85. $tag = false;
  86. if($conn!=null){
  87. $sql = "insert into ".$this->tableName."(";
  88. foreach($columns as $column){
  89. $sql .= $column.",";
  90. }
  91. $sql = substr($sql,0,strlen($sql)-1).") values(";
  92. foreach($columns as $column){
  93. $value = $obj->{"get".ucfirst($column)}();
  94. //判断$value的类型
  95. if($value==null){
  96. $sql .= "null,";
  97. }else if(preg_match("/^[0-9]*$/", $value)){
  98. //是数字
  99. $sql .= $value.",";
  100. }else{
  101. $sql .= "'".$value."',";
  102. }
  103. }
  104. $sql = substr($sql,0,strlen($sql)-1);
  105. $sql .= ")";
  106. //执行sql语句
  107. mysqli_query($conn,$sql);
  108. $tag = true;
  109. mysqli_close($conn);
  110. }
  111. return $tag;
  112. }
  113. //删除操作
  114. public function delete($obj){
  115. $conn = $this->getConnection();
  116. $tag = false;
  117. if($conn!=null){
  118. $sql = "delete from ".$this->tableName." where ";
  119. $columns = $this->getColumn($this->tableName);
  120. $value = $obj->{"get".ucfirst($columns[0])}();
  121. if($value!=null){
  122. //是数字
  123. if(preg_match("/^[0-9]*$/", $value)){
  124. $sql .= $columns[0]."=".$value;
  125. }else{
  126. $sql .= $columns[0]."='".$value."'";
  127. }
  128. //执行
  129. mysqli_query($conn,$sql);
  130. $tag = true;
  131. }
  132. mysqli_close($conn);
  133. }
  134. return $tag;
  135. }
  136. //更新操作
  137. public function update($obj){
  138. $conn = $this->getConnection();
  139. $columns = $this->getColumn($this->tableName);
  140. $tag = false;
  141. if($conn!=null){
  142. $sql = "update ".$this->tableName." set ";
  143. for($i=1;$i<count($columns);$i++){
  144. $column = $columns[$i];
  145. $value = $obj->{"get".ucfirst($columns[$i])}();
  146. if($value==null){
  147. $sql .= $column."=null,";
  148. }else if(preg_match("/^[0-9]*$/",$value)){
  149. $sql .= $column."=".$value.",";
  150. }else{
  151. $sql .= $column."='".$value."',";
  152. }
  153. }
  154. $sql = substr($sql,0,strlen($sql)-1);
  155. $sql .= " where ";
  156. $tempColumn = $columns[0];
  157. $tempValue = $obj->{"get".ucfirst($columns[0])}();
  158. if(preg_match("/^[0-9]*$/", $tempValue)){
  159. $sql .= $tempColumn."=".$tempValue;
  160. }else{
  161. $sql .= $tempColumn."='".$tempValue."'";
  162. }
  163. //执行操作
  164. mysqli_query($conn,$sql);
  165. $tag = true;
  166. mysqli_close($conn);
  167. }
  168. return $tag;
  169. }
  170. }
  171. ?>

那么,对tb_user表进行操作时,主要利用的是TbUserDAO,它将modelName设置为"TbUser",代码就得知操作的表为tb_user,然后就可以进行一系列操作了。

  1. <?php
  2. require_once("BasicDAO.php");
  3. require_once("../model/TbUser.php");
  4. class TbUserDAO extends BasicDAO{
  5. function TbUserDAO(){
  6. $this->modelName = 'TbUser';
  7. parent::init();
  8. }
  9. }
  10. ?>

那么,就可以采用面向对象的方式对数据库进行操作了。
如:

  1. $tbUserDAO = new TbUserDAO();
  2. $tbUser = new TbUser();
  3. $tbUser->setUserid("fetchingsoft@163.com");
  4. $tbUser->setUsername("fetching");
  5. $tbUserDAO->update($tbUser);
  6. echo "执行成功!";
  7. print_r($list);

这样对数据库中的记录进行更新。

更多关于PHP相关内容感兴趣的读者可查看本站专题:《PHP基于pdo操作数据库技巧总结》、《php+Oracle数据库程序设计技巧总结》、《PHP+MongoDB数据库操作技巧大全》、《php面向对象程序设计入门教程》、《php字符串(string)用法总结》、《php+mysql数据库操作入门教程》及《php常见数据库操作技巧汇总》

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

人气教程排行