PHP mysql client封装

config1.inc.php

$CONFIG_DATABASE_TXL = array(
    #array('127.0.0.1', 'root', '', 'he_txl','3306')
    array('127.0.0.1', 'aspire_txl', 'd90wBE[wc', 'he_txl', '3306')
);

DB.class.php

<?php
/**
 * 数据库操作 (PDO)
 * 
 */

class DB {
    
    private static $mConnection = array ();
    private static $mInstance = array ();
    
    private $_lastConnect = null;
    private $_connection = array ();
    private $_config = array ();
    
    /**
     * see @BuildCondition 
     */
    private static $_params = array ();
    
    /**
     * 获取唯一实例
     *
     * @param array config     db config param
     * @return instance of object
     */
    static function Instance($config = array()) {
        $key = serialize ( $config );
        
        if (! isset ( self::$mInstance [$key] ) or empty ( self::$mInstance [$key] ) or empty ( self::$mConnection ))
            self::$mInstance [$key] = new DB ( $config );
        
        return self::$mInstance [$key];
    }
    
    /**
     * 构造方法
     */
    private function __construct($config = array()) {
        $this->_config = $config;
        $this->Connect ();
    }
    
    function Connect() {
        if (! empty ( $this->_connection ))
            return;
        
        $option = array (PDO::ATTR_EMULATE_PREPARES => true, PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES 'utf8'" );
        
        $config = $this->_config;
        foreach ( $config as $i => $database ) {
            $dsn = isset ( $database [4] ) ? "mysql:dbname={$database[3]};host={$database[0]};port={$database[4]}" : "mysql:dbname={$database[3]};host={$database[0]}";
            try {
                $this->_connection [$i] = new PDO ( $dsn, $database [1], $database [2], $option );
            } catch ( Exception $e ) {
                throw new Exception ( 'Connect ' . $dsn . ' failed: ' . $e->getMessage () );
            }
        }
    }
    
    /**
     * 析构方法
     */
    function __destruct() {
        $this->Close ();
    }
    
    /**
     * 关闭
     */
    function Close() {
        $this->_connection = array ();
    }
    
    /**
     * 获取最后插入ID
     */
    function GetInsertId() {
        $i = isset ( $this->_lastConnect ) ? $this->_lastConnect : 0;
        return is_object ( $this->_connection [$i] ) ? ( int ) $this->_connection [$i]->lastInsertId () : false;
    }
    
    /**
     * get db connection
     *
     * @param bool $isSelect 指定db
     * @return object
     */
    private function _getConn($isSelect = false) {
        $i = rand ( 0, count ( $this->_config ) - 1 );
        $this->_lastConnect = ($isSelect && $i) ? $i : 0;
        if (! is_object ( $this->_connection [$this->_lastConnect] ))
            $this->Connect ();
        $conn = $this->_connection [$this->_lastConnect];
        return $conn;
    }
    
    /**
     * 组建QueryCondition
     *
     * @param mix $condition;
     * @param string $logic, optional
     * @return string $condition
     */
    static function BuildCondition($condition = array(), $logic = 'AND') {
        if (is_string ( $condition ) || is_null ( $condition ))
            return $condition;
        
        $logic = strtoupper ( $logic );
        $content = null;
        foreach ( $condition as $k => $v ) {
            $v_str = ' ? ';
            $v_connect = '=';
            
            if (is_numeric ( $k )) {
                $content .= ' ' . $logic . ' (' . self::BuildCondition ( $v ) . ')';
                continue;
            }
            
            $maybe_logic = strtoupper ( $k );
            if (in_array ( $maybe_logic, array ('AND', 'OR' ) )) {
                $content .= $logic . ' (' . self::BuildCondition ( $v, $maybe_logic ) . ')';
                continue;
            }
            
            if (is_numeric ( $v )) {
                self::$_params [] = $v;
            } else if (is_null ( $v )) {
                $v_connect = ' IS ';
                $v_str = 'NULL';
            } else if (is_array ( $v ) && ($c = count ( $v ))) {
                if (1 < $c) {
                    self::$_params = array_merge ( self::$_params, $v );
                    $v_connect = 'IN(' . join ( ',', array_fill ( 0, $c, '?' ) ) . ')';
                    $v_str = '';
                } else if (empty ( $v )) {
                    $v_str = $k;
                    $v_connect = '<>';
                } else {
                    $tmp_keys = array_keys ( $v );
                    $v_connect = array_shift ( $tmp_keys );
                    if (is_numeric ( $v_connect ))
                        $v_connect = '=';
                    $tmp_values = array_values ( $v );
                    $v_s = array_shift ( $tmp_values );
                    
                    if (is_array ( $v_s )) {
                        $v_str = 'IN (' . join ( ',', array_fill ( 0, count ( $v_s ), '?' ) ) . ')';
                        self::$_params = array_merge ( self::$_params, $v_s );
                    } else {
                        self::$_params [] = $v_s;
                    }
                
                }
            } else {
                self::$_params [] = $v;
            }
            
            $content .= " $logic `$k` $v_connect $v_str ";
        
        }
        
        $content = preg_replace ( '/^\s*' . $logic . '\s*/', '', $content );
        $content = preg_replace ( '/\s*' . $logic . '\s*$/', '', $content );
        $content = trim ( $content );
        
        return $content;
    }
    
    /**
     * 根据条件获取一条记录
     * @param string $table 表名
     * @param mix $condition 条件
     * @param array $option 查询选项
     * @return record
     */
    public function GetTableRow($table, $condition, $options = array()) {
        return $this->LimitQuery ( $table, array ('condition' => $condition, 'one' => isset ( $options ['one'] ) ? $options ['one'] : true, 'select' => isset ( $options ['select'] ) ? $options ['select'] : '*' ) );
    }
    
    /**
     * 根据条件获取有限条数记录
     * @param string $table 表名
     * @param array $options 查询选项
     $options 可以包含 cache 选单,表示记录cache时间
     * @return array of record
     */
    function LimitQuery($table, $options = array()) {
        return $this->DBLimitQuery ( $table, $options );
    }
    
    /**
     * 根据条件获取有限条数记录,从库中查询,并进行缓存 
     *
     * @param string $table 表名
     * @param array $option 查询选项
     * @return array of record
     */
    function DBLimitQuery($table, $options = array()) {
        $condition = isset ( $options ['condition'] ) ? $options ['condition'] : null;
        $one = isset ( $options ['one'] ) ? $options ['one'] : false;
        $offset = isset ( $options ['offset'] ) ? abs ( intval ( $options ['offset'] ) ) : 0;
        
        if ($one)
            $size = 1;
        else
            $size = isset ( $options ['size'] ) ? abs ( intval ( $options ['size'] ) ) : null;
        
        $order = isset ( $options ['order'] ) ? $options ['order'] : null;
        $select = isset ( $options ['select'] ) ? $options ['select'] : '*';
        
        $condition = self::BuildCondition ( $condition );
        $condition = (null == $condition) ? null : "WHERE $condition";
        
        if ($one)
            $limitation = " LIMIT 1 ";
        else
            $limitation = $size ? "LIMIT $offset,$size" : null;
        
        $sql = "SELECT $select FROM `$table` $condition $order $limitation";
        return $this->GetQueryResult ( $sql, $one, self::$_params );
    }
    
    /**
     * 执行真正的数据库查询
     * @param string $sql
     * @param bool $one 是否单条记录
     * @return array of $record
     */
    function GetQueryResult($sql, $one = true, array $params = array()) {
        $ret = array ();
        $stmt = $this->Execute ( $sql, $params );
        if (! is_object ( $stmt )) {
            error_log ( 'Error: bad sql - ' . $sql );
            error_log ( 'Error: bad sql - ' . var_export ( $params, true ) );
            return array ();
        } else {
            return $one ? $stmt->fetch () : $stmt->fetchAll ();
        }
    }
    
    /**
     * 插入一条记录 Alias of method: Insert
     * @param string $table 表名
     * @param array $condition 记录
     * @return int $id
     */
    function SaveTableRow($table, $condition) {
        return $this->Insert ( $table, $condition );
    }
    
    /**
     * 插入一条记录
     * @param string $table 表名
     * @param array $condition 记录
     * @return int $id
     */
    function Insert($table, $condition, $type = 0) {
        //print_r($condition);
        $content = null;
        $sql = "INSERT INTO `$table` 
                (`" . join ( '`,`', array_keys ( $condition ) ) . '`) 
                values (' . join ( ',', array_fill ( 0, count ( $condition ), '?' ) ) . ')';

        $stmt = $this->Execute ( $sql, array_values ( $condition ) );
//        Log::ImageErrorLog($sql);
        if (1 == $type) { //用于不是自增id时的判断
            return is_object ( $stmt );
        }
        $insertId = $this->GetInsertId ();
        return $insertId;
    }
    
    /**
     * 删除一条记录 Alias of method: Delete
     * @param string $table 表名
     * @param array $condition 条件 
     * @return int $id
     */
    function DelTableRow($table = null, $condition = array()) {
        return $this->Delete ( $table, $condition );
    }
    
    /**
     * 删除一条记录
     * @param string $table 表名
     * @param array $condition 条件 
     * @return int $id
     */
    function Delete($table = null, $condition = array()) {
        if (null == $table || empty ( $condition ))
            return false;
        
        $condition = self::BuildCondition ( $condition );
        $condition = (null == $condition) ? null : "WHERE $condition";
        $sql = "DELETE FROM `$table` $condition";
        $flag = $this->Execute ( $sql, self::$_params );
        return $flag;
    }
    
    function Execute($sql, array $params = array(), $retry = 0) {
        $conn = $this->_getConn ();
        $sth = $conn->prepare ( $sql );
        if (! is_object ( $sth ))
            throw new Exception ( 'Error: bad sql' );
        $sth->setFetchMode ( PDO::FETCH_ASSOC );

        $result = empty ( $params ) ? $sth->execute () : $sth->execute ( array_values ( $params ) );

        //pdo error info
        //$arr = $sth->errorInfo();
        //print_r($arr);
        
        if (($sth->errorCode () == 2006) and ! $retry) {
            $this->Close ();
            $this->Execute ( $sql, $params, $retry = 1 );
        }

        self::$_params = array ();
        if (false == $result) {
            $this->Close ();
            return false;
        }
        
        return $sth;
    }
    
    /**
     * 更新一条记录
     * @param string $table 表名
     * @param mix $id 更新条件 
     * @param mix $updaterow 修改内容
     * @param string $pkname 主键 
     * @return boolean
     */
    function Update($table = null, $id = 1, $updaterow = array(), $pkname = 'id') {
        if (null == $table || empty ( $updaterow ) || null == $id)
            return false;
        
        if (is_array ( $id ))
            $condition = self::BuildCondition ( $id );
        else
            $condition = "`$pkname`='$id'";
        
        $sql = "UPDATE `$table` SET ";
        $content = null;
        $updates = array ();
        $v_str = '?';
        
        foreach ( $updaterow as $k => $v ) {
            if (is_array ( $v )) {
                $str = $v [0]; //for 'count'=>array('count+1');
                $content .= "`$k`=$str,";
            } else {
                $updates [] = $v;
                $content .= "`$k`=$v_str,";
            }
        }
        
        $content = trim ( $content, ',' );
        $sql .= $content;
        $sql .= " WHERE $condition";
        $result = $this->Execute ( $sql, array_merge ( $updates, self::$_params ) );
        
        return is_object ( $result ) ? $result->rowCount () : false;
    }
    
    /**
     * 是否存在符合条件的记录
     * @param string $table 表名
     * @param array $condition
     * @param boolean $returnid 是否返回记录id
     * @return mixed (int)id /(array)record
     */
    function Exist($table, $condition = array(), $returnid = true, $order = '') {
        $row = $this->LimitQuery ( $table, array ('condition' => $condition, 'one' => true, 'order' => $order ) );
        
        if ($returnid)
            return empty ( $row ) ? false : (isset ( $row ['id'] ) ? $row ['id'] : true);
        else
            return empty ( $row ) ? array () : $row;
    }
    
    static function CheckInt(&$id, $is_abs = false) {
        if (is_array ( $id )) {
            foreach ( $id as $k => $o )
                $id [$k] = self::CheckInt ( $o );
            return $id;
        }
        
        if (! is_int ( $id ))
            $id = intval ( $id );
        
        if (0 > $id && $is_abs)
            return abs ( $id );
        else
            return $id;
    }
    
    /**
     * 检查是否DB用于的Array
     * @param mix $arr
     * @return int $arr
     */
    static function CheckArray(&$arr) {
        if (! is_array ( $arr )) {
            if (false === $arr)
                $arr = array ();
            else
                settype ( $arr, 'array' );
        }
        return $arr;
    }
    
    public function Query($sql, $isSelect = false) {
        $result = $this->_getConn ( $isSelect )->query ( $sql );
        if ($result)
            return $result;
        
        self::Close ();
        return false;
    }
}

getActivity.php

<?php

/**
 * 多方电话h5 - 获取运营活动列表接口
 */
$action = '多方电话h5_获取运营活动列表';
include_once '../api_driver.php';
include_once 'config.php';

$st = Login::getLoginCookie('mobile');
if ($st) {
    $ret = CenAuth::validate($st);
    if (isset($ret['error_code']) && $ret['error_code'] == 0) {
        $mobile = $ret['data']['mobile'];
    } else {
        $mobile = '';
    }
} else {
    $mobile = '';
}

$db = DB::Instance($CONFIG_DATABASE_TXL);
$adv_list = $db->GetQueryResult('SELECT `title`, `url`, `image` FROM `h5dfdh` where 1=1', FALSE);

foreach ($adv_list as $k => &$value) {
    if ($_SERVER['HTTPS']) {
        $value['image'] = IMGURL_HTTPS . $value['image'];
    } else {
        $value['image'] = IMGURL . $value['image'];
    }
}

$data = $adv_list;
json_result(0, $data, 'ok');
/*
    if ($mobile) {
        $data = array(array('title'=>'H5版多方通话', 'url'=>'https://txl.cytxl.com.cn/html5/multi-party-call/static/img/img-intro-advertise.f102fb3.png', 'image'=>'https://txl.cytxl.com.cn/html5/multi-party-call/static/img/img-intro-advertise.f102fb3.png'));
        json_result(0, $data, 'ok');
    } else {
        json_result(-1, array(), '请先登录!');
    }
*/

猜你喜欢

转载自www.cnblogs.com/hnhycnlc888/p/9889499.html