将资料库常用的方法打包起来~
这支没打包的很好~
只时间会回头进行重构,
不知有无更好的idea,
有的话请不令啬告知,
感恩
直接上code
/** PDO连线资料库的通用 * @version 0.0.3 2020/07/16 新增init(PDO)使$db可以选择直接外部带入 * @version 0.0.2 加入资料库DB操作 查询、新增、删除,连线直接使用全域$db,或许未来可以改名为PdoHelper或DbHelper * @version 0.0.1 新增BindValueWithDataTypes,方便PDO插入含有null的参数 */class PdoService{private static $db = null;/** 设定PDO */public static function init(PDO $pdo){ self::$db = $pdo;}public static function isInit(){ return self::$db != null;}/** 建立PDO */public static function PdoNewConnect($HOST='',$DBNAME='',$USER='',$PASSWD=''){ global $host,$db_name,$name,$pass; if(empty($HOST) && empty($DBNAME) && empty($USER) && empty($PASSWD)){ $HOST = $host; $DBNAME = $db_name; $USER = $name; $PASSWD = $pass; } $db = new PDO("mysql:dbname=$DBNAME;host=$HOST;", $USER, $PASSWD, array(PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES \'UTF8\'')); $db->setAttribute(PDO::ATTR_CASE, PDO::CASE_NATURAL); $db->setAttribute(PDO::ATTR_EMULATE_PREPARES, false); // 增加安全性与速度 $db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_WARNING); // 方便测试 ERRMODE_EXCEPTION return $db;}/** 建立/取得PDO */public static function PDOConnect($HOST='', $DBNAME='', $USER='', $PASSWD=''){ global $db; // PDO self::$db = $db ?: self::PdoNewConnect($HOST, $DBNAME, $USER, $PASSWD); return self::$db;}public static function SqlQuery($sql, $params = [], $PDO_FETCH = PDO::FETCH_OBJ){ $db = self::PDOConnect(); // 连线 $query = $db->prepare($sql); self::BindValueWithDataTypes($query,$params); // 设定参数 $query->execute(); // 执行 $data = $query->fetchAll($PDO_FETCH) ?: array(); // 捞取全部内容 return $data;}/** PDO插入含有null的参数 * 格式1 $param=[ ['name'=>':pid','value'=>null], ... ]; * 格式2 $param=[ ':key'=>'value',':key'=>null, ... ]; */public static function BindValueWithDataTypes(PDOStatement $sth, array $params){ //可能格式 $param=[ ['name'=>':pid','value'=>null], ... ] //可能格式 $param=[ ':key'=>'value','key'=>null, ... ] foreach ($params as $key => $param) { //格式判断 //格式 $param=[ ['name'=>':pid','value'=>null], ... ] if (is_array($param)) { if (!is_null($param['value'])) $sth->bindValue($param['name'], $param['value']); else $sth->bindValue($param['name'], null, PDO::PARAM_NULL); } else { //格式 $param=[ 'key'=>'value','key'=>null, ... ] if (!is_null($param)) $sth->bindValue($key, $param); else $sth->bindValue($key, null, PDO::PARAM_NULL); } }}public static function Insert($table,array $data){ $db = self::PDOConnect(); $sqlFields=[]; $sqlValues=[]; $sqlParams=[]; foreach ($data as $key => $value) { if($key=='') continue; $sqlFields[]=$key; // 判断该栏位值是一般栏位还是sql陈述句 if(strtoupper(substr($value,0,7))!='(SELECT'){ // 一般栏位 $sqlValues[]=":$key"; $sqlParams[":$key"]=$value; }else{ // sql陈述句 $sqlValues[]=$value; } } $sql='insert into '.$table.'('.join(',',$sqlFields).')values('.join(',',$sqlValues).')'; $query = $db->prepare($sql); PdoService::BindValueWithDataTypes($query,$sqlParams); return $query->execute();}public static function Delete($table,array $where){ $db = self::PDOConnect(); $sqlValues=[]; $sqlParams=[]; foreach ($where as $key => $value) { if($key=='') continue; // 判断该栏位值是一般栏位还是sql陈述句 if(strtoupper(substr($value,0,7))!='(SELECT'){ // 一般栏位 $sqlValues[]="$key = :$key"; $sqlParams[":$key"]=$value; }else{ // sql陈述句 $sqlValues[]=$value; } } $sql = "DELETE FROM $table "; if(count($sqlValues)) $sql .=' where '.join(' and ',$sqlValues); $sth = $db->prepare($sql); return $sth->execute($sqlParams);}public static function Update($table,array $data, $where=[]){ $db = self::PDOConnect(); $sqlData=[]; $sqlWhere=[]; $sqlParams=[]; foreach ($data as $key => $value) { if($key=='') continue; // 判断该栏位值是一般栏位还是sql陈述句 if(strtoupper(substr($value,0,7))!='(SELECT'){ // 一般栏位 $sqlData[]="`$key`=:$key"; $sqlParams[":$key"]=$value; }else{ // sql陈述句 $sqlData[]="`$key`=$value"; } } foreach ($where as $key => $value) { if($key=='') continue; // 判断该栏位值是一般栏位还是sql陈述句 // TODO:可改用正则改写 if (empty($value) && !empty($key)) { $sqlWhere[] = $key; } else if(is_array($value)) { $sqlWhere[] = "`$key`IN('" . join("','", $value) . "')"; } else if(in_array(strtoupper(substr($value,0,1)), ['(', '<', '>', '=']) || strtoupper(substr($value,0,4)) =='LIKE '){ // 一般栏位 $sqlWhere[] = "`$key`=:$key"; $sqlParams[":$key"] = $value; }else{ // sql陈述句 $sqlWhere[] = "`$key`=$value"; } } $sql="UPDATE $table SET " . join(' , ',$sqlData) . (count($sqlWhere)>0 ? " WHERE ". join(' AND ',$sqlWhere) : '' ) ; $sth = $db->prepare($sql); return $sth->execute($sqlParams);}}