標籤:
在動態網面設計中很多都要涉及到對資料庫的操作,但是有時跟據需要而改用其它後台資料庫,就需要大量修改程式。這是一件枯燥、費時而且容易出錯的功作。其實我們可以用PHP中的類來實現對資料庫操作的封裝,從而使寫出的程式在很小的改動下就可以完成後台資料庫的更改。
<?class dbInterface{ var $dbID=1; //用於確定當前操作的資料庫,當dbID為1代表MySql,當為 2代表 SQL Server,為3時為ODBC或其它。var $dbHost; //資料庫所在主機網域名稱var $dbUsername; //資料庫使用者名稱var $dbPassword; //使用者密碼//設定主機、使用者名稱及密碼函數function setParameter($host,$username,$password){$this->dbUsername=$username;$this->dbHost=$host;$this->dbPassword=$password;} //聯結數庫函數function dbConnect(){switch($this->dbID){case 1;return @mysql_connect($this->dbHost,$this->dbUsername,$this->dbPassword);case 2;//用支援SQL Server的函數case 3;//用支援ODBC的函數} }//關閉數庫函數function dbClose($dataHandle){switch($this->dbID){case 1;mysql_close($dataHandle);case 2;//用支援SQL Server的函數case 3;//用支援ODBC的函數} }//執行SQL語句函數function dbQuery($dbName,$sql,$dbHandle){switch($this->dbID){case 1;return @mysql_db_query($dbName,$sql,$dbHandle);case 2;//用支援SQL Server的函數case 3;//用支援ODBC的函數} }//檢索SQL傳回值的目前記錄函數function dbFetchrow($dataHandle,$offset=-1){switch($this->dbID){case 1;@mysql_data_seek($dataHandle,$offset);return @mysql_fetch_row($dataHandle);case 2;//用支援SQL Server的函數case 3;//用支援ODBC的函數} }//返回檢索記錄數函數function dbNumrows($dataHandle){switch($this->dbID){case 1;return @mysql_num_rows($dataHandle);case 2;//用支援SQL Server的函數case 3;//用支援ODBC的函數} }//返回檢索列數函數function dbNumcols($dataHandle){switch($this->dbID){case 1;return @mysql_num_fields($dataHandle);case 2;//用支援SQL Server的函數case 3;//用支援ODBC的函數} }}
現把使用說明如下:
在程式中用dbInterface類生一個對象$test=new dbInterface;
設定參數
test->$dbUsername ;使用者名稱
test->$dbPassword;密碼
test->$dbHost;主機
void setParameter(string host, string username, string password);
資料庫連接:dbhandle test->dbConnect();
傳回值:fasle ,資料庫連接錯誤
>0, 資料庫連接控制代碼
資料庫關閉:void test->dbClose(dbhandle);
表操作:int test->dbQuery(string databasename, string sql,dbhandle);執行SQL語句
傳回值: false, SQL執行錯誤
>0, SQL執行正確, 同時指向SQL傳回值,
資料操作:int test->dbFetchrow(dataHandle,int offset);檢索SQL傳回值的目前記錄,成功執行後,指標移向下一條記錄
int test->dbNumrows(dataHandle); 取得SQL執行後(主要為SELECT語句)獲得的記錄數
int test->dbNumcols(dataHandle); 取得SQL執行後(主要為SELECT語句)獲得的記錄欄位數
現在我們發一個例了講解:
資料庫採用MQSQL:其主機名稱為 "localhost",使用者名稱為"root"和密碼""。
-----<HTML><HEAD><TITLE>test</TITLE></HEAD><BODY><P> <?phprequire("testdb.inc"); //裝載dbInterface類$test = new dbInterface;//用類dbInterface產生一個對象$test->setParameter("localhost","root","");//設定資料庫參數$db = $test->dbConnect();//串連資料庫$Query = "SELECT name,pay FROM table ";//設定SQL語句$temp_result = $test->dbQuery("testdb",$Query,$db);//執行資料主庫操作echo "<br>";$ls_num = $test->dbNumrows($temp_result); //取得查詢結果的記錄數echo $ls_num;echo "<br>";if (ls_num>0 ){$ls_col = $test->dbNumcols($db); //取得表的列數echo $ls_col; echo "<br>";$cate_result=$test->dbFetchrow($temp_result,0);//取得記錄數的第一行$hcid=$cate_result[0];// 取得name的值$hcate=$cate_result[1];//取得pay的值echo $hcid;echo "<br>";echo $hcate;}?> <HR><ADDRESS></ADDRESS></BODY></HTML>
在mysql中有一個testdb資料庫及其中的表table1,表包括:name和pay兩個欄位
php封裝一個class類實現mysql資料庫的增刪該查
<?phpClass DB { private $link_id; private $handle; private $is_log; private $time; //建構函式 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; } } //資料庫連接 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("資料庫連接失敗"); } } else { $this->link_id = @mysql_pconnect($dbhost, $dbuser, $dbpw); if(!$this->link_id){ $this->halt("資料庫持久串連失敗"); } } if([email protected]_select_db($dbname,$this->link_id)) { $this->halt(‘資料庫選擇失敗‘); } @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(‘沒有要插入的資料‘); 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(‘沒有要更新的資料‘); 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(‘沒有設定刪除的條件‘); return false; } $sql = "delete from $table where 1=1 and $condition"; $this->write_log("刪除 ".$sql); if(!$this->query($sql)) return false; return true; } //返回結果集 public function fetch_array($query, $result_type = MYSQL_ASSOC){ $this->write_log("返回結果集"); return mysql_fetch_array($query, $result_type); } //擷取記錄條數 public function num_rows($results) { if(!is_bool($results)) { $num = mysql_num_rows($results); $this->write_log("擷取的記錄條數為".$num); return $num; } else { return 0; } } //釋放結果集 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("釋放結果集"); } //擷取最後插入的id public function insert_id() { $id = mysql_insert_id($this->link_id); $this->write_log("最後插入的id為".$id); return $id; } //關閉資料庫連接 protected function close() { $this->write_log("已關閉資料庫連接"); return @mysql_close($this->link_id); } //錯誤提示 private function halt($msg=‘‘) { $msg .= "\r\n".mysql_error(); $this->write_log($msg); die($msg); } //解構函式 public function __destruct() { $this->free_result(); $use_time = ($this-> microtime_float())-($this->time); $this->write_log("完成整個查詢任務,所用時間為".$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); } } //擷取毫秒數 public function microtime_float() { list($usec, $sec) = explode(" ", microtime()); return ((float)$usec + (float)$sec); }} ?>
PHP中對資料庫操作的封裝