1. 程式人生 > >PHP mysql client封裝

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(), '請先登入!');
    }
*/