PHP中對數據庫操作的封裝


   在動態網面設計中很多都要涉及到對數據庫的操作,但是有時跟據需要而改用其它后台數據庫,就需要大量修改程序。這是一件枯燥、費時而且容易出錯的功作。其實我們可以用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> <?php
require("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數據庫的增刪該查

<?php
Class 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(!@mysql_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
Class 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(!@mysql_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);
    }
}
 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM