No-PDO-Models-MySQL資料庫層抽象類 – 實現

angFL發表於2017-04-19

資料庫抽象層實現 mysql_connect (已廢棄)

<?php 

/**
 *class Mysql_db
 *
 * mysql 資料庫類,實現Database_interface 介面
 *
 * @param       Database
 * @author      王扶林        
 * @copyright   王扶林 2014-9-29
 *
 * @version     1.0
 * 
 */
require_once "Database_interface.php";
/**
 * 
 */
class Mysql_db implements Database_Interface
{
    /**
     * 資料庫連線標識
     * @var resource
     * @access protected
     */
    protected $_dbConnect = null;

    /**
     * 資料庫查詢結果集
     * @var resource
     * @access protected
     */
    protected $_result = null;

    /**
     * 插入語句最後執行的最後自增索引值
     * @var integer
     * @access public
     */
    public $insertId = 1;

    /**
     * isAssocArray()
     * @param  array  $arr  待判斷的陣列
     * @return boolean      若陣列為關聯陣列,返回TRUE,否則返回FALSE
     */
    static public function isAssocArray($arr)
    {
        return array_keys($arr) !== range(0,count($arr)-1);
    }

    /**
     * __construct
     * @param string $dbname 傳入的資料庫的名稱(可選引數,預設為usr資料庫)
     * @param string $dbhost 傳入的資料庫的伺服器地址(可選引數,預設為127.0.0.1)
     * @param string $dbuser 傳入的資料庫賬戶名(可選引數,預設為root)
     * @param string $dbpwd  傳入的資料庫賬戶名所對應的賬戶密碼(可選引數,預設為***)
     */
    public function __construct($dbname = `usr`,$dbhost = `127.0.0.1`,
                                $dbuser = `root`,$dbpwd = `***`)
    {
        $this->_dbConnect = @mysql_connect($dbhost, $dduser, $dbpwd);
        //連線資料庫
        if (false == $this->_dbConnect) {
            throw new Exception("資料庫連線錯誤".mysql_error());        
        }
        //選擇資料庫
        if (!@mysql_select_db($dbname,$this->_dbConnect)) {
            throw new Exception("資料庫選擇錯誤" . mysql_error());        
        }
        //設定字元編碼
        $this->setCharset();
    }

    /**
     * __destruct
     *
     *解構函式,釋放結果集資源
     *@return nulll 
     * 
     */
    public function __destruct(){
        //釋放結果集
        $this->freeResult();
        //關閉資料庫連線
        if ($this->_dbConnect) {
            mysql_close($this->_dbConnect);
        }
    }

    /**
     * select 
     *
     * 獲得資料表中所有滿足特定條件的記錄
     *
     * @param  string  $tableName     必要引數,待查詢的資料表
     * @param  array   $condition     查詢條件(可選引數,為一關聯陣列,預設為null    )
     * @param  int     $recordBegin   從某項記錄開始查詢(可選引數,預設情況為0,從第一條記錄開始查詢)
     * @param  int     $recordLength  待查詢記錄的個數(可選引數,預設情況為所有記錄)
     * @param  string  $sortCol       待排序的欄位名(可選引數,預設情況為不排序)
     * @param  boolean $desc          是否為降序排序(可選引數,預設為升序排序)
     * @return array                  有結果集組成的二維陣列(每個元素為關聯陣列,代表一條記錄)
     */
    public function select($tableName, Array $condition = null,
                          $recordBegin = 0,$recordLength = 0,$sortCol = null,
                          $desc = false)
    {
        //構造SQL 語句
        $sql = "SELECT * FROM {$tableName}";
        //傳入的條件引數為真並且是關聯陣列
        if ($condition) {
            if (!self::isAssocArray($condition)) {
                //若不是關聯陣列
                throw new Exception(`必須傳入一個關聯陣列的條件`);
            }else{
                //遍歷條件陣列,構造條件語句
                $sql .= $this->generateWhere($condition);
            }
        }
        //處理是否排序
        if ($sortCol) {
                $sql .= " ORDER BY {$sortCol}"; 
        }
        //處理是否降序
        if ($desc) {
            $sql .= " DESC";
        }
        //處理記錄的個數 (若處理的記錄個數不為 0)
        if (0 != $recordLength) {
            $sql .= " limit {$recordBegin} ,{$recordLength}";
        }else if(0 != $recordBegin){
            $sql .= " limit {$recordBegin}";
        }

        //執行SQL 語句
        $this->_result = @mysql_query($sql);

        if (!$this->_result) {
                throw new Exception("執行SQL語句出錯". mysql_error());
        }
        //獲得查詢結果
        $rows = array();
        while ($row = mysql_fetch_assoc($this->_result)) {
            $rows[] = $row;
        }
        //釋放結果集
        $this->freeResult();
        //返回結果集組成的關聯陣列
        return $rows;
    }

    public function delete($tableName ,Array $condition)
    {
        //構造SQL語句
        $query = "DELETE FROM {$tableName} ";
        //由條件陣列,構造刪除條件
        if (!self::isAssocArray($condition)) {
            //若不是關聯陣列
            throw new Exception("必須傳入一個關聯陣列的條件");        
        }else{
            $query .=  $this->generateWhere($condition);
        }

        //執行SQL語句
        $result = @mysql_query($query);

        if (!$this->_result) {
                throw new Exception("執行SQL語句出錯".mysql_error());
        }
        //返回受影響個數
        return mysql_affected_rows();
    }

    /**
     * insert()
     * @param  string $tableName 待插入的資料表名
     * @param  Array  $records   帶插入的記錄所組成的二維陣列
     * @return int               所受影響的行數
     */
    public function insert($tableName, Array $records)
    {
        //構造SQL語句
        $query = "INSERT INTO {$tableName} VALUES";
        //待處理插入的記錄陣列
        $query .= ` (`;
        foreach($records as $red){
            //處理每一條插入記錄
            //生成記錄資訊
            foreach($red as $value){
                if (is_string($value) && $value !== `null` 
                    && $value !== `now()` ) {
                    $query .= "`{$value}`,";
                }else{
                    $query .= "{$value}, ";
                }
            }
            //除去value的最後 字元連線 ,
            $query = rtrim($query, `,`);
            //資料項SQL 語句的閉合
            $query .= `), (`;
        }
        $query .= `)`;
        $query = rtrim(rtrim(rtrim($query, `()`)), `,`);
        //echo $query;
        //echo "<br/>";
        //執行SQL 語句
        $this->_result = @mysql_query($query);

        if(!$this->_result){
            throw new Exception("插入SQL 語句出錯". mysql_error());        
        }
        //獲得插入記錄的最大自增索引
        $this->insertId = @mysql_insert_id();
        //返回受影響的個數
        return mysql_affected_rows();
    }

    public function update($tableName,Array $condition, Array $newRecord)
    {
        //構造SQL語句
        $query = "UPDATE {$tableName} SET ";
        //
        if (!self :: isAssocArray($newRecord)) {
            throw new Exception(`記錄的新值必須傳入一個關聯陣列的條件`);
        } else {
            //生成記錄資訊
               foreach ($newRecord as $key => $value) {
                   $nKey = " {$key} = ";
                if (is_string($value) && 
                    ($value !== `null`) && ($value !== `now()`)) { //若$value為字串
                    $nKey .= "`{$value}`,";
                } else {
                       $nKey .= "{$value},";
                   }
               }
               $nKey = rtrim($nKey, `,`);
               $query .= $nKey;
        }
        //由傳入的條件陣列,構造更新條件
        if (!self :: isAssocArray($condition)){ //若不為關聯陣列
            throw new Exception(`必須傳入一個關聯陣列的條件`);
        } else {
            $query .= $this->generWhere($condition);
        }
        //執行SQL語句
        $result = @mysql_query($query);
        if (!$this->_result) {
            throw new Exception(`執行SQL語句出錯.` . mysql_error());
        }
        //返回受影響個數
        return mysql_affected_rows();
    }
    /**
     * selectAll()
     *
     * 獲得資料表中的所有記錄的所有欄位
     * 
     * @param  string $tableName 待查詢的資料表名
     * @return array             所有記錄組成的一個二維陣列(每個元素為一個關聯陣列,代表一條記錄)
     */
    public function selectAll($tableName)
    {
        return $this->select($tableName);
    }

    /**
     * selectById
     *
     * 通過主鍵獲得某一條記錄,主鍵由可選引數傳入
     * 
     * @param  string  $tableName 資料表名
     * @param  integer $id        獲得記錄的主鍵ID值 (可選引數預設值ID為1)
     * @param  string  $key       主鍵的欄位名(可選引數,預設為ID)
     * @return array              所獲得記錄產生的關聯陣列
     */
    public function selectById($tableName, $id = 1,$key = `id`)
    {
        //構造query語句
        $query = "SELECT * FROM {$tableName} WHERE {$key} = {$id}";
        //執行SQL 語句
        $this->_result = @mysql_query($query);
        if (!$this->_result) {
            throw new Exception("執行主鍵查詢出錯".mysql_error());            
        }
        //獲得查詢結果
        if (1 != @mysql_num_rows($this->_result)) {
            throw new Exception("主鍵記錄查詢出現多條" . mysql_error());            
        }

        $rows = mysql_fetch_assoc($this->_result);
        //釋放結果集
        $this->freeResult();
        //返回結果集組成的關聯陣列
        return $rows;
    }

    /**
     * selectBySql()
     * 
     * 通過傳入的SQL語句,獲得查詢結果
     * 
     * @param  string $query  待查詢的SQL語句
     * @return array $rows    所有記錄組成的一個二維陣列(每個元素為關聯陣列,代表一條記錄)
     */
    public function selectBySql($query)
    {
        //執行SQL語句
        $this->_result = @mysql_query($query);
        if (!$this->_result) {
            throw new Exception(`執行SQL語句出錯.` . mysql_error());
        }
        //獲得查詢結果
        $rows = array();
        while ($row = mysql_fetch_assoc($this->_result)) {
            $rows[] = $row;
        }
        //釋放結果集
        $this->freeResult();
        //返回結果集組成的關聯陣列
        return $rows;
    }

    /**
     * setCharset
     * 
     * 設定Mysql資料庫顯示字元編碼,由傳入引數決定字元編碼
     * 
     * @param string $charset 待設定的字元編碼(可選引數,預設為UTF8)
     * @return null 無
     */
    private function setCharset($charset = `UTF-8`)
    {
        if ($this->_dbConnect) {
            mysql_query("set names {$charset}",$this->_dbConnect);
        }
    }

    /**
     * generateWhere()
     *由傳入的條件陣列,構造where子句
     * 
     * @param  Array  $condition 由條件語句組成的關聯陣列的
     * @return string            構造生成的Where語句字串
     */
    private function generateWhere(Array $condition)
    {
        $con = "WHERE";

        foreach($condition as $key => $value){
            if (is_string($value)) {
                $con .= "{$key} = `{$value}` and"; 
            }else{
                $con .= "{$key} = {$value}";
            }
        }
        $con = rtrim($con ,`and`);
        return $con;
    }

    /**
     * freeResult
     * 
     * 釋放MySQL結果集資源
     * 
     * @param null 無
     * @return null 無
     */
    public function freeResult()
    {
        if ($this->_result) {
            if (!@mysql_free_result($this->_result)) {
                throw new Exception("釋放結果集出錯" . mysql_error());
            }
            $this->_result = null;
        }
    }
}

相關文章