自己写的数据库pdo操作类,显摆一上
自己写的数据库pdo操作类,显摆一下先说好,麻烦各位手下留情,头破血流的写了这么一个类,鄙视的话请温柔些。
自己写的数据库pdo操作类,显摆一下
先说好,麻烦各位手下留情,头破血流的写了这么一个类,鄙视的话请温柔些。主要觉得DB类里有面向对象,有PDO,有sql语句,还有 try...catch.这些都是刚教的,融合融合写在一起也加深下理解,写到后面写嗨了,就真想写个以后一直能用的类,现在这个样子还算满意。有写的不合适的地方,大家多提意见,其他的我选择性忽略。
多说几句废话,好多同学刚开始的学面向对象的时候都很懵,我也一样,然后我就不耻下问的去问度娘,度娘说了一大堆废话,翻来覆去的总是那几句。在我心生恨意,低头不语的时候,忽然悟了,不是悟了什么是面向对象,是悟了度娘为什么要把这几句废话翻来覆去的说。原来重点不在于什么是面向对象,而在于你是不是 “明白”面向对象。好吧!我也开始废话了。我的意思是说,如果你从来没有吃过盐,那不论我怎么解释什么是咸,你都不会“明白”对吧。人总是喜欢用比较的方式来理解一个新事物,当发现这个事物居然在经验中没有合适比较的东西时候,就会有点懵,就会不“明白”。就像要用个模板来,套的住的部分能“明白”,套不住的部分,通过比较区别也能“明白”。现在面向对象编程没有合适模板来套,就傻了。有人说,别废话!敢不敢来直接点的。好吧,直接的答案就是把模板能套的都套上去,把没有模板套的变成模板。“这个东西就是这样!”,“你不停的练把它记住就好了”。这两句话熟悉不?你们老师有木有给你们说过,其实目的就是让你把不“明白”的东西练熟,记牢。然后你就“明白”了。
度娘翻来覆去的废话也是想给我说明这个道理吧!明白了这个道理后,我把老师写的DB类敲了6遍,其他类也没放过,然后写了下面的类。额,我意思不是下面类全抄老师的,大部分都是我自己思路哇!算了,不解释,解释就是掩饰是吧?要真不解释就是默认对吧?恩,我懂。。。
开始贴代码,把数据库连接,用户名,密码什么的一改就能用,你会的。连接建立后,echo一下对象就有各种属性,方法说明了。也希望大家能在面向对象的康庄大道上一路狂飚,嗨不嗨自己知道。。。。。
<?phpclass db{public $DB=null;public $DB_TYPE="mysql";public $DB_HOST="localhost";public $DB_NAME="db49";public $DB_USER="root";public $DB_PWD="123";public $DB_CHARSET="utf8";public $allTableNames=array();private $tableName=null;private $stmt=null;private $fields=array();public $pk=null;//类实例化传参数的格式为(数据库类别,主机地址,数据库名,用户名,密码,字符集,如留空将按默认连接)public function __construct($type="mysql",$host="localhost",$dbname="db49",$user="root",$pass="123456",$charset="utf8"){//$cons=func_get_args();//var_dump($type);//var_dump($host);//var_dump($name);//exit;$this->DB_TYPE=$type;$this->DB_HOST=$host;$this->DB_NAME=$dbname;$this->DB_USER=$user;$this->DB_PWD=$pass;$this->DB_CHARSET=$charset;$this->connect();$this->DB->setAttribute(PDO::ATTR_EMULATE_PREPARES,true);$this->DB->query('SET NAMES'.$this->charset);$this->getTablesName();$this->DB->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_EXCEPTION);$this->DB->setAttribute(PDO::MYSQL_ATTR_USE_BUFFERED_QUERY ,true);$this->DB->setAttribute(PDO::ATTR_AUTOCOMMIT,0);}public function __destruct(){$this->close();}public function close(){$this->DB=null;}private function connect(){try{$this->DB=new PDO($this->DB_TYPE.":host=".$this->DB_HOST.";dbname=".$this->DB_NAME,$this->DB_USER,$this->DB_PWD);}catch(PDOException $e){die("数据库连接错误:".$e->getMessage());}}//获取表名public function getTablesName(){try{$this->stmt=$this->DB->query('show tables');//var_dump($this->DB->errorinfo());while($row=$this->stmt->fetch(PDO::FETCH_NUM)){$this->allTableNames[]=$row[0];}return $this->allTableNames;$this->stmt=null;}catch(PDOException $e){die("获取数据库表名失败".$e->getMessage());}}//设定使用的表名public function usetable($tname){try{if(in_array($tname,$this->allTableNames)){$this->tableName=$tname;$this->stmt=$this->DB->query("desc ".$this->tableName);$this->fieldsall=$this->stmt->fetchAll(PDO::FETCH_ASSOC);foreach ($this->fieldsall as $row){$this->fields[]=$row['Field'];if($row['Key']=="PRI"){$this->pk=$row['Field'];}}$table['tablename']=$this->tableName;$table['prikey']=$this->pk;return $table;$this->stmt=null;}else{echo "数据库未找到:在库'".$this->allTableNames."'中查找表'".$tname."'失败";}}catch(PDOException $e){die("获取数据库字段失败".$e->getMessage());}}//查看已设定的表的所有字段public function seefields(){foreach ($this->fields as $row){echo "字段名:".$row['Field']." ,类型:".$row['Type']." ,是否为空:".$row['Null']." ,是否为主键:".$row['Key']." ,默认值:".$row['Default']." ,额外设定:".$row['Extra']."<br/>";}}//插入方法,传入变量格式为("字段名","值","字段名2","值2".....)public function insert($post=array()){//var_dump(func_get_args());//var_dump($post);$param=func_get_args();//var_dump($param);if(!empty($param)){if(count($param)%2!=0){echo "对不起,参数传递需要成对";exit;}for($i=0;$i<count($param);$i++){if($i%2==0){$fields[]=$param[$i];}else{$value[]=$param[$i];}}for($i=0;$i<count($fields);$i++){if(in_array($fields[$i],$this->fields) && $fields[$i]!=$this->pk){$fieldslist[]=$fields[$i];$valuelist[]=$value[$i];}else{continue;}}}try{$sql="insert into `{$this->tableName}` (`".implode('`,`',$fieldslist)."`) values('".implode("','",$valuelist)."')";$this->DB->beginTransaction();$stmtrow=$this->DB->exec($sql);$this->DB->commit();return $stmtrow;}catch(PDOException $e){$this->DB->rollback();die("插入字段失败:".$e->getMessage());}}//where字句设定为传入变量的第一项,其后所有传入参数为set字句的选项,格式为"字段名=值",public function update(){$param=func_get_args();//var_dump(func_get_args());//将where语句从数组中提取出来$tWhere=$param[0];//将where语句的值加上前单引号,后单引号在sql语句拼装时加上$tWhere=str_replace("=","='",$tWhere);//将where语句从数组中删除,剩下的都是set的语句array_shift($param);//将数组中的语句拼装成set语句$tSet=implode("',",$param);//将set语句的值加上前单引号$tSet=str_replace("=","='",$tSet);//测试传入的where字句是否正确$sqltest="select * from `{$this->tableName}` where ".$tWhere."'";try{$stmt=$this->DB->query($sqltest);if($stmt->rowCount()<=0){throw new Exception("where语句设定有误");}}catch(Exception $e){die( $e->getMessage());}//拼装更新用sql语句$sql="update `{$this->tableName}` set ".$tSet."' where ".$tWhere."'";try{$this->DB->beginTransaction();$stmtrow=$this->DB->exec($sql);$this->DB->commit();return $stmtrow;}catch(PDOException $e){$this->DB->rollback();die("更新失败:".$e->getMessage());}}//接受传入的主键值为删除依据public function del($id){//拼装sql语句$sql="delete from `{$this->tableName}` where {$this->pk}='{$id}'";echo $sql;try{$stmt=$this->DB->exec($sql);if($stmt<=0){throw new Exception ("从新检查键值");}return $stmt;}catch(Exception $e){die("删除键值为:".$id."失败,失败原因:".$e->getMessage());}}//传入参数为(用逗号分隔的字段名或*号,where字句,order by字句,limit字句,如果中间没有条件,用双引号留空)public function select($fields,$where,$order,$limit){$sql="select {$fields} FROM {$this->tableName}";if($where!=""){$sql.=" WHERE ".$where;}if($order!=""){$sql.=" ORDER BY ".$order;}if($limit!=""){$sql.=" LIMIT ".$limit;}try{$stmt=$this->DB->query($sql);$result=$stmt->fetchAll();$stmt=null;return $result;}catch(PDOException $e){echo $e->getMessage();}}//输出该类的所有可用方法,属性和说明public function __toString(){$str= "您当前使用用户名'{$this->DB_USER}'已建立对库'{$this->DB_NAME}'中数据表'{$this->tableName}'的连接<br/>";$str.="查询该库中所有数据表,请查询该对象的'allTableNames'属性数组<br/>";$st.="选定数据表,请使用该对象的'usetable'方法,参数为表名";$str.="查询已选择数据表中的所有字段属性,请调用该对象的'seefields'方法<br/>";$str.="查询已选择数据表中的主键,请查询该对象的'pk'属性<br/>";$str.="插入数据请使用该对象的'insert'方法,传递参数使用格式为(\"字段名\",\"值\",\"字段名2\",\"值2\".....)<br/>";$str.="更新数据请使用该对象的'update'方法,传递参数第一项为where字句条件,其后需更新的字段,格式为(\"条件字段名=值\",\"更新字段名=值\",[\"更新字段名2=值2\"],.....)<br/>";$str.="删除数据请使用该对象的'del'方法,接受主键值为删除条件<br/>";$str.=" 查询数据请使用该对象的'select'方法,传递参数的第一项为要查询的字段名,多个字段使用逗号分隔,全选使用*号,<br/>参数第二项为'where'字句的条件字段,<br/>参数第三项为'order by'字句的条件字段,<br/>参数第四项为'limit'条件的条件字段,使用逗号分隔起始值和长度数值,第二三四项如果无要求请使用双引号留空<br/>";return $str;} }