(转)mysql数据库类pdo对象操作
<?php /*************************************************/ /** 数据库操作类(增、删、改、查) **/ /** 使用pdo中的stmt类实现 **/ /** 只要创建对象,传入一个表名作为参数,就可以 **/ /** 对象中增、删、改、查的方法进行对表操作 **/ /** 问题email:zql_0539@163.com **/ /*************************************************/ class DB{ private $tabName;//表名 private $pdo;//pdo对象 private $fields;//表中的字段 function __construct($tabName){ $this->tabName=$tabName; try{ $this->pdo=new PDO("mysql:host=localhost;dbname=oop","root","111111"); $this->pdo->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_EXCEPTION); }catch(PDOException $e){ echo "数据库连接失败:".$e->getMessage(); } $this->fields=$this->getTab(); } //============获取表结构:所有字段名==============// function getTab(){ $result=$this->pdo->query("desc {$this->tabName}"); //执行SQL语句(desc) $fields=array(); foreach($result as $row){ //将表中的字段放到$fields中,其中主键用关联式存放,其他字段用索引式存放 if($row["Key"]=="PRI"){ //存放主键字段 $fields["pri"]=$row["Field"]; }else{ //存放普通字段 $fields[]=$row["Field"]; } } return $fields; } //==============向数据库中插入数据===============// function insert($post=null){ try{ if(is_null($post)){ //判断传来的参数是否为空,若为空则用$_POST赋值 $post=$_POST; } $fields=""; //INSERT语句中的所有字段名 $zwf=""; //INSERT语句中的占位符 $values=array(); //要想插入的数据所存放的数组 foreach($post as $key=>$val){ //遍历$post if(in_array($key,$this->fields)){ //判断数组中的键值是否在数组$this->fields中,为真时执行 $fields.=$key.","; //拼装字段名 $zwf.=":".$key.","; //拼装命名占位符 $values[$key]=$val; //将要插入的数据放入到数组中 } } $fields=rtrim($fields,","); //去掉字段名字符串右边的逗号(,) $zwf=rtrim($zwf,","); //去掉命名占位符字符串右边的逗号(,) $sql="INSERT INTO {$this->tabName}({$fields}) VALUES({$zwf})"; $stmt=$this->pdo->prepare($sql); //处理打算执行的SQL语句 if($stmt->execute($values)){ //执行预处理的SQL语句,向服务器发送数据 echo "添加成功!"; } }catch(PDOException $e){ echo $e->getMessage(); } } //==============删除记录方法===============// function delete($id){ try{ $values=array(); //参数数据所存放的数组 if(is_array($id)){ //如果参数是数组 $zwf=""; //DELETE语句中的?占位符 foreach($id as $val){ //遍历参数数组 $values[]=$val; //参数数组中的每个数据放到$values中 $zwf.="?,"; //拼装占位符 } $zwf=rtrim($zwf,","); //去掉?占位符字符串右边的逗号(,) $sql="DELETE FROM {$this->tabName} WHERE {$this->fields["pri"]} in({$zwf})"; }else{ $values[]=$id; //将参数存放到数组中 $sql="DELETE FROM {$this->tabName} WHERE {$this->fields["pri"]}=?"; } $stmt=$this->pdo->prepare($sql); //处理打算执行的SQL语句 if($stmt->execute($values)){ //执行预处理的SQL语句,向服务器发送数据 echo "删除成功!"; } }catch(PDOException $e){ echo $e->getMessage(); } } //==============更新表中的数据===============// function update($post){ try{ if(is_null($post)){ //判断传来的参数是否为空,若为空则用$_POST赋值 $post=$_POST; } $pri=$post[$this->fields["pri"]]; //获取主键字段的值 unset($post[$this->fields["pri"]]); //在$post数组中删除主键字段 $fields=""; //INSERT语句中的所有字段名 $values=array(); //要更新的新数据所存放的数组 foreach($post as $key=>$val){ //遍历$post if(in_array($key,$this->fields)){ //判断数组中的键值是否在数组$this->fields中,为真时执行 $fields.=$key."=?,"; //拼装修改字段字符串 $values[]=$val; //将要插入的数据放入到数组中 } } $values[]=$pri; //将主键字段的值插入到数据数组的最后 $fields=rtrim($fields,","); //去掉更新数据指令字符串右边的逗号(,) $sql="UPDATE {$this->tabName} set $fields where {$this->fields["pri"]}=?"; $stmt=$this->pdo->prepare($sql); //处理打算执行的SQL语句 if($stmt->execute($values)){ //执行预处理的SQL语句,向服务器发送数据 echo "修改成功!"; } }catch(PDOException $e){ echo $e->getMessage(); } } //==============查询数据的方法===============// function comsql($arr,$args,$type){ try{ if(!empty($arr["field"])){ //如果字段参数不为空,则赋给$fields。为空时,拆分$this->fields赋给$fields $fields=$arr["field"]; }else{ $fields=implode(",",$this->fields); } if(!empty($arr["where"])){ //判断where条件是否为空, $where=" WHERE ".$arr["where"]; //echo $where; }else{ $where=""; } if(!empty($arr["order"])){ //判断order 排序是否为空 $order=" ORDER BY ".$arr["order"]; }else{ $order=" ORDER BY ".$this->fields["pri"]." ASC"; } if(!empty($arr["limit"])){ //判断limit是否为空 $limit=" LIMIT ".$arr["limit"]; }else{ $limit=""; } if($type){ //如果为true,则运行统计要查询结果集的数目,若为false,则查询元组 $sql="select count(*) as count from {$this->tabName}{$where}{$order}{$limit}"; }else{ $sql="select {$fields} from {$this->tabName}{$where}{$order}{$limit}"; if($args){ $stmt=$this->pdo->prepare($sql); $stmt->execute($args); return $stmt; } }catch(PDOException $e){ echo $e->getMessage(); } } //==============查询记录===============// function select($arr=array(),$args=array()){ try{ $stmt=$this->comsql($arr,$args,false); $values=array(); //将结果集绑定到数组$values中的成员上 for($i=0;$i<$stmt->columnCount();$i++){ $fieldinfo=$stmt->getColumnMeta($i); //获取各个字段的信息 $fields[$i]=$fieldinfo["name"]; //将各个字段的名称赋给数组$fields $stmt->bindColumn($fields[$i],$values[$fields[$i]]);//通过列名称绑定到数组$values中的成员上 } while($stmt->fetch()){ //从结果集中获取数据(循环一次就将一条记录赋给$values数组,然后就$values数组赋给$t数组,这时$t数组的下标是字段名,值是记录值。然后再将$t数组赋给$result,这样$result中的每一个成员就是一个数组(一条记录)): $values["name]="zhangsan",$values["age"]=25...... $t=array(); foreach($values as $key=>$val){ $t[$key]=$val; } $result[]=$t; } return $result; }catch(PDOException $e){ echo $e->getMessage(); } } //=============查询记录的数目===============// function total($arr=array(),$args=array()){ try{ $stmt=$this->comsql($arr,$args,true); //调用comsql()方法来统计要查询结果集的数目 $stmt->bindColumn("count",$count); //通过列名称绑定到变量$name上 $stmt->fetch(); //获取数据 return $count; //输出数据 }catch(PDOException $e){ echo $e->getMessage(); } } }