<?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();
}
}
}