php中PDO方式实现数据库的增删改查
需要开启php的pdo支持,php5.1以上版本支持
实现数据库连接单例化,有三要素静态变量、静态实例化方法、私有构造函数DPDO.php
classDPDO{
private$DSN;
private$DBUser;
private$DBPwd;
private$longLink;
private$pdo;
//私有构造函数防止被直接实例化
privatefunction__construct($dsn,$DBUser,$DBPwd,$longLink=false){
$this->DSN=$dsn;
$this->DBUser=$DBUser;
$this->DBPwd=$DBPwd;
$this->longLink=$longLink;
$this->connect();
}
//私有空克隆函数防止被克隆
privatefunction__clone(){}
//静态实例化函数返回一个pdo对象
staticpublicfunctioninstance($dsn,$DBUser,$DBPwd,$longLink=false){
static$singleton=array();//静态函数用于存储实例化对象
$singIndex=md5($dsn.$DBUser.$DBPwd.$longLink);
if(empty($singleton[$singIndex])){
$singleton[$singIndex]=newself($dsn,$DBUser,$DBPwd,$longLink=false);
}
return$singleton[$singIndex]->pdo;
}
privatefunctionconnect(){
try{
if($this->longLink){
$this->pdo=newPDO($this->DSN,$this->DBUser,$this->DBPwd,array(PDO::ATTR_PERSISTENT=>true));
}else{
$this->pdo=newPDO($this->DSN,$this->DBUser,$this->DBPwd);
}
$this->pdo->query('SETNAMESUTF-8');
}catch(PDOException$e){
die('Error:'.$e->getMessage().'<br/>');
}
}
}
用于处理字段映射,使用pdo的字段映射,可以有效避免sql注入
//字段关联数组处理,主要用于写入和更新数据、同and或or的查询条件,产生sql语句和映射字段的数组
publicfunctionFDFields($data,$link=',',$judge=array(),$aliasTable=''){
$sql='';
$mapData=array();
foreach($dataas$key=>$value){
$mapIndex=':'.($link!=','?'c':'').$aliasTable.$key;
$sql.=''.($aliasTable?$aliasTable.'.':'').'`'.$key.'`'.($judge[$key]?$judge[$key]:'=').''.$mapIndex.''.$link;
$mapData[$mapIndex]=$value;
}
$sql=trim($sql,$link);
returnarray($sql,$mapData);
}
//用于处理单个字段处理
publicfunctionFDField($field,$value,$judge='=',$preMap='cn',$aliasTable=''){
$mapIndex=':'.$preMap.$aliasTable.$field;
$sql=''.($aliasTable?$aliasTable.'.':'').'`'.$field.'`'.$judge.$mapIndex;
$mapData[$mapIndex]=$value;
returnarray($sql,$mapData);
}
//使用刚方法可以便捷产生查询条件及对应数据数组
publicfunctionFDCondition($condition,$mapData){
if(is_string($condition)){
$where=$condition;
}elseif(is_array($condition)){
if($condition['str']){
if(is_string($condition['str'])){
$where=$condition['str'];
}else{
returnfalse;
}
}
if(is_array($condition['data'])){
$link=$condition['link']?$condition['link']:'and';
list($conSql,$mapConData)=$this->FDFields($condition['data'],$link,$condition['judge']);
if($conSql){
$where.=($where?''.$link:'').$conSql;
$mapData=array_merge($mapData,$mapConData);
}
}
}
returnarray($where,$mapData);
}
增删改查的具体实现DB.php
publicfunctionfetch($sql,$searchData=array(),$dataMode=PDO::FETCH_ASSOC,$preType=array(PDO::ATTR_CURSOR=>PDO::CURSOR_FWDONLY)){
if($sql){
$sql.='limit1';
$pdoStatement=$this->pdo->prepare($sql,$preType);
$pdoStatement->execute($searchData);
return$data=$pdoStatement->fetch($dataMode);
}else{
returnfalse;
}
}
publicfunctionfetchAll($sql,$searchData=array(),$limit=array(0,10),$dataMode=PDO::FETCH_ASSOC,$preType=array(PDO::ATTR_CURSOR=>PDO::CURSOR_FWDONLY)){
if($sql){
$sql.='limit'.(int)$limit[0].','.(intval($limit[1])>0?intval($limit[1]):10);
$pdoStatement=$this->pdo->prepare($sql,$preType);
$pdoStatement->execute($searchData);
return$data=$pdoStatement->fetchAll($dataMode);
}else{
returnfalse;
}
}
publicfunctioninsert($tableName,$data,$returnInsertId=false,$replace=false){
if(!empty($tableName)&&count($data)>0){
$sql=$replace?'REPLACEINTO':'INSERTINTO';
list($setSql,$mapData)=$this->FDFields($data);
$sql.=$tableName.'set'.$setSql;
$pdoStatement=$this->pdo->prepare($sql,array(PDO::ATTR_CURSOR=>PDO::CURSOR_FWDONLY));
$execRet=$pdoStatement->execute($mapData);
return$execRet?($returnInsertId?$this->pdo->lastInsertId():$execRet):false;
}else{
returnfalse;
}
}
publicfunctionupdate($tableName,$data,$condition,$mapData=array(),$returnRowCount=true){
if(!empty($tableName)&&count($data)>0){
$sql='UPDATE'.$tableName.'SET';
list($setSql,$mapSetData)=$this->FDFields($data);
$sql.=$setSql;
$mapData=array_merge($mapData,$mapSetData);
list($where,$mapData)=$this->FDCondition($condition,$mapData);
$sql.=$where?'WHERE'.$where:'';
$pdoStatement=$this->pdo->prepare($sql,array(PDO::ATTR_CURSOR=>PDO::CURSOR_FWDONLY));
$execRet=$pdoStatement->execute($mapData);
return$execRet?($returnRowCount?$pdoStatement->rowCount():$execRet):false;
}else{
returnfalse;
}
}
publicfunctiondelete($tableName,$condition,$mapData=array()){
if(!empty($tableName)&&$condition){
$sql='DELETEFROM'.$tableName;
list($where,$mapData)=$this->FDCondition($condition,$mapData);
$sql.=$where?'WHERE'.$where:'';
$pdoStatement=$this->pdo->prepare($sql,array(PDO::ATTR_CURSOR=>PDO::CURSOR_FWDONLY));
$execRet=$pdoStatement->execute($mapData);
return$execRet;
}
}
测试文件test.php
header("Content-type:text/html;charset=utf-8");
define('APP_DIR',dirname(__FILE__));
if(function_exists('spl_autoload_register')){
spl_autoload_register('autoClass');
}else{
function__auto_load($className){
autoClass($className);
}
}
functionautoClass($className){
try{
require_onceAPP_DIR.'/class/'.$className.'.php';
}catch(Exception$e){
die('Error:'.$e->getMessage().'<br/>');
}
}
$DB=newDB();
//插入
$inData['a']=rand(1,100);
$inData['b']=rand(1,1000);
$inData['c']=rand(1,200).'.'.rand(1,100);
$ret=$DB->insert('a',$inData);
echo'插入'.($ret?'成功':'失败').'<br/>';
//更新
$upConData['a']=100;
$upConJudge['a']='<';
$upConData['b']=30;
$upConJudge['b']='>';
list($upConStr,$mapUpConData)=$DB->FDField('b',200,'<','gt');
$condition=array(
'str'=>$upConStr,
'data'=>$upConData,
'judge'=>$upConJudge,
'link'=>'and'
);
$upData['a']=rand(1,10);
$upData['b']=1;
$upData['c']=1.00;
$changeRows=$DB->update('a',$upData,$condition,$mapUpConData);
echo'更新行数:'.(int)$changeRows.'<br/>';
//删除
$delVal=rand(1,10);
list($delCon,$mapDelCon)=$DB->FDField('a',$delVal);
$delRet=$DB->delete('a',$delCon,$mapDelCon);
echo'删除a='.$delVal.($delRet?'成功':'失败').'<br/>';
//查询
$data['a']='10';
$judge['a']='>';
$data['b']='400';
$judge['b']='<';
list($conSql,$mapConData)=$DB->FDFields($data,'and',$judge);
$mData=$DB->fetch('select*fromawhere'.$conSql.'orderby`a`desc',$mapConData);
var_dump($mData);
以上所述就是本文的全部内容了,希望大家能够喜欢。