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(); }//============获取表结构:所有字段名==============//
functiongetTab(){$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;$icolumnCount();$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();
}
}
}