-
21.獲得最后一次SQL語句 public static function getLastSql(){ $link=self::$link; if(!$link)return false; return self::$queryStr; } 22.獲得最后一次插入語句產(chǎn)生的AUTO_INCREMENT public static function getLastInsertId(){ $link=self::$link; if(!$link)return false; //在每次在execute()中執(zhí)行SQL語句成功后獲得self::$lastInsertId return self::$lastInsertId; } 23.獲取服務器版本 public static function getDbVerion(){ $link=self::$link; if(!$link)return false; //在構(gòu)造函數(shù)中鏈接數(shù)據(jù)庫成功時獲得self::$dbVersion return self::$dbVersion; } 24.獲得數(shù)據(jù)庫中的說有表 public static function showTables(){ $tables=array(); if(self::query("SHOW TABLES")){ $result=self::getAll(); foreach($result as $key=>$val){ $tables[$key]=current($val); } } return $tables; }查看全部
-
20.刪除記錄的操作 public static function delete($table,$where=null,$order=null,$limit=0){ $sql="DELETE FROM {$table} ".self::parseWhere($where).self::parseOrder($order).self::parseLimit($limit); return self::execute($sql); }查看全部
-
19.更新記錄 參數(shù)1為關(guān)聯(lián)數(shù)組,鍵名為列名 public static function update($data,$table,$where=null,$order=null,$limit=0){ foreach($data as $key=>$val){ $sets.=$key."='".$val."',"; } //$sets最后會多一個逗號(上面連接字符串時定義所有的$val后面都添加了逗號).所有要去掉 $sets=rtrim($sets,','); $sql="UPDATE {$table} SET {$sets} ".self::parseWhere($where).self::parseOrder($order).self::parseLimit($limit); return self::execute($sql); }查看全部
-
18.添加記錄的操作 參數(shù)1為關(guān)聯(lián)數(shù)組,鍵名為列名,鍵值為數(shù)據(jù); 參數(shù)2為 string public static function add($data,$table){ //獲取關(guān)聯(lián)數(shù)組內(nèi)的所有鍵名,存儲在索引字符串并返回 $keys=array_keys($data); //給$keys所有值添加單引號 array_walk($keys,array('PdoMySQL','addSpecialChar')); $fieldsStr=join(',',$keys); $values="'".join("','",array_values($data))."'"; $sql="INSERT {$table}({$fieldsStr}) VALUES({$values})"; //執(zhí)行插入并返回受影響行條數(shù); return self::execute($sql); }查看全部
-
17.對解析限制顯示條數(shù)limit函數(shù)添加功能(判斷其是否為數(shù)字) public static function parseLimit($limit){ $limitStr=''; if(is_array($limit)){ //count(array,mode)返回數(shù)組中元素的數(shù)目。mode=0:返回第一維數(shù)組元素數(shù)目, mode=1:返回所有數(shù)組元素數(shù)目 if(count($limit)>1){ $limitStr.=' LIMIT '.$limit[0].','.$limit[1]; }else{ $limitStr.=' LIMIT '.$limit[0]; } }elseif(is_string($limit)&&!empty($limit)){ $limitStr.=' LIMIT '.$limit; //判斷是否為數(shù)字 }elseif(is_numeric($limit)&&!empty($limit)){ $limitStr.=' LIMIT '.$limit; } return $limitStr; }查看全部
-
15.對分組結(jié)果通過Having子句進行二次刪選 //設置的Having條件必須為字符串且有值,否則返回空字符串 public static function parseHaving($having){ $havingStr=''; if(is_string($having)&&!empty($having)){ $havingStr.=' HAVING '.$having; } return $havingStr; } 16.解析Order by //設置的Order by條件必須為 數(shù)組 或 有字符的字符串,否則返回空字符串 public static function parseOrder($order){ $orderStr=''; if(is_array($order)){ //join()拼接數(shù)組成字符串 $orderStr.=' ORDER BY '.join(',',$order); }elseif(is_string($order)&&!empty($order)){ $orderStr.=' ORDER BY '.$order; } return $orderStr; } 17.解析限制顯示條數(shù)limit //設置的limit條件必須為 數(shù)組 或 有字符的字符串,否則返回空字符串 public static function parseLimit($limit){ $limitStr=''; if(is_array($limit)){ if(count($limit)>1){ //從第$limit[0]條記錄往下去$limit[1]條記錄 //防止用戶輸入多于兩個的數(shù)組值,所有不用jion(),implode()等函數(shù) $limitStr.=' LIMIT '.$limit[0].','.$limit[1]; }else{ $limitStr.=' LIMIT '.$limit[0]; //從第一條記錄開始往下去$limit[0]條記錄 } }elseif(is_string($limit)&&!empty($limit)){ $limitStr.=' LIMIT '.$limit; } return $limitStr; }查看全部
-
12.執(zhí)行普通查詢 public static function find($tables,$where=null,$fields='*',$group=null,$having=null,$order=null,$limit=null){ $sql='SELECT '.self::parseFields($fields).' FROM '.$tables .self::parseWhere($where) .self::parseGroup($group) .self::parseHaving($having) .self::parseOrder($order) .self::parseLimit($limit); $dataAll=self::getAll($sql); //count(array,mode)返回數(shù)組中元素的數(shù)目。mode=0:返回第一維數(shù)組元素數(shù)目, mode=1:返回所有數(shù)組元素數(shù)目 return count($dataAll)==1?$dataAll[0]:$dataAll; } 13.解析Where條件 //設置的where條件必須為字符串且有值,否則返回空字符串 public static function parseWhere($where){ $whereStr=''; if(is_string($where)&&!empty($where)){ $whereStr=' WHERE '.$where; } return $whereStr; } 14.解析group by條件 //設置的group by條件必須為 數(shù)組 或 有字符的字符串,否則返回空字符串 public static function parseGroup($group){ $groupStr=''; if(is_array($group)){ //implode()拼接數(shù)組成字符串 $groupStr.=' GROUP BY '.implode(',',$group); }elseif(is_string($group)&&!empty($group)){ $groupStr.=' GROUP BY '.$group; } return $groupStr; }查看全部
-
11.通過反引號引用字段 /*解釋一下這里不用做處理的原因,就是說,如果用'`'引用起來的這種就如 select name ,esc from user where id=1;這里的esc是保留字會報錯, select name ,`desc` from user where id=1;這樣就可以執(zhí)行,同理 select name,user.desc from user where id=1,也是同樣可以執(zhí)行的; 所以這里的判斷就是判斷這兩種情況。*/ //測參數(shù)是否為'*' 或 是否已經(jīng)擁有'.' 或 是否擁有反引號,如果是則不處理,如果沒有則給參數(shù)添加單引號(參數(shù)為引用傳遞) public static function addSpecialChar(&$value){ if($value==='*'||strpos($value,'.')!==false||strpos($value,'`')!==false){ //不用做處理 }elseif(strpos($value,'`')===false){ //如果沒有單引號,添加單引號 $value='`'.trim($value).'`'; } return $value; }查看全部
-
9.根據(jù)主鍵查找記錄 public static function findById($tabName,$priId,$fields='*'){ $sql='SELECT %s FROM %s WHERE id=%d'; return self::getRow(sprintf($sql,self::parseFields($fields),$tabName,$priId)); } 10.解析字段 public static function parseFields($fields){ if(is_array($fields)){ //為數(shù)組時 //array_walk()對數(shù)組中的每個元素應用用戶自定義函數(shù)(或方法),第二個參數(shù)表示:調(diào)用的自定義方法為PdoMySQL::addSpecialChar() //PdoMySQL::addSpecialChar()給參數(shù)添加單引號(參數(shù)為引用傳遞) array_walk($fields,array('PdoMySQL','addSpecialChar')); $fieldsStr=implode(',',$fields); }elseif(is_string($fields)&&!empty($fields)){ if(strpos($fields,'`')===false){ //字符串中沒有單引號 $fields=explode(',',$fields); array_walk($fields,array('PdoMySQL','addSpecialChar')); $fieldsStr=implode(',',$fields); }else{ $fieldsStr=$fields; } }else{ $fieldsStr='*'; } return $fieldsStr; }查看全部
-
7.獲得存放結(jié)果集中一條記錄的關(guān)聯(lián)數(shù)組 public static function getRow($sql=null){ if($sql!=null){ self::query($sql); } $result=self::$PDOStatement->fetch(constant("PDO::FETCH_ASSOC")); return $result; } 8.執(zhí)行增刪改操作,返回受影響的記錄的條數(shù) public static function execute($sql=null){ //獲取連接標識符 $link=self::$link; if(!$link) return false; //保存本次查詢語句 self::$queryStr=$sql; //判斷之前是否有結(jié)果集,如果有的話,釋放結(jié)果集 if(!empty(self::$PDOStatement))self::free(); //POD::exec()方法返回受影響的記錄的條數(shù) 或 false $result=$link->exec(self::$queryStr); //查看本次查詢是否有錯誤,如果有則打印本次錯誤信息 self::haveErrorThrowException(); if($result){ //保存上一步插入操作產(chǎn)生AUTO_INCREMENT self::$lastInsertId=$link->lastInsertId(); //保存上一步操作產(chǎn)生受影響的記錄的條數(shù) self::$numRows=$result; return self::$numRows; }else{ return false; } }查看全部
-
5.自定義異常處理程序 public static function throw_exception($errMsg){ echo '<div > '.$errMsg.' </div>'; } 6.釋放結(jié)果集 public static function free(){ self::$PDOStatement=null; }查看全部
-
3.查詢語句(只能執(zhí)行一條SQL語句) public static function query($sql=''){ //獲取連接標識符 $link=self::$link; if(!$link) return false; //判斷之前是否有結(jié)果集,如果有的話,釋放結(jié)果集 if(!empty(self::$PDOStatement))self::free(); //保存本次查詢語句 self::$queryStr=$sql; //預處理語句只能執(zhí)行一條SQL語句 self::$PDOStatement=$link->prepare(self::$queryStr); $res=self::$PDOStatement->execute(); //查看本次查詢是否有錯誤,如果有則打印本次錯誤信息 self::haveErrorThrowException(); return $res; } 4.查看最近一次 查詢 或 連接 是否有錯誤,如果有則打印本次錯誤信息并返回false public static function haveErrorThrowException(){ $obj=empty(self::$PDOStatement)?self::$link: self::$PDOStatement; $arrError=$obj->errorInfo(); //錯誤信息數(shù)組下標為[0]的值為'00000'表示沒有錯誤 if($arrError[0]!='00000'){ //獲取錯誤信息并拋出異常 self::$error='SQLSTATE: '.$arrError[0].' <br/>SQL Error: '.$arrError[2].'<br/>Error SQL:'.self::$queryStr; self::throw_exception(self::$error); return false; } if(self::$queryStr==''){ self::throw_exception('沒有執(zhí)行SQL語句'); return false; } }查看全部
-
2.獲取存放結(jié)果集中所有記錄的關(guān)聯(lián)數(shù)組 public static function getAll($sql=null){ if($sql!=null){ self::query($sql); } $result=self::$PDOStatement->fetchAll(constant("PDO::FETCH_ASSOC")); return $result; }查看全部
-
1.構(gòu)造函數(shù)解析下篇 1.2).參數(shù)設置完成后的鏈接部分 //判斷靜態(tài)變量self::$link是否還沒有沒有被賦值(即之前沒有數(shù)據(jù)庫被連接) //即在之前沒有連接其他數(shù)據(jù)庫情況下,才能開始本次數(shù)據(jù)庫的連接 if(!isset(self::$link)){ //保存本次連接參數(shù) $configs=self::$config; if(self::$pconnect){ //開啟長連接,添加到配置數(shù)組中 $configs['params'][constant("PDO::ATTR_PERSISTENT")]=true; } try{ self::$link=new PDO($configs['dsn'],$configs['username'],$configs['password'],$configs['params']); }catch(PDOException $e){ self::throw_exception($e->getMessage()); } //連接失敗 if(!self::$link){ self::throw_exception('PDO連接錯誤'); return false; } //設置字符集 self::$link->exec('SET NAMES '.DB_CHARSET); //獲取服務器版本 self::$dbVersion=self::$link->getAttribute(constant("PDO::ATTR_SERVER_VERSION")); //設置連接成功標志符 self::$connected=true; //釋放臨時存放連接參數(shù)變量 unset($configs); } }查看全部
-
1.構(gòu)造函數(shù)解析上篇 1.1).參數(shù)獲取與判斷部分 public function __construct($dbConfig=''){ //PHP將所有以 __(兩個下劃線)開頭的類方法保留為魔術(shù)方法 if(!class_exists("PDO")){ //判斷是否加載了PDO擴展 self::throw_exception('不支持PDO,請先開啟'); } if(!is_array($dbConfig)){ //判斷是否傳參給構(gòu)造函數(shù),如果沒有傳參則取默認值 $dbConfig=array( 'hostname'=>DB_HOST, 'username'=>DB_USER, 'password'=>DB_PWD, 'database'=>DB_NAME, 'hostport'=>DB_PORT, 'dbms'=>DB_TYPE, 'dsn'=>DB_TYPE.":host=".DB_HOST.";dbname=".DB_NAME ); } //如果用戶傳參,但沒有填寫必填 //用戶沒有填寫主機名,則拋出自定義異常程序 if(empty($dbConfig['hostname']))self::throw_exception('沒有定義數(shù)據(jù)庫配置,請先定義'); //獲取用戶連接參數(shù),保存到自定義變量中 self::$config=$dbConfig; //用戶沒有填寫驅(qū)動的連接選項,則賦空數(shù)組為默認值 if(empty(self::$config['params']))self::$config['params']=array();查看全部
舉報
0/150
提交
取消