PHP中对数据库操作的封装
?? 在動態(tài)網(wǎng)面設(shè)計中很多都要涉及到對數(shù)據(jù)庫的操作,但是有時跟據(jù)需要而改用其它后臺數(shù)據(jù)庫,就需要大量修改程序。這是一件枯燥、費時而且容易出錯的功作。其實我們可以用PHP中的類來實現(xiàn)對數(shù)據(jù)庫操作的封裝,從而使寫出的程序在很小的改動下就可以完成后臺數(shù)據(jù)庫的更改。
<? class dbInterface{ var $dbID=1; //用于確定當(dāng)前操作的數(shù)據(jù)庫,當(dāng)dbID為1代表MySql,當(dāng)為 2代表 SQL Server,為3時為ODBC或其它。 var $dbHost; //數(shù)據(jù)庫所在主機域名 var $dbUsername; //數(shù)據(jù)庫用戶名 var $dbPassword; //用戶密碼 //設(shè)置主機、用戶名及密碼函數(shù) function setParameter($host,$username,$password){ $this->dbUsername=$username; $this->dbHost=$host; $this->dbPassword=$password;} //聯(lián)接數(shù)庫函數(shù) function dbConnect(){ switch($this->dbID) { case 1; return @mysql_connect($this->dbHost,$this->dbUsername,$this->dbPassword); case 2; //用支持SQL Server的函數(shù) case 3; //用支持ODBC的函數(shù) } } //關(guān)閉數(shù)庫函數(shù) function dbClose($dataHandle){ switch($this->dbID) { case 1; mysql_close($dataHandle); case 2; //用支持SQL Server的函數(shù) case 3; //用支持ODBC的函數(shù) } }//執(zhí)行SQL語句函數(shù) function dbQuery($dbName,$sql,$dbHandle){ switch($this->dbID) { case 1; return @mysql_db_query($dbName,$sql,$dbHandle); case 2; //用支持SQL Server的函數(shù) case 3; //用支持ODBC的函數(shù) } }//檢索SQL返回值的當(dāng)前記錄函數(shù) function dbFetchrow($dataHandle,$offset=-1){ switch($this->dbID) { case 1; @mysql_data_seek($dataHandle,$offset); return @mysql_fetch_row($dataHandle); case 2; //用支持SQL Server的函數(shù) case 3; //用支持ODBC的函數(shù) } }//返回檢索記錄數(shù)函數(shù) function dbNumrows($dataHandle){ switch($this->dbID) { case 1; return @mysql_num_rows($dataHandle); case 2; //用支持SQL Server的函數(shù) case 3; //用支持ODBC的函數(shù) } }//返回檢索列數(shù)函數(shù) function dbNumcols($dataHandle){ switch($this->dbID) { case 1; return @mysql_num_fields($dataHandle); case 2; //用支持SQL Server的函數(shù) case 3; //用支持ODBC的函數(shù) } } }?現(xiàn)把使用說明如下:
在程序中用dbInterface類生一個對象$test=new dbInterface;
設(shè)置參數(shù)
test->$dbUsername ;用戶名
test->$dbPassword;密碼
test->$dbHost;主機
void setParameter(string host, string username, string password);
數(shù)據(jù)庫連接:dbhandle test->dbConnect();
返回值:fasle ,數(shù)據(jù)庫連接錯誤
>0, 數(shù)據(jù)庫連接句柄
數(shù)據(jù)庫關(guān)閉:void test->dbClose(dbhandle);
表操作:int test->dbQuery(string databasename, string sql,dbhandle);執(zhí)行SQL語句
返回值: false, SQL執(zhí)行錯誤
>0, SQL執(zhí)行正確, 同時指向SQL返回值,
數(shù)據(jù)操作:int test->dbFetchrow(dataHandle,int offset);檢索SQL返回值的當(dāng)前記錄,成功執(zhí)行后,指針移向下一條記錄
int test->dbNumrows(dataHandle); 取得SQL執(zhí)行后(主要為SELECT語句)獲得的記錄數(shù)
int test->dbNumcols(dataHandle); 取得SQL執(zhí)行后(主要為SELECT語句)獲得的記錄字段數(shù)
現(xiàn)在我們發(fā)一個例了講解:
數(shù)據(jù)庫采用MQSQL:其主機名為 "localhost",用戶名為"root"和密碼""。
?
在mysql中有一個testdb數(shù)據(jù)庫及其中的表table1,表包括:name和pay兩個字段
php封裝一個class類實現(xiàn)mysql數(shù)據(jù)庫的增刪該查
<?php Class DB {private $link_id;private $handle;private $is_log;private $time;//構(gòu)造函數(shù)public function __construct() {$this->time = $this->microtime_float();require_once("config.db.php");$this->connect($db_config["hostname"], $db_config["username"], $db_config["password"], $db_config["database"], $db_config["pconnect"]);$this->is_log = $db_config["log"];if($this->is_log){$handle = fopen($db_config["logfilepath"]."dblog.txt", "a+");$this->handle=$handle;}}//數(shù)據(jù)庫連接public function connect($dbhost, $dbuser, $dbpw, $dbname, $pconnect = 0,$charset='utf8') {if( $pconnect==0 ) {$this->link_id = @mysql_connect($dbhost, $dbuser, $dbpw, true);if(!$this->link_id){$this->halt("數(shù)據(jù)庫連接失敗");}} else {$this->link_id = @mysql_pconnect($dbhost, $dbuser, $dbpw);if(!$this->link_id){$this->halt("數(shù)據(jù)庫持久連接失敗");}}if(!@mysql_select_db($dbname,$this->link_id)) {$this->halt('數(shù)據(jù)庫選擇失敗');}@mysql_query("set names ".$charset);}//查詢 public function query($sql) {$this->write_log("查詢 ".$sql);$query = mysql_query($sql,$this->link_id);if(!$query) $this->halt('Query Error: ' . $sql);return $query;}//獲取一條記錄(MYSQL_ASSOC,MYSQL_NUM,MYSQL_BOTH) public function get_one($sql,$result_type = MYSQL_ASSOC) {$query = $this->query($sql);$rt =& mysql_fetch_array($query,$result_type);$this->write_log("獲取一條記錄 ".$sql);return $rt;}//獲取全部記錄public function get_all($sql,$result_type = MYSQL_ASSOC) {$query = $this->query($sql);$i = 0;$rt = array();while($row =& mysql_fetch_array($query,$result_type)) {$rt[$i]=$row;$i++;}$this->write_log("獲取全部記錄 ".$sql);return $rt;}//插入public function insert($table,$dataArray) {$field = "";$value = "";if( !is_array($dataArray) || count($dataArray)<=0) {$this->halt('沒有要插入的數(shù)據(jù)');return false;}while(list($key,$val)=each($dataArray)) {$field .="$key,";$value .="'$val',";}$field = substr( $field,0,-1);$value = substr( $value,0,-1);$sql = "insert into $table($field) values($value)";$this->write_log("插入 ".$sql);if(!$this->query($sql)) return false;return true;}//更新public function update( $table,$dataArray,$condition="") {if( !is_array($dataArray) || count($dataArray)<=0) {$this->halt('沒有要更新的數(shù)據(jù)');return false;}$value = "";while( list($key,$val) = each($dataArray))$value .= "$key = '$val',";$value .= substr( $value,0,-1);$sql = "update $table set $value where 1=1 and $condition";$this->write_log("更新 ".$sql);if(!$this->query($sql)) return false;return true;}//刪除public function delete( $table,$condition="") {if( empty($condition) ) {$this->halt('沒有設(shè)置刪除的條件');return false;}$sql = "delete from $table where 1=1 and $condition";$this->write_log("刪除 ".$sql);if(!$this->query($sql)) return false;return true;}//返回結(jié)果集public function fetch_array($query, $result_type = MYSQL_ASSOC){$this->write_log("返回結(jié)果集");return mysql_fetch_array($query, $result_type);}//獲取記錄條數(shù)public function num_rows($results) {if(!is_bool($results)) {$num = mysql_num_rows($results);$this->write_log("獲取的記錄條數(shù)為".$num);return $num;} else {return 0;}}//釋放結(jié)果集public function free_result() {$void = func_get_args();foreach($void as $query) {if(is_resource($query) && get_resource_type($query) === 'mysql result') {return mysql_free_result($query);}}$this->write_log("釋放結(jié)果集");}//獲取最后插入的idpublic function insert_id() {$id = mysql_insert_id($this->link_id);$this->write_log("最后插入的id為".$id);return $id;}//關(guān)閉數(shù)據(jù)庫連接protected function close() {$this->write_log("已關(guān)閉數(shù)據(jù)庫連接");return @mysql_close($this->link_id);}//錯誤提示private function halt($msg='') {$msg .= "\r\n".mysql_error();$this->write_log($msg);die($msg);}//析構(gòu)函數(shù)public function __destruct() {$this->free_result();$use_time = ($this-> microtime_float())-($this->time);$this->write_log("完成整個查詢?nèi)蝿?wù),所用時間為".$use_time);if($this->is_log){fclose($this->handle);}}//寫入日志文件public function write_log($msg=''){if($this->is_log){$text = date("Y-m-d H:i:s")." ".$msg."\r\n";fwrite($this->handle,$text);}}//獲取毫秒數(shù)public function microtime_float() {list($usec, $sec) = explode(" ", microtime());return ((float)$usec + (float)$sec);} }?>?
<?php Class DB {private $link_id;private $handle;private $is_log;private $time;//構(gòu)造函數(shù)public function __construct() {$this->time = $this->microtime_float();require_once("config.db.php");$this->connect($db_config["hostname"], $db_config["username"], $db_config["password"], $db_config["database"], $db_config["pconnect"]);$this->is_log = $db_config["log"];if($this->is_log){$handle = fopen($db_config["logfilepath"]."dblog.txt", "a+");$this->handle=$handle;}}//數(shù)據(jù)庫連接public function connect($dbhost, $dbuser, $dbpw, $dbname, $pconnect = 0,$charset='utf8') {if( $pconnect==0 ) {$this->link_id = @mysql_connect($dbhost, $dbuser, $dbpw, true);if(!$this->link_id){$this->halt("數(shù)據(jù)庫連接失敗");}} else {$this->link_id = @mysql_pconnect($dbhost, $dbuser, $dbpw);if(!$this->link_id){$this->halt("數(shù)據(jù)庫持久連接失敗");}}if(!@mysql_select_db($dbname,$this->link_id)) {$this->halt('數(shù)據(jù)庫選擇失敗');}@mysql_query("set names ".$charset);}//查詢 public function query($sql) {$this->write_log("查詢 ".$sql);$query = mysql_query($sql,$this->link_id);if(!$query) $this->halt('Query Error: ' . $sql);return $query;}//獲取一條記錄(MYSQL_ASSOC,MYSQL_NUM,MYSQL_BOTH) public function get_one($sql,$result_type = MYSQL_ASSOC) {$query = $this->query($sql);$rt =& mysql_fetch_array($query,$result_type);$this->write_log("獲取一條記錄 ".$sql);return $rt;}//獲取全部記錄public function get_all($sql,$result_type = MYSQL_ASSOC) {$query = $this->query($sql);$i = 0;$rt = array();while($row =& mysql_fetch_array($query,$result_type)) {$rt[$i]=$row;$i++;}$this->write_log("獲取全部記錄 ".$sql);return $rt;}//插入public function insert($table,$dataArray) {$field = "";$value = "";if( !is_array($dataArray) || count($dataArray)<=0) {$this->halt('沒有要插入的數(shù)據(jù)');return false;}while(list($key,$val)=each($dataArray)) {$field .="$key,";$value .="'$val',";}$field = substr( $field,0,-1);$value = substr( $value,0,-1);$sql = "insert into $table($field) values($value)";$this->write_log("插入 ".$sql);if(!$this->query($sql)) return false;return true;}//更新public function update( $table,$dataArray,$condition="") {if( !is_array($dataArray) || count($dataArray)<=0) {$this->halt('沒有要更新的數(shù)據(jù)');return false;}$value = "";while( list($key,$val) = each($dataArray))$value .= "$key = '$val',";$value .= substr( $value,0,-1);$sql = "update $table set $value where 1=1 and $condition";$this->write_log("更新 ".$sql);if(!$this->query($sql)) return false;return true;}//刪除public function delete( $table,$condition="") {if( empty($condition) ) {$this->halt('沒有設(shè)置刪除的條件');return false;}$sql = "delete from $table where 1=1 and $condition";$this->write_log("刪除 ".$sql);if(!$this->query($sql)) return false;return true;}//返回結(jié)果集public function fetch_array($query, $result_type = MYSQL_ASSOC){$this->write_log("返回結(jié)果集");return mysql_fetch_array($query, $result_type);}//獲取記錄條數(shù)public function num_rows($results) {if(!is_bool($results)) {$num = mysql_num_rows($results);$this->write_log("獲取的記錄條數(shù)為".$num);return $num;} else {return 0;}}//釋放結(jié)果集public function free_result() {$void = func_get_args();foreach($void as $query) {if(is_resource($query) && get_resource_type($query) === 'mysql result') {return mysql_free_result($query);}}$this->write_log("釋放結(jié)果集");}//獲取最后插入的idpublic function insert_id() {$id = mysql_insert_id($this->link_id);$this->write_log("最后插入的id為".$id);return $id;}//關(guān)閉數(shù)據(jù)庫連接protected function close() {$this->write_log("已關(guān)閉數(shù)據(jù)庫連接");return @mysql_close($this->link_id);}//錯誤提示private function halt($msg='') {$msg .= "\r\n".mysql_error();$this->write_log($msg);die($msg);}//析構(gòu)函數(shù)public function __destruct() {$this->free_result();$use_time = ($this-> microtime_float())-($this->time);$this->write_log("完成整個查詢?nèi)蝿?wù),所用時間為".$use_time);if($this->is_log){fclose($this->handle);}}//寫入日志文件public function write_log($msg=''){if($this->is_log){$text = date("Y-m-d H:i:s")." ".$msg."\r\n";fwrite($this->handle,$text);}}//獲取毫秒數(shù)public function microtime_float() {list($usec, $sec) = explode(" ", microtime());return ((float)$usec + (float)$sec);} }?
轉(zhuǎn)載于:https://www.cnblogs.com/zoubizhici/p/5585724.html
《新程序員》:云原生和全面數(shù)字化實踐50位技術(shù)專家共同創(chuàng)作,文字、視頻、音頻交互閱讀總結(jié)
以上是生活随笔為你收集整理的PHP中对数据库操作的封装的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 阿里云centos 6.5 32位安装可
- 下一篇: 几个点的论述