-
-
/** - * 데이터베이스 PDO 운영
- */
- class MysqlPdo {
- public static $PDOStatement = null;
- /**
- * 데이터베이스 연결 매개변수 구성
- * @var array
- * @access public
- */
- public static $config = array();
- /**
- * 영구 연결 사용 여부
- * @var bool
- * @access public
- */
- public static $pconnect = false;
- /**
- * 오류 메시지
- * @var string
- * @access public
- */
- public static $error = '';
- /**
- * 싱글톤 모드, Pdo 클래스의 유일한 인스턴스와 데이터베이스의 연결 리소스를 저장합니다.
- * @var object
- * @access public
- */
- protected static $link;
- /**
- * 데이터베이스 연결 여부
- * @var bool
- * @access public
- */
- public static $connected = false;
- /**
- * 데이터베이스 버전
- * @var string
- * @access public
- */
- public static $dbVersion = null;
- /**
- * 현재 SQL 문
- * @var string
- * @access public
- */
- public static $queryStr = ' ';
- /**
- * 마지막으로 삽입된 레코드의 ID
- * @var 정수
- * @access public
- */
- public static $lastInsertId = null;
- /**
- * 영향을 받은 레코드 수를 반환합니다.
- * @var 정수
- * @access public
- */
- public static $numRows = 0;
- // 트랜잭션 명령어 수
- public static $transTimes = 0;
- /**
- * 생성자,
- * @param $dbconfig 데이터베이스 연결 관련 정보, array('ServerName', 'UserName', 'Password', 'DefaultDb', 'DB_Port', 'DB_TYPE')
- */
- 공용 함수 __construct($dbConfig=''){
- if (!class_exists('PDO') ) self::throw_Exception("지원되지 않음: PDO");
- //매개변수가 전송되지 않으면 기본 데이터 정의가 사용됩니다
- if (!is_array($dbConfig)) {
- $dbConfig = 배열(
- '호스트 이름' => DB_HOST,
- '사용자 이름' => DB_USER,
- '비밀번호' => DB_PWD,
- '데이터베이스' => DB_NAME,
- '호스트 포트' => ; DB_PORT,
- 'dbms' => DB_TYPE,
- 'dsn' => DB_TYPE.":host=".DB_HOST.";dbname=".DB_NAME
- );
- }
- if(empty($dbConfig['hostname'])) self::throw_Exception("데이터베이스 구성이 정의되지 않음");
- self::$config = $dbConfig;
- if(empty( self:: $config['params'])) self::$config['params'] = array();
- /**************************************멋진 분배기************ *******************************/
- if (!isset(self::$ link) ) {
- $configs = self::$config;
- if(self::$pconnect) {
- $configs['params'][constant('PDO::ATTR_PERSISTENT')] = true;
- }
- {
- self::$link = new PDO( $configs['dsn'], $configs['username'], $configs['password'],$configs[ 'params' 시도 ]);
- } catch (PDOException $e) {
- self::throw_Exception($e->getMessage());
- }
- if(!self::$link ) {
- self::throw_Exception('PDO 연결 오류');
- false 반환;
- }
- self::$link->exec('SET NAMES '.DB_CHARSET);
- self: :$dbVersion = self::$link->getAttribute(constant("PDO::ATTR_SERVER_INFO"));
- // 연결을 성공적으로 표시
- self::$connected = true;
- // 데이터베이스 연결 구성 정보 등록 취소
- unset($configs);
- }
- return self::$link;
- }
- /**
- * 쿼리 결과 해제
- * @access 함수
- */
- 정적 함수 무료 () {
- self::$PDOStatement = null;
- }
- /************************/
- /* 데이터베이스 작업*/
- /************************/
- /**
- * 모든 쿼리 데이터 가져오기
- * @access 함수
- * @return 배열
- */
- 정적 함수 getAll($sql=null) {
- if($sql != null)
- {
- self::query($sql) ;
- }
- //데이터 세트 반환
- $result = self::$PDOStatement->fetchAll(constant('PDO::FETCH_ASSOC'));
- return $result;
- }
- /**
- * 쿼리 결과 가져오기
- * @access 함수
- * @param string $sql SQL 명령
- * @param 정수 $seek 포인터 위치
- * @return 배열
- */
- 정적 함수 getRow($sql=null) {
- if($sql != null)
- {
- self::query($sql ) ;
- }
- // 배열 세트 반환
- $result = self::$PDOStatement->fetch(constant('PDO::FETCH_ASSOC'),constant('PDO::FETCH_ORI_NEXT')) ;
- return $result;
- }
- /**
- * SQL 문을 실행하여 쿼리 또는 작업 수행을 자동으로 판단
- * @access 함수
- * @param string $sql SQL 명령
- * @return 혼합
- */
- 정적 함수 doSql($sql='') {
- if(self::isMainIps($sql) ) {
- return self::execute($sql);
- }else {
- return self::getAll($sql);
- }
- }
- /**
- * 지정된 ID를 기준으로 테이블의 레코드 검색(단일 테이블 작업에만 해당)
- * @access 함수
- * @param 정수 $priId 기본 키 ID
- * @param string $tables 데이터 테이블 이름
- * @param string $fields 필드 이름
- * @return ArrayObject 테이블 레코드
- */
- 정적 함수 findById($tabName,$priId,$fields='*'){
- $sql = 'SELECT %s FROM %s WHERE id=%d';
- self 반환: : getRow(sprintf($sql, self::parseFields($fields), $tabName, $priId));
- }
- /**
- * 尋找記錄
- * @access function
- * @param string $tables 資料表名
- * @param mixed $where 查詢條件
- * @param string $fields 欄位名稱
- * @param string $order 排序
- * @param string $limit 取多少條資料
- * @param string $group 分組
- * @param string $having
- * @param boolean $lock 是否加鎖
- * @return ArrayObject
- */
- 靜態函數 find($tables,$where="",$fields='*',$order=null,$limit=null,$group=null,$ having=null) {
- $sql = 'SELECT '.self::parseFields($fields)
- .' FROM '.$tables
- .self::parseWhere($where)
- .self::parseGroup($group)
- .self::parseHaving($having)
- .self::parseOrder( $order)
- .self::parseLimit($limit);
- $dataAll = self::getAll($sql);
- if(count($dataAll)==1){$rlt=$ dataAll[0];}else{$rlt=$dataAll;}
- return $rlt;
- }
- /**
- * 插入(單一)記錄
- * @access function
- * @param mixed $data 資料
- * @param string $table 資料表名
- * @return false | integer
- */
- function add($data,$table) {
- //過濾提交資料
- $data=self::filterPost($table,$data);
- foreach ($data as $key=>$val){
- if(is_array( $ val) && strtolower($val[0]) == 'exp') {
- $val = $val[1]; // 使用表達式 ???
- }elseif (is_scalar($val)){
- $val = self::fieldFormat($val);
- }else{
- //刪除複合物件
- 繼續;
- }
- $data[$key] = $val;
- }
- $fields = array_keys($data);
- array_walk($fields, array($this, 'addSpecialChar'));
- $fieldsStr = implode(',', $fields);
- $values = array_values($data);
- $valuesStr = implode(',', $values);
- $sql = '插入'.$table.' ('.$fieldsStr.') VALUES ('.$valuesStr.')';
- return self::execute($sql);
- }
- /**
- * 更新記錄
- * @access function
- * @param mixed $sets 資料
- * @param string $table 資料表名
- * @param string $where 更新條件
- * @param string $limit
- * @param string $order
- * @return false | integer
- */
- 靜態函數update($sets,$table,$where,$limit=0,$order='') {
- $sets = self::filterPost($table,$sets);
- $sql = '更新「.$表」。 self::execute($sql );
- }
- /**
- * 儲存某個欄位的值
- * @access function
- * @param string $field 要儲存的欄位名稱
- * @param string $value 欄位值
- * @param string $ table 資料表
- * @param string $where 儲存條件
- * @param boolean $asString 欄位值是否為字串
- * @return void
- */
- 靜態函式setField($field, $value, $table, $condition="", $asString=false ) {
- //如果有'(' 視為SQL 指令更新否則更新欄位內容為純字串
- if(false === strpos($value,'(') || $asString) $value = '"'.$value .'"';
- $sql = '更新'.$table.' SET '.$field.'='.$value.self::parseWhere($condition);
- 回傳self::execute( $sql);
- }
- /**
- * 刪除記錄
- * @access function
- * @param mixed $where 為條件Map、Array或String
- * @param string $table 資料表名
- * @param string $limit
- * @param string $order
- * @return false | integer
- */靜態函式($where,$table,$limit='',$order='' ) {
- $sql = 'DELETE FROM '.$table.self::parseWhere($where).self::parseOrder($order).self::parseLimit($limit);
- 回傳self::執行($sql);
- }
- /**
- ----------------------------------------------- -----------
- * 修改或儲存資料(僅用於單表操作)
- * 有主鍵ID則為修改,無主鍵ID則為增加
- * 修改記錄:
- ---------------------------------------------- ------------
- * @access function
- ---------------------------- ------------------------------
- * @param $tabName 表名
- * @param $aPost 提交表單的$_POST
- * @param $priId 主鍵ID
- * @param $aNot 要排除的一個字段或數組
- * @param $aCustom 自訂的數組,附加到資料庫中保存
- * @param $isExits 是否已經存在存在:true, 不存在:false
- ------------------------------- ---------------------------
- * @return Boolean 修改或儲存是否成功
- -------- --------------------------------------------------
- */
- 函數saveOrUpdate($tabName, $aPost, $priId="", $aNot="", $aCustom="" , $isExits=false) {
- if(empty($tabName) || !is_array($aPost) || is_int($aNot)) return false;
- if(is_string($aNot) && !empty($aNot)) $aNot = array($aNot);
- if(is_array($aNot) && is_int(key ) ($aNot))) $aPost = array_diff_key($aPost, array_flip($aNot));
- if(is_array($aCustom) ) && is_string(key($aCustom))) $aPost = array_merge($aCustom))) $aPost = array_merge($aCustom))) $aPost = aPostge($aPost , $aCustom);
- if (empty($priId) && !$isExits) { // 新增
- $aPost = array_filter ($aPost, array($this, 'removeEmpty'));
- return self::add($aPost, $tabName);
- }else { //修改
- return self::update($aPost, $tabName, "id=".$priId);
- }
- }
- /**
- * 최신 쿼리의 sql 문 가져오기
- * @access 함수
- * @param
- * @return String 실행된 SQL
- */
- 정적 함수 getLastSql() {
- $link = self::$link;
- if ( !$link ) return false;
- return self::$queryStr;
- }
- /* *
- * 마지막으로 삽입된 ID 가져오기
- * @access 함수
- * @param
- * @return 정수 마지막으로 삽입된 데이터 ID
- */
- 정적 함수 getLastInsId(){
- $link = self::$link;
- if ( !$link ) return false;
- return self::$lastInsertId;
- }
- /**
- * DB 버전 가져오기
- * @access 함수
- * @param
- * @return 문자열
- */
- 정적 함수 getDbVersion(){
- $link = self::$link;
- if ( !$link ) return false;
- return self::$dbVersion;
- }
- /**
- * 데이터베이스 테이블 정보 가져오기
- * @access 함수
- * @return 배열
- */
- 정적 함수 getTables() {
- $info = array();
- if(self::query ("테이블 표시")) {
- $result = self::getAll();
- foreach ($result as $key => $val) {
- $info[$key] = current( $val);
- }
- }
- return $info;
- }
- /**
- * 데이터 테이블의 필드 정보 가져오기
- * @access 함수
- * @return 배열
- */
- 정적 함수 getFields($tableName) {
- //获取数据库联接
- $link = self::$link;
- $sql = "SELECT
- ORDINAL_POSITION ,COLUMN_NAME, COLUMN_TYPE, DATA_TYPE,
- IF(ISNULL(CHARACTER_MAXIMUM_LENGTH), (NUMERIC_PRECISION NUMERIC_SCALE ), CHARACTER_MAXIMUM_LENGTH ) AS MAXCHAR,
- IS_NULLABLE, COLUMN_DEFAULT, COLUMN_KEY, EXTRA, COLUMN_COMMENT
- FROM
- INFORMATION_SCHEMA.COLUMNS
- WHERE
- TABLE_NAME = :tabName AND TABLE_SCHEMA='".DB_NAME."'";
- self::$queryStr = sprintf($sql, $tableName);
- $sth = $link->prepare($sql);
- $sth->bindParam(':tabName', $ tableName);
- $sth->execute();
- $result = $sth->fetchAll(constant('PDO::FETCH_ASSOC'));
- $info = array();
- foreach($result as $key => $val) {
- $info[$val['COLUMN_NAME']] = array(
- '위치' => $val['ORDINAL_POSITION'],
- '이름' => $val[ 'COLUMN_NAME'],
- '유형' => $val['COLUMN_TYPE'],
- 'd_type' => $val['DATA_TYPE'],
- '길이' => ['MAXCHAR'],
- 'notnull' => (strtolower($val['IS_NULLABLE']) == "아니요"),
- 'default' => $val['COLUMN_DEFAULT'],
- '기본' => (strtolower($val['COLUMN_KEY']) == '기본'),
- 'autoInc' => (strtolower($val['EXTRA']) == ' auto_increment'),
- 'comment' => $val['COLUMN_COMMENT']
- );
- }
- // 有错误则抛take异常
- self::haveErrorThrowException();
- $info 반환;
- }
- /**
- * 데이터베이스 닫기
- * @access 함수
- */
- 정적 함수 close() {
- self::$link = null;
- }
- / **
- * SQL 명령 보안 필터링
- * @access 함수
- * @param string $str SQL 명령
- * @return string
- */
- 정적 함수 escape_string($str) {
- return addedlashes($str);
- }
- /************************/
- /* 内part操작 방법 */
- /************************/
- /**
- * 오류가 발생하고 예외가 발생합니다
- * @access 함수
- * @return
- */
- static function haveErrorThrowException() {
- $obj =empty(self::$PDOStatement) ? self::$link : self::$PDOStatement;
- $arrError = $obj->errorInfo();
- if($arrError[0] !== '00000') { // 有错误信息
- self::$error = $arrError[0]."|".$arrError[2]. "
[ SQL ] : ".self::$queryStr." ";
- self::throw_Exception(self::$error);
- false를 반환;
- }
- //主要针对execute()방법법抛出异常
- if(self::$queryStr=='')self::throw_Exception('쿼리가 비어 있었습니다
[ SQL语句 ] :');
- }
- /**
- * where 분석
- * @access 함수
- * @param $where 쿼리 조건 혼합
- * @return 문자열
- */
- 정적 함수 구문 분석($where) {
- $whereStr = '';
- if( is_string($where) || is_null($where)) {
- $whereStr = $where;
- }
- 빈 값 반환($whereStr)?'':' WHERE '.$whereStr;
- }
- /**
- * order 분석
- * @access function
- * @param mixed $order 배제
- * @return string
- */
- 정적 함수 parseOrder($order) {
- $orderStr = '';
- if(is_array($order))
- $orderStr .= ' ORDER BY '.implode(',', $order);
- else if(is_string($order) && !empty($order))
- $orderStr .= ' ORDER BY '.$order;
- return $orderStr;
- }
- /**
- * 제한분할
- * @access 함수
- * @param string $limit
- * @return string
- */
- 정적 함수 parseLimit($limit) {
- $limitStr = '';
- if(is_array($limit) )) {
- if(count($limit)>1)
- $limitStr .= ' LIMIT '.$limit[0].' , '.$limit[1].' ';
- else
- $limitStr .= ' LIMIT '.$limit[0].' ';
- } else if(is_string($limit) && !empty($limit)) {
- $limitStr .= ' LIMIT '.$limit.' ';
- }
- $limitStr 반환
- }
- /**
- * 그룹 분할
- * @access 함수
- * @param 혼합 $group
- * @return 문자열
- */
- 정적 함수 parseGroup($group) {
- $groupStr = '';
- if(is_array($group))
- $groupStr .= ' GROUP BY '.implode(',', $group);
- else if(is_string($group) && !empty($group))
- $groupStr .= ' GROUP BY '.$group;
- empty($groupStr)?'':$groupStr;
- }
- /**
- * have分析
- * @access 함수
- * @param string $having
- * @return string
- */
- 정적 함수parseHaving($having) {
- $havingStr = '';
- if(is_string($having) && !empty($having))
- $havingStr .= ' HAVING '.$having;
- return $havingStr;
- }
- /**
- * 필드 분할
- * @access 함수
- * @param 혼합 $필드
- * @return 문자열
- */
- function parseFields($fields) {
- if(is_array($fields)) {
- array_walk($fields, array($this, 'addSpecialChar'));
- $fieldsStr = implode(',', $fields);
- }else if(is_string($fields) && !empty($fields)) {
- if( false === strpos($fields,'`') ) {
- $fields =explode(',',$fields);
- array_walk($fields, array($this, 'addSpecialChar'));
- $fieldsStr = implode(',', $fields );
- }else {
- $fieldsStr = $fields;
- }
- }else $fieldsStr = '*';
- return $fieldsStr;
- }
- /**
- * 데이터 업데이트 시 호출되는 분석 설정
- * @access 함수
- * @param 혼합 $값
- * @return 문자열
- */
- 비공개 함수 parseSets($sets) {
- $setsStr = '';
- if(is_array($sets)){
- foreach ($sets as $key=> $val){
- $key = self::addSpecialChar($key);
- $val = self::fieldFormat($val);
- $setsStr .= "$key = ".$val. ",";
- }
- $setsStr = substr($setsStr,0,-1);
- }else if(is_string($sets)) {
- $setsStr = $sets;
- }
- return $setsStr;
- }
- /**
- * 필드 서식 지정
- * @access 함수
- * @param 혼합 $value
- * @return 혼합
- */
- 정적 함수 fieldFormat(&$value) {
- if(is_int($value)) {
- $value = intval($value);
- } else if(is_float($value)) {
- $value = floatval($value);
- } elseif(preg_match('/^(w* ( |-|*|/)?w*)$/i',$value)){
- // 支持在字段的值里face直接使用其它字段
- // 例如 (점수 1) (이름)必须包含括号
- $value = $value;
- }else if(is_string($value)) {
- $value = '''.self::escape_string($value).''';
- }
- return $value;
- }
- /**
- *
- 에 따라 필드 및 테이블 이름에 ` 추가* 지침에 사용된 키워드가 mysql에 대해 올바른지 확인
- * @access 함수
- * @param 혼합 $값
- * @return 혼합
- */
- 정적 함수 addSpecialChar(&$value) {
- if( '*' == $value | | false !== strpos($value,'(') || false !== strpos($value,'.') || false !== strpos($value,'`')) {
- //如果包含* 或者 使用了sql方法 则不작处理
- } elseif(false === strpos($value,'`') ) {
- $value = '`'.trim($value).'` ';
- }
- return $value;
- }
- /**
- ---------------------------------- ----------
- * 빈 요소 제거
- ------------- ---- ------------
- * @access 함수
- ---------- ----- ----------------
- * @param 혼합 $ 값
- ---------------------------- ----- -------------
- * @return 혼합
- ---------- ---- -----------------
- */
- 정적 함수 RemoveEmpty($value){
- return !empty($value);
- }
- /**
- * 주로 SELECT, SHOW 및 기타 명령에 대한 쿼리 실행
- * @access 함수
- * @param string $sql sql 명령
- * @return 혼합
- */
- 정적 함수 쿼리($sql='') {
- // 获取数据库联接
- $link = self::$link;
- if ( !$link ) return false;
- self::$queryStr = $sql;
- //释放前次的查询结果
- if ( !empty(self::$PDOStatement) ) self ::free();
- self::$PDOStatement = $link->prepare(self::$queryStr);
- $bol = self::$PDOStatement->execute();
- // 有错误则抛 Out异常
- self::haveErrorThrowException();
- return $bol;
- }
- /**
- * 데이터베이스 연산 방식
- * @access 함수
- * @param string $sql 실행문
- * @param boolean $lock 잠금 여부(기본값은 잠겨 있지 않음)
- * @return void
- 공용 함수 실행($sql='',$lock=false) {
- if(empty($sql)) $sql = $this->queryStr
- return $this->_execute; ($SQL)
- }*/
- /**
- * INSERT, UPDATE, DELETE 실행문
- * @access 함수
- * @param string $sql sql 명령
- * @return 정수
- * /
- 정적 함수 실행($sql='') {
- // 获取数据库联接
- $link = self::$link;
- if ( !$link ) return false;
- self::$queryStr = $sql;
- //释放前次的查询结果
- if ( !empty(self::$PDOStatement) ) self::free();
- $result = $link ->exec(self::$queryStr);
- // 있음 false;
- } else {
- self::$numRows = $result;
- self::$lastInsertId = $link->lastInsertId();
- return self::$numRows;
- }
- }
- /**
- * 데이터베이스 변경 작업인지 여부
- * @access private
- * @param string $query SQL 명령
- * @return boolen 쿼리 작업인 경우 false 반환
- */
- 정적 함수 isMainIps($query) {
- $queryIps = 'INSERT|UPDATE|DELETE|REPLACE|CREATE|DROP|LOAD DATA|SELECT .* INTO|COPY |ALTER|GRANT|REVOKE|LOCK|UNLOCK';
- if (preg_match('/^s*"?(' . $queryIps . ')s /i', $query)) {
- true를 반환합니다.
- }
- false 반환;
- }
- /**
- * POST 제출 데이터 필터링
- * @access private
- * @param 혼합 $data POST 제출 데이터
- * @param string $table 데이터 테이블 이름
- * @return 혼합 $newdata
- */
- 정적 함수 filterPost($table,$data) {
- $table_column = self::getFields( $table);
- $newdata=array();
- foreach($table_column as $key=>$val){
- if(array_key_exists($key,$data) && ($data[$ 키])!==''){
- $newdata[$key] = $data[$key];
- }
- }
- return $newdata;
- }
- / **
- * 거래 시작
- * @access 함수
- * @return void
- */
- 정적 함수 startTrans() {
- //数据rollback 支持
- $link = self::$link;
- if ( !$link ) return false;
- if (self::$transTimes == 0) {
- $link->beginTransaction();
- }
- self::$transTimes ;
- return ;
- }
- /**
- * 비자동 제출 상태에서 쿼리 제출에 사용됩니다.
- * @access 함수
- * @return boolen
- */
- 정적 함수 커밋() {
- $link = self::$link;
- if ( !$link ) return false;
- if (self::$ transTimes > 0) {
- $result = $link->commit();
- self::$transTimes = 0;
- if(!$result){
- self::throw_Exception( self::$error());
- false 반환;
- }
- }
- true 반환;
- }
- /**
- * 트랜잭션 롤백
- * @access 함수
- * @return bolen
- */
- 공개 함수 롤백 () {
- $link = self::$link;
- if ( !$link ) return false;
- if (self::$transTimes > 0) {
- $result = $link->rollback();
- self::$transTimes = 0;
- if(!$result){
- self::throw_Exception(self:: $error());
- false 반환;
- }
- }
- true 반환;
- }
/**
- * 오류 처리
- * @access 함수
- * @return void
- */
- 정적 함수 throw_Exception($err){
- echo '
오류:'.$err.' ';
- }
- }
-
复代码
|