No-PDO-Models-MySQL數據庫層抽象類 - 實現

數據庫抽象層實現 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;
        }
    }
}
相關文章
相關標籤/搜索