Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1632959
  • 博文数量: 1481
  • 博客积分: 26784
  • 博客等级: 上将
  • 技术积分: 17045
  • 用 户 组: 普通用户
  • 注册时间: 2011-07-12 09:22
文章分类

全部博文(1481)

文章存档

2014年(10)

2013年(353)

2012年(700)

2011年(418)

分类: 系统运维

2012-09-18 09:58:21

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

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

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

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

原文地址:

阅读(563) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~