有位热心的网友苦于“TP3.1,高级的命名空间使用极不习惯,而且跨模块调用也是个迷。要迁移一个项目,需要付出太大的代价了。”其实封装起来的好处就是跨域、跨模块使用都很EASY!

折叠PHP Code复制内容到剪贴板
  1.  <?php  
  2.   
  3. /** 
  4. * auther soulence 
  5. * 调用数据文件 
  6. * sccscc 2016/06/12 
  7. */  
  8. class DBConnect  
折叠PHP Code复制内容到剪贴板
  1. /** 
  2. * 得到操作数据库对象 
  3. * @param string $dbname 对应的数据库是谁 
  4. * @param bool $attr  是否长连接 
  5. * return false说明给定的数据库不存在 
  6. */  
  7. public static function getInstance($dbname = 'r',$attr = false)  
  8. {  
  9. $mysql_server = Yaf_Registry::get('mysql');  
  10. if(!isset$mysql_server[$dbname])){  
  11. return false;  
  12. }  
  13. $key = md5(md5($dbname.$attr,true));  
  14. if (!isset(self::$_instance[$key]) || !is_object(self::$_instance[$key]))  
  15. self::$_instance[$key] = new self($dbname,$attr);  
  16. return self::$_instance[$key];  
  17. }  
  18. private function getConnect(){  
  19. $this->pdo = self::db($this->dbname,$this->persistent);  
  20. }  
  21. /**  

 

……(这里调用数据库我就不写出来,妈蛋博客有字数限制!操
 
 
折叠PHP Code复制内容到剪贴板
  1. 查询操作  
  2.  * @param string $sql   执行查询的sql语句  
  3.  * @param array $data  查询的条件  格式为[':id'=>$id,':name'=>$name](推荐)或者为[1=>$id,2=>$name]  
  4.  * @param bool $one   是否返回一条内容  默认为否  
  5.  */  
  6.  public function query($sql$data = [], $one = false)  
  7.  {  
  8.  if (!is_array$data) || emptyempty$sql) || !is_string$sql))  
  9.  return false;  
  10.  $this->free();  
  11.  return $this->queryCommon($data,$sql,$one);  
  12.  }  
  13.  /** 
  14.  * 内部查询的共用方法 
  15.  */  
  16.  private function queryCommon($data,$sql,$one)  
  17.  {  
  18.  $this->pdoExec($data,$sql);  
  19.  if ($one){  
  20.  return $this->statement->fetch(PDO::FETCH_ASSOC);  
  21.  }else{  
  22.  return $this->statement->fetchAll(PDO::FETCH_ASSOC);  
  23.  }  
  24.  }  
  25.  /**  
折叠PHP Code复制内容到剪贴板
  1. 多条SQL语句的查询操作  
  2. * @param array $arr_sql   执行查询的sql语句数组 格式为[$sql1,$sql2]  
  3. * @param array $arr_data  查询与$arr_sql对应的条件  格式为[[':id'=>$id,':name'=>$name],[':id'=>$id,':name'=>$name]](推荐)或者为[[1=>$id,2=>$name],[1=>$id,2=>$name]]  
  4. * @param bool $one   是否返回一条内容  默认为否  这里如果设置为true那么每一条sql都只返回一条数据  
  5. */  
  6. public function queryes($arr_sql$arr_data = [], $one = false)  
  7. {  
  8. if(!is_array$arr_sql) || emptyempty$arr_sql) || !is_array$arr_data))  
  9. return false;  
  10. $this->free();  
  11. $res = [];$i = 0;  
  12. foreach ($arr_sql as $val) {  
  13. if(!isset($arr_data[$i]))  
  14. $arr_data[$i] = [];  
  15. elseif(!is_array$arr_data[$i]))  
  16. throw new Exception('Error where queryes sql:'.$val.' where:'.$arr_data[$i]);  
  17. $res[] = $this->queryCommon($arr_data[$i],$val,$one);  
  18. $i++;  
  19. }  
  20. return $res;  
  21. }  
  22. /** 
  23. * 分页封装 
  24. * 
  25. * @param string $sql 
  26. * @param int $page  示从第几页开始 
  27. * @param int $pageSize 表示每页多少条 
  28. * @param array $data 查询的条件 
  29. */  
  30. public function limitQuery($sql$page=0, $pageSize=20, $data = [])  
  31. {  
  32. $page = intval$page);  
  33. if ($page < 0) {  
  34. return [];  
  35. }  
  36. $pageSize = intval$pageSize);  
  37. if ($pageSize > 0) { // pageSize 为0时表示取所有数据  
  38. $sql .= ' LIMIT ' . $pageSize;  
  39. if ($page > 0) {  
  40. $start_limit = ($page - 1) * $pageSize;  
  41. $sql .= ' OFFSET ' . $start_limit;  
  42. }  
  43. }  
  44. return $this->query($sql$data);  
  45. }  
  46. /**  
 
 
……多条件查询我也不写了!
折叠PHP Code复制内容到剪贴板
  1. * 这里再提供一个方法 这是最后提交操作 如果没有开启事务  此方法最后可以不调用的  
  2. */  
  3. public function sQCommit()  
  4. {  
  5. ifemptyempty$this->pdo) || !is_object$this->pdo))  
  6. return false;  
  7. if(isset($this->Transaction) && $this->Transaction === true)  
  8. $this->pdo->commit();//提交事务  
  9. unset$this->pdo);  
  10. }  
  11. /** 
  12. * 内部调用方法 
  13. */  
  14. public function checkParams($sql,$data)  
  15. {  
  16. if (emptyempty$this->pdo) || !is_object$this->pdo) || !is_array$data) || emptyempty$sql) || !is_string$sql))  
  17. return false;  
  18. return true;  
  19. }  
  20. /** 
  21. * 内部调用方法 
  22. */  
  23. private function pdoExecSq($sql,$data,$select = []){  
  24. try{  
  25. $res = $this->pdoExec($data,$sql);  
  26. ifemptyempty$select))  
  27. return $res;  
  28. else{  
  29. if$select[0] === 1){  
  30. if$select[1] === true)  
  31. return $this->statement->fetch(PDO::FETCH_ASSOC);  
  32. else  
  33. return $this->statement->fetchAll(PDO::FETCH_ASSOC);  
  34. }elseif$select[0] === 2)  
  35. return $this->statement->fetchColumn();  
  36. else  
  37. return false;  
  38. }  
  39. } catch (Exception $e) {  
  40. throw new Exception($e->getMessage());  
  41. return false;  
  42. } finally {  
  43. if (!emptyempty$this->statement))  
  44. {  
  45. $this->statement->closeCursor();  
  46. unset($this->statement);  
  47. }  
  48. }  
  49. }  
  50. /** 
  51. * 内部调用方法 
  52. */  
  53. private function execRes($data,$sql){  
  54. $res = $this->pdoExec($data,$sql);  
  55. $in_id = $this->pdo->lastInsertId();  
  56. if (preg_match("/^\s*(INSERT\s+INTO|REPLACE\s+INTO)\s+/i"$sql) && !emptyempty$in_id))  
  57. $this->lastInsID = $in_id;  
  58. else  
  59. $this->lastInsID = $res;  
  60. }  
  61. /** 
  62. * 内部调用方法  用来直接执行SQL语句的方法 
  63. */  
  64. private function pdoExec($data,$sql){  
  65. $this->statement = $this->pdo->prepare($sql);  
  66. if (false === $this->statement)  
  67. return false;  
  68. if (!emptyempty$data))  
  69. {  
  70. foreach ($data as $k => $v)  
  71. {  
  72. $this->statement->bindValue($k$v);  
  73. }  
  74. }  
  75. $res = $this->statement->execute();  
  76. if (!$res)  
  77. {  
  78. throw new Exception('sql:'.$sql.'<====>where:'.json_encode$data)。'<====>error:'.json_encode($this->statement->errorInfo()));  
  79. }else{  
  80. return $res;  
  81. }  
  82. }  
  83. /** 
  84. * 内部调用方法  用来释放的 
  85. */  
  86. private function free()  
  87. {  
  88. if (is_null$this->pdo))  
  89. $this->getConnect();  
  90. if (!emptyempty$this->statement))  
  91. {  
  92. $this->statement->closeCursor();  
  93. $this->statement = null;  
  94. }  
  95. }  
  96. }  
  97. ?>  
 
 
其实PDO本身就够了,但为了说明如何操作以及封装后如何操作(PS:是不是多余)还是封起来讲了!……哈哈,这位网友请耐心看吧