自己写的数据库pdo操作类,显摆一下

先说好,麻烦各位手下留情,头破血流的写了这么一个类,鄙视的话请温柔些。主要觉得DB类里有面向对象,有PDO,有sql语句,还有 try...catch.这些都是刚教的,融合融合写在一起也加深下理解,写到后面写嗨了,就真想写个以后一直能用的类,现在这个样子还算满意。有写的不合适的地方,大家多提意见,其他的我选择性忽略。

多说几句废话,好多同学刚开始的学面向对象的时候都很懵,我也一样,然后我就不耻下问的去问度娘,度娘说了一大堆废话,翻来覆去的总是那几句。在我心生恨意,低头不语的时候,忽然悟了,不是悟了什么是面向对象,是悟了度娘为什么要把这几句废话翻来覆去的说。原来重点不在于什么是面向对象,而在于你是不是 “明白”面向对象。好吧!我也开始废话了。我的意思是说,如果你从来没有吃过盐,那不论我怎么解释什么是咸,你都不会“明白”对吧。人总是喜欢用比较的方式来理解一个新事物,当发现这个事物居然在经验中没有合适比较的东西时候,就会有点懵,就会不“明白”。就像要用个模板来,套的住的部分能“明白”,套不住的部分,通过比较区别也能“明白”。现在面向对象编程没有合适模板来套,就傻了。有人说,别废话!敢不敢来直接点的。好吧,直接的答案就是把模板能套的都套上去,把没有模板套的变成模板。“这个东西就是这样!”,“你不停的练把它记住就好了”。这两句话熟悉不?你们老师有木有给你们说过,其实目的就是让你把不“明白”的东西练熟,记牢。然后你就“明白”了。

度娘翻来覆去的废话也是想给我说明这个道理吧!明白了这个道理后,我把老师写的DB类敲了6遍,其他类也没放过,然后写了下面的类。额,我意思不是下面类全抄老师的,大部分都是我自己思路哇!算了,不解释,解释就是掩饰是吧?要真不解释就是默认对吧?恩,我懂。。。

开始贴代码,把数据库连接,用户名,密码什么的一改就能用,你会的。连接建立后,echo一下对象就有各种属性,方法说明了。也希望大家能在面向对象的康庄大道上一路狂飚,嗨不嗨自己知道。。。。。
  1. <?php
  2. class db
  3. {
  4. public $DB=null;
  5. public $DB_TYPE="mysql";
  6. public $DB_HOST="localhost";
  7. public $DB_NAME="db49";
  8. public $DB_USER="root";
  9. public $DB_PWD="123";
  10. public $DB_CHARSET="utf8";
  11. public $allTableNames=array();
  12. private $tableName=null;
  13. private $stmt=null;
  14. private $fields=array();
  15. public $pk=null;
  16. //类实例化传参数的格式为(数据库类别,主机地址,数据库名,用户名,密码,字符集,如留空将按默认连接)
  17. public function __construct($type="mysql",$host="localhost",$dbname="db49",$user="root",$pass="123456",$charset="utf8"){
  18. //$cons=func_get_args();
  19. //var_dump($type);
  20. //var_dump($host);
  21. //var_dump($name);
  22. //exit;
  23. $this->DB_TYPE=$type;
  24. $this->DB_HOST=$host;
  25. $this->DB_NAME=$dbname;
  26. $this->DB_USER=$user;
  27. $this->DB_PWD=$pass;
  28. $this->DB_CHARSET=$charset;
  29. $this->connect();
  30. $this->DB->setAttribute(PDO::ATTR_EMULATE_PREPARES,true);
  31. $this->DB->query('SET NAMES'.$this->charset);
  32. $this->getTablesName();
  33. $this->DB->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_EXCEPTION);
  34. $this->DB->setAttribute(PDO::MYSQL_ATTR_USE_BUFFERED_QUERY ,true);
  35. $this->DB->setAttribute(PDO::ATTR_AUTOCOMMIT,0);
  36. }
  37. public function __destruct(){
  38. $this->close();
  39. }
  40. public function close(){
  41. $this->DB=null;
  42. }
  43. private function connect(){
  44. try{
  45. $this->DB=new PDO($this->DB_TYPE.":host=".$this->DB_HOST.";dbname=".$this->DB_NAME,$this->DB_USER,$this->DB_PWD);
  46. }catch(PDOException $e){
  47. die("数据库连接错误:".$e->getMessage());
  48. }
  49. }
  50. //获取表名
  51. public function getTablesName(){
  52. try{
  53. $this->stmt=$this->DB->query('show tables');
  54. //var_dump($this->DB->errorinfo());
  55. while($row=$this->stmt->fetch(PDO::FETCH_NUM)){
  56. $this->allTableNames[]=$row[0];
  57. }
  58. return $this->allTableNames;
  59. $this->stmt=null;
  60. }catch(PDOException $e){
  61. die("获取数据库表名失败".$e->getMessage());
  62. }
  63. }
  64. //设定使用的表名
  65. public function usetable($tname){
  66. try{
  67. if(in_array($tname,$this->allTableNames)){
  68. $this->tableName=$tname;
  69. $this->stmt=$this->DB->query("desc ".$this->tableName);
  70. $this->fieldsall=$this->stmt->fetchAll(PDO::FETCH_ASSOC);
  71. foreach ($this->fieldsall as $row){
  72. $this->fields[]=$row['Field'];
  73. if($row['Key']=="PRI"){
  74. $this->pk=$row['Field'];
  75. }
  76. }
  77. $table['tablename']=$this->tableName;
  78. $table['prikey']=$this->pk;
  79. return $table;
  80. $this->stmt=null;
  81. }else{
  82. echo "数据库未找到:在库'".$this->allTableNames."'中查找表'".$tname."'失败";
  83. }
  84. }catch(PDOException $e){
  85. die("获取数据库字段失败".$e->getMessage());
  86. }
  87. }
  88. //查看已设定的表的所有字段
  89. public function seefields(){
  90. foreach ($this->fields as $row){
  91. echo "字段名:".$row['Field']." ,类型:".$row['Type']." ,是否为空:".$row['Null']." ,是否为主键:".$row['Key']." ,默认值:".$row['Default']." ,额外设定:".$row['Extra']."<br/>";
  92. }
  93. }
  94. //插入方法,传入变量格式为("字段名","值","字段名2","值2".....)
  95. public function insert($post=array()){
  96. //var_dump(func_get_args());
  97. //var_dump($post);
  98. $param=func_get_args();
  99. //var_dump($param);
  100. if(!empty($param)){
  101. if(count($param)%2!=0){
  102. echo "对不起,参数传递需要成对";
  103. exit;
  104. }
  105. for($i=0;$i<count($param);$i++){
  106. if($i%2==0){
  107. $fields[]=$param[$i];
  108. }else{
  109. $value[]=$param[$i];
  110. }
  111. }
  112. for($i=0;$i<count($fields);$i++){
  113. if(in_array($fields[$i],$this->fields) && $fields[$i]!=$this->pk){
  114. $fieldslist[]=$fields[$i];
  115. $valuelist[]=$value[$i];
  116. }else{
  117. continue;
  118. }
  119. }
  120. }
  121. try{
  122. $sql="insert into `{$this->tableName}` (`".implode('`,`',$fieldslist)."`) values('".implode("','",$valuelist)."')";
  123. $this->DB->beginTransaction();
  124. $stmtrow=$this->DB->exec($sql);
  125. $this->DB->commit();
  126. return $stmtrow;
  127. }catch(PDOException $e){
  128. $this->DB->rollback();
  129. die("插入字段失败:".$e->getMessage());
  130. }
  131. }
  132. //where字句设定为传入变量的第一项,其后所有传入参数为set字句的选项,格式为"字段名=值",
  133. public function update(){
  134. $param=func_get_args();
  135. //var_dump(func_get_args());
  136. //将where语句从数组中提取出来
  137. $tWhere=$param[0];
  138. //将where语句的值加上前单引号,后单引号在sql语句拼装时加上
  139. $tWhere=str_replace("=","='",$tWhere);
  140. //将where语句从数组中删除,剩下的都是set的语句
  141. array_shift($param);
  142. //将数组中的语句拼装成set语句
  143. $tSet=implode("',",$param);
  144. //将set语句的值加上前单引号
  145. $tSet=str_replace("=","='",$tSet);
  146. //测试传入的where字句是否正确
  147. $sqltest="select * from `{$this->tableName}` where ".$tWhere."'";
  148. try{
  149. $stmt=$this->DB->query($sqltest);
  150. if($stmt->rowCount()<=0){
  151. throw new Exception("where语句设定有误");
  152. }
  153. }catch(Exception $e){
  154. die( $e->getMessage());
  155. }
  156. //拼装更新用sql语句
  157. $sql="update `{$this->tableName}` set ".$tSet."' where ".$tWhere."'";
  158. try{
  159. $this->DB->beginTransaction();
  160. $stmtrow=$this->DB->exec($sql);
  161. $this->DB->commit();
  162. return $stmtrow;
  163. }catch(PDOException $e){
  164. $this->DB->rollback();
  165. die("更新失败:".$e->getMessage());
  166. }
  167. }
  168. //接受传入的主键值为删除依据
  169. public function del($id){
  170. //拼装sql语句
  171. $sql="delete from `{$this->tableName}` where {$this->pk}='{$id}'";
  172. echo $sql;
  173. try{
  174. $stmt=$this->DB->exec($sql);
  175. if($stmt<=0){
  176. throw new Exception ("从新检查键值");
  177. }
  178. return $stmt;
  179. }catch(Exception $e){
  180. die("删除键值为:".$id."失败,失败原因:".$e->getMessage());
  181. }
  182. }
  183. //传入参数为(用逗号分隔的字段名或*号,where字句,order by字句,limit字句,如果中间没有条件,用双引号留空)
  184. public function select($fields,$where,$order,$limit){
  185. $sql="select {$fields} FROM {$this->tableName}";
  186. if($where!=""){
  187. $sql.=" WHERE ".$where;
  188. }
  189. if($order!=""){
  190. $sql.=" ORDER BY ".$order;
  191. }
  192. if($limit!=""){
  193. $sql.=" LIMIT ".$limit;
  194. }
  195. try{
  196. $stmt=$this->DB->query($sql);
  197. $result=$stmt->fetchAll();
  198. $stmt=null;
  199. return $result;
  200. }catch(PDOException $e){
  201. echo $e->getMessage();
  202. }
  203. }
  204. //输出该类的所有可用方法,属性和说明
  205. public function __toString(){
  206. $str= "您当前使用用户名'{$this->DB_USER}'已建立对库'{$this->DB_NAME}'中数据表'{$this->tableName}'的连接<br/>";
  207. $str.="查询该库中所有数据表,请查询该对象的'allTableNames'属性数组<br/>";
  208. $st.="选定数据表,请使用该对象的'usetable'方法,参数为表名";
  209. $str.="查询已选择数据表中的所有字段属性,请调用该对象的'seefields'方法<br/>";
  210. $str.="查询已选择数据表中的主键,请查询该对象的'pk'属性<br/>";
  211. $str.="插入数据请使用该对象的'insert'方法,传递参数使用格式为(\"字段名\",\"值\",\"字段名2\",\"值2\".....)<br/>";
  212. $str.="更新数据请使用该对象的'update'方法,传递参数第一项为where字句条件,其后需更新的字段,格式为(\"条件字段名=值\",\"更新字段名=值\",[\"更新字段名2=值2\"],.....)<br/>";
  213. $str.="删除数据请使用该对象的'del'方法,接受主键值为删除条件<br/>";
  214. $str.=" 查询数据请使用该对象的'select'方法,传递参数的第一项为要查询的字段名,多个字段使用逗号分隔,全选使用*号,<br/>参数第二项为'where'字句的条件字段,<br/>参数第三项为'order by'字句的条件字段,<br/>参数第四项为'limit'条件的条件字段,使用逗号分隔起始值和长度数值,第二三四项如果无要求请使用双引号留空<br/>";
  215. return $str;
  216. }
  217. }

原文地址:http://bbs.lampbrother.net/read-htm-tid-132212.html

<script type=text/javascript charset=utf-8 src="http://static.bshare.cn/b/buttonLite.js#style=-1&uuid=&pophcol=3&lang=zh"></script> <script type=text/javascript charset=utf-8 src="http://static.bshare.cn/b/bshareC0.js"></script>
阅读(199) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~
评论热议
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值