>  기사  >  백엔드 개발  >  Postgresql DB에 대한 액세스 클래스

Postgresql DB에 대한 액세스 클래스

WBOY
WBOY원래의
2016-07-25 09:01:45988검색
이 코드는 직접 사용하기 위한 것이 아니라 단지 아이디어를 제공하기 위한 것입니다. 트리 하위 쿼리, 준비된 문 및 일괄 삽입을 포함하되 이에 국한되지 않는 PG의 다양한 기능에 대한 다양한 지원:

코드는 오랫동안 지속적으로 수정되어 확정된 사항이며 앞으로도 오랫동안 수정되지 않을 예정입니다.
  1. /**
  2. * 일반 DB 접근 클래스, 모든 DB 접근 항목
  3. * PG만 지원 -- 201210
  4. *
  5. * @author Anthony
  6. * 2010-2012 Reserved
  7. */
  8. class DB {
  9. // 쿼리 유형
  10. const SELECT = 1;
  11. const INSERT = 2;
  12. const UPDATE = 3;
  13. const DELETE = 4;
  14. / **
  15. * 진정한 가치
  16. */
  17. const T = 't';
  18. /**
  19. * 잘못된 값
  20. */
  21. const F = 'f';
  22. /**
  23. * Null 값
  24. */
  25. const N = '해당 없음'; //NULL 값
  26. /**
  27. * 값 지정;
  28. * 'f'는 False, 't'는 TRUE, 'N/A'는 NULL 값
  29. *
  30. * @param String $s, Orignal Value
  31. *
  32. * @return 문자열, 특정 값
  33. */
  34. public static function SpecializeValue($s){
  35. if($s === self::N){
  36. NULL 반환;
  37. }
  38. if($s === self::T){
  39. return True;
  40. }
  41. if($s == = self::F){
  42. return False;
  43. }
  44. return $s;
  45. }
  46. /**
  47. * 테이블에 일괄 삽입
  48. * @param String $table_name 테이블 이름
  49. * @param Array $cols 테이블 열
  50. * @param Array $values, 값 데이터 배열
  51. * @ param String/Array $return_cols 반환 열(들), 기본적으로 'id'가 반환됨, 다중 열의 경우 배열
  52. * @param String $db DB 연결 인스턴스 이름
  53. *
  54. * @return Resultset return return_cols의 결과 세트
  55. */
  56. 공개 정적 함수 insert_batch($table_name,$cols,$values,$return_cols='id',$db='default'){
  57. $_sql = ''.self::quote_table($table_name,$에 삽입) db).'('.self::quote_column($cols,$db).') 값 ';
  58. $_vsql = array();
  59. foreach ($values ​​as $value){
  60. $ _vsql[] = '('.self::quote($value).')';
  61. }
  62. $_sql .= implode(',',$_vsql);
  63. $_sql .= ' return '.self::quote_column($return_cols);
  64. return self::query(self::SELECT,$_sql)->execute($db)->as_array ();
  65. }
  66. /**
  67. * Array Data에서 테이블에 삽입하고 컬럼[들]을 반환하면 기본적으로 ID가 반환됩니다.
  68. *
  69. * @param String $table_name Table Name
  70. * @param Array $data Array Data Of 키 값 쌍.
  71. * @param String/Array $return_cols 컬럼[들]을 반환, 기본적으로 'id'가 반환됨, 다중 Column의 경우 Array
  72. * @param String $db DB Connection 인스턴스 이름
  73. *
  74. * @return Boolean/Resultset 반환 열 없이 성공하면 True, 실패하면 False, return_cols가 있으면 열 값입니다.
  75. */
  76. 공개 정적 함수 insert_table($table_name,$data,$return_cols='id',$db='default'){
  77. if (!is_array($data)){
  78. return false;
  79. }
  80. if (is_null($return_cols)){
  81. $_sql = ''.self에 삽입 ::quote_table($table_name,$db).'('.self::quote_column(array_keys($data),$db).') 값 ('.
  82. self::quote(array_values($data), $db).')';
  83. return self::query(self::INSERT,$_sql)->execute($db);
  84. }
  85. //특수 값
  86. $data = array_map('self::specializeValue',$data);
  87. if (is_string($return_cols)){
  88. $_sql = ''.self::quote_table($table_name)에 삽입 ,$db).'('.self::quote_column(array_keys($data),$db).') 값 ('.
  89. self::quote(array_values($data),$db).') '." 반환 ".$return_cols;
  90. $id = self::query(self::SELECT,$_sql)->execute($db)->get($return_cols);
  91. return $id;
  92. }else{
  93. if (is_array($return_cols)){
  94. $ids = implode(',',$return_cols);
  95. $_sql = 'insert into '. self::quote_table($table_name,$db).'('.self::quote_column(array_keys($data),$db).') 값 ('.
  96. self::quote(array_values($data) ,$db).')'." 반환 ".$ids;
  97. $r_ids = self::query(self::SELECT,$_sql)->execute($db)->current();
  98. $r_ids 반환;
  99. }
  100. }
  101. false 반환;
  102. }
  103. /**
  104. * 테이블 데이터 업데이트 및 참조 데이터와 비교
  105. *
  106. * @param String $table_name 테이블 이름
  107. * @param Integer $id 데이터 ID
  108. * @param Array $data Array 키값 쌍의 데이터입니다.
  109. * @param Array $refdata 참조 데이터
  110. * @param String $id_name ID의 컬럼 이름
  111. * @param String $db DB Connection의 인스턴스 이름
  112. *
  113. * @return 정수 영향을 받는 행, 실패하면 거짓!
  114. */
  115. 공개 정적 function update_data($table_name,$id,$data,$refdata,$id_name='id',$db='default'){
  116. if (!is_array($data)){
  117. 새로운 예외 발생( '데이터는 col=>val 쌍 배열이어야 합니다.');
  118. }
  119. foreach($data as $k => $v){
  120. if(is_array($refdata)){
  121. if(isset($refdata[$k])){
  122. if($v == $refdata[$k]){
  123. unset($data[$k]);
  124. }
  125. }
  126. }elseif(is_object($refdata)){
  127. if(isset($refdata->$k)){
  128. if($v == $refdata->$k){
  129. unset($data[$k]);
  130. }
  131. }
  132. }else{
  133. 새로 던지기 예외('refdata 유형 오류');
  134. }
  135. }
  136. //값 특수화
  137. $data = array_map('self::specializeValue',$data);
  138. if(count($data)>0){
  139. return self::update_table($table_name,$id,$data,'id',$db);
  140. }else{
  141. return 0;
  142. }
  143. }
  144. / **
  145. * 참조된 데이터를 확인하지 않고 데이터로 테이블 업데이트
  146. *
  147. * @param String $table_name 테이블 이름
  148. * @param Integer $id 데이터 ID
  149. * @param Array $data Array 키 값 쌍의 데이터입니다.
  150. * @param String $id_name ID의 열 이름
  151. * @param String $db DB Connection의 인스턴스 이름
  152. *
  153. * @return Integer 영향을 받는 행, 실패하면 False !
  154. */
  155. 공개 정적 함수 update_table($table_name,$id,$data,$id_name='id',$db='default'){
  156. if (!is_array($data) ){
  157. return false;
  158. }
  159. $_sql = 'update '.self::quote_table($table_name,$db).' '.self::quote_assoicate($data,'=',',',$db)'를 설정합니다. where '.
  160. self::quote_column($id_name,$db).'='.self::quote($id,$db);
  161. return self::query(self::UPDATE,$_sql )->execute($db);
  162. }
  163. /**
  164. * col =>의 키 값 쌍을 인용하세요. 값
  165. *
  166. * @param 배열 $data, col=>값 쌍
  167. * @param String $concat, 기본값 '='
  168. * @param 문자열 구분 기호, 기본값 ','
  169. * @param String 데이터베이스 인스턴스
  170. *
  171. * @return String
  172. */
  173. 공개 정적 함수 quote_assoicate($data,$concat='=',$delimiter=' ,',$db='default'){
  174. $_sql = '';
  175. $_sqlArray = array();
  176. foreach ($data as $k => $v){
  177. $_sqlArray[] = self::quote_column($k,$db).$concat.self::quote($v,$db);
  178. }
  179. $_sql = implode($delimiter, $_sqlArray);
  180. return $_sql;
  181. }
  182. /**
  183. * 인용 열
  184. *
  185. * @param String $value, 열 이름
  186. * @param String $db, 데이터베이스 인스턴스 이름
  187. */
  188. 공개 정적 함수 quote_column($value,$db='default'){
  189. if(!is_array($value)){
  190. return self::quote_identifier($value,$db);
  191. }else{ //quote_column 배열 및 파열
  192. $_qs = array();
  193. foreach ($value as $ele){
  194. $_qs[] = self::quote_column($ele,$db);
  195. }
  196. $_quote_column_String = implode(',', $_qs);
  197. return $_quote_column_String;
  198. }
  199. }
  200. /**
  201. * 이스케이프할 값을 인용하세요
  202. *
  203. * @param Scalar/Array $value
  204. *
  205. * @return 인용 문자열 또는 배열
  206. */
  207. 공개 정적 함수 quote($value,$db='default'){
  208. if(!is_array($value)){
  209. return Database::instance($db)->quote($value);
  210. }else{ //인용 배열 및 파열
  211. $_qs = array();
  212. foreach ($value as $ele){
  213. $_qs[] = self::quote($ele,$db);
  214. }
  215. $_quoteString = implode(',',$_qs);
  216. return $_quoteString;
  217. }
  218. }
  219. /**
  220. * DB의 이스케이프 문자열
  221. *
  222. * @param string $s 테이블 이름
  223. * @param String $db 데이터베이스 인스턴스 이름
  224. *
  225. * @return String
  226. */
  227. 공개 정적 함수 escape($s, $db='default'){
  228. return Database::instance($db)->escape($s);
  229. }
  230. /**
  231. * Quote 테이블 이름
  232. *
  233. * @param string $s 테이블 이름
  234. * @param String $db 데이터베이스 인스턴스 이름
  235. *
  236. * @return String
  237. */
  238. 공용 정적 함수 quote_table($s,$db='default'){
  239. return Database::instance($db)->quote_table($s);
  240. }
  241. /**
  242. * 열 이름과 같은 데이터베이스 식별자를 인용하세요.
  243. *
  244. * $column = DB::quote_identifier($column,'default');
  245. *
  246. * 식별자 내에서 SQL 메서드를 사용할 수도 있습니다.
  247. *
  248. * / / "column"의 값이 인용됩니다
  249. * $column = DB::quote_identifier('COUNT("column")');
  250. *
  251. * 이 함수에 전달된 개체는 문자열로 변환됩니다. .
  252. * [Database_Query] 개체가 컴파일되어 하위 쿼리로 변환됩니다.
  253. * 다른 모든 개체는 '__toString' 메서드를 사용하여 변환됩니다.
  254. *
  255. * @param mix $value 모든 식별자
  256. * @param String $db, 데이터베이스 인스턴스
  257. * @return string
  258. */
  259. 공개 정적 함수 quote_identifier($value,$db='default'){
  260. return Database::instance($db)->quote_identifier($value);
  261. }
  262. /**
  263. * 데이터베이스 인스턴스에 대한 연결 가져오기
  264. *
  265. * @param String $db 데이터베이스 인스턴스 이름
  266. *
  267. * @return 데이터베이스 인스턴스 연결
  268. */
  269. 공개 정적 함수 getConnection($db = 'default'){
  270. return Database::instance($db)->getConnection();
  271. }
  272. /**
  273. * 현재 레코드의 하위 항목 가져오기
  274. *
  275. * @param String $table 테이블 이름
  276. * @param Bollean $returnSql
  277. * @param Integer $pid 테이블 레코드의 상위 ID
  278. * @param String $idname ID 열 이름
  279. * @param String $pidname 상위 ID 열 이름
  280. * @param String $db 데이터베이스 인스턴스 이름
  281. *
  282. * @return 하위 레코드
  283. */
  284. 공개 정적 함수 getChildren($table,$returnSql = false ,$pid= '0',$idname='id',$pidname= 'pid' ,$db='default'){
  285. $_sql = ''.self::quote_table($table,$db)에서 *를 선택합니다.' 여기서 '.$pidname.'='.self::quote($pid,$db).
  286. " 및 $idname <>".self::quote($pid,$db);
  287. if($returnSql){
  288. return $_sql;
  289. }
  290. $_res = self::query(self::SELECT,$_sql,true)->execute($ db)->as_array();
  291. if($_res){
  292. return $_res;
  293. }else{
  294. return false;
  295. }
  296. }
  297. /**
  298. * 연결을 위한 트리 쿼리, Data의 모든 하위 레코드 순회
  299. *
  300. * @param String $tableName Tablename
  301. * @param Boolean $returnSql Return SQL String if TURE
  302. * @ param String $startWith 트래버스 시작 값
  303. * @param String $idCol ID 열 이름
  304. * @param String $pidCol 상위 ID 열 이름
  305. * @param String $orderCol 순서 열
  306. * @param Integer $maxDepth 트래버스 깊이,
  307. * @param 정수 $level 시작 레벨
  308. * @param String $delimiter 분기 구분 기호
  309. * @param String $db 데이터베이스 구성 인스턴스
  310. *
  311. * @ 레코드/문자열 반환 레코드 배열 또는 SQL 문자열 반환
  312. */
  313. 공개 정적 함수 getTree($tableName,$returnSql=false,$startWith='0',$idCol='id',$pidCol='pid', $orderCol=' id', $maxDepth=0,$level = 0,$delimiter = ';',$db='default'){
  314. $_funcParas = array();
  315. $_funcParas[] = self::quote ($테이블이름,$db); //테이블|뷰
  316. $_funcParas[] = self::quote($idCol,$db); //ID 열
  317. $_funcParas[] = self::quote($pidCol,$db); //상위 ID 열
  318. $_funcParas[] = self::quote($orderCol,$db); //ASC에 의한 기본 순서
  319. $_funcParas[] = self::quote($startWith,$db); //ID 시작
  320. $_funcParas[] = self::quote($maxDepth,$db); //횡단 깊이
  321. $_funcParas[] = self::quote($delimiter,$db); //분기 구분자, 기본값 ';'
  322. $_sql = 'select * from connectby('
  323. .implode(',',$_funcParas).')'
  324. .' as t(id int, pid int, level int, Branch text, pos int)';
  325. if($level > 0){
  326. $_sql .= ' where level >='.self:: quote($level,$db);
  327. }
  328. if($returnSql) return $_sql;
  329. $_res = self::query(self::SELECT,$_sql,true)- >execute($db)->as_array();
  330. if($_res){
  331. return $_res;
  332. }else{
  333. return false;
  334. }
  335. }
  336. /**
  337. * 트랜잭션 시작
  338. *
  339. * @param String $db DB의 인스턴스 이름
  340. *
  341. * @return 결과 집합
  342. */
  343. 공개 정적 함수 시작($db='default'){
  344. return DB::query(self::UPDATE, "BEGIN")-> ;execute($db);
  345. }
  346. /**
  347. * 저장점 정의
  348. *
  349. * @param String $savepoint
  350. *
  351. * @param String $db
  352. */
  353. public static function savepoint($savepoint, $db='default'){
  354. return DB: :query(self::UPDATE, "SAVEPOINT ".$savepoint)->execute($db);
  355. }
  356. /**
  357. * 저장 지점으로 롤백
  358. *
  359. * @param String $savepoint
  360. *
  361. * @param String $db 데이터베이스 인스턴스 이름
  362. */
  363. 공개 정적 함수 롤포인트($savepoint, $db='default'){
  364. return DB::query(self::UPDATE, "ROLLBACK TO ".$savepoint)->execute($db);
  365. }
  366. /**
  367. * 트랜잭션 커밋
  368. * @param String DB 연결
  369. */
  370. 공개 정적 함수 commit($db='default'){
  371. return DB::query(self::UPDATE, "COMMIT") ->execute($db);
  372. }
  373. 공개 정적 함수 롤백($db='default'){
  374. return DB::query(self::UPDATE, "ROLLBACK") ->실행($db);
  375. }
  376. /**
  377. * 해당 유형의 새로운 [Database_Query]를 생성합니다.
  378. *
  379. * // 새로운 SELECT 쿼리 생성
  380. * $query = DB::query(self::SELECT, 'SELECT * FROM users');
  381. *
  382. * // 새로운 DELETE 쿼리 생성
  383. * $query = DB::query(self::DELETE, 'DELETE FROM users WHERE id = 5');
  384. *
  385. * 유형을 지정하면 반환되는 결과가 변경됩니다.
  386. * self::SELECT를 사용하면 [Database_Query_Result]가 반환됩니다.
  387. * self::INSERT 쿼리는 삽입 ID와 행 수를 반환합니다.
  388. * 기타 모든 쿼리의 경우에는 영향을 받은 행이 반환됩니다.
  389. *
  390. * @param 정수 유형: self::SELECT, self::UPDATE 등
  391. * @param string SQL 문
  392. * @param Boolean $as_object 반환 결과 집합 as Object true인 경우 기본값은 FALSE
  393. * @param Array $params SQL의 쿼리 매개변수, 기본 array()
  394. * @param String $stmt_name 쿼리는 True인 경우 준비된 문,
  395. * 다음 경우에 준비된 명령문을 실행합니다. $param은 NULL이 아닙니다
  396. * $param이 NULL일 때 문 준비
  397. *
  398. * @return Database_Query
  399. */
  400. 공개 정적 함수 쿼리($type, $sql = NULL ,$as_object = false,$params = array(),$stmt_name = NULL)
  401. {
  402. return new Database_Query($type, $sql,$as_object,$params,$stmt_name);
  403. }
  404. /**
  405. * Orignal SQL에서 페이지가 매겨진 페이지 가져오기
  406. *
  407. * @param String $sql SQL 쿼리
  408. * @param UTL Object &$page tempalte의 UTL 객체
  409. * @param String $orderBy Order 열 기준, 기본값 'updated desc'
  410. * @param String $dataPro 데이터 속성 이름, 기본값 'data'
  411. * @param String $pagePro Pagnation Frament 속성 이름, 기본값 'pagination'
  412. * @param Array $config 페이지 매김 구성 배열 overider
  413. * @param String $db 데이터베이스 인스턴스 이름, 기본값 'default'
  414. * @param Boolean $as_object TRUE인 경우 데이터를 객체로 채우기, 기본값 TRUE
  415. * @param String $_paginClass 페이지네이션 클래스 이름
  416. * @return 성공하면 True
  417. */
  418. 공개 정적 함수 getPage($_sql,&$page,$orderBy ='업데이트된 설명', $dataPro='data',$pagePro = '페이지 매김',
  419. $config = NULL,$db = '기본값', $as_object= true,$_paginClass='페이지 매김'){
  420. $_csql = '('.$_sql.') st에서 c로 count(1)을 선택합니다.';
  421. $_c = DB::query(self::SELECT,$_csql)->execute($db)->get('c');
  422. if($config){
  423. $config['total_items'] = $_c;
  424. $_pagination = new $_paginClass($config);
  425. }else{
  426. $config = array();
  427. $config[' total_items'] = $_c;
  428. $_pagination = new $_paginClass($config);
  429. }
  430. $_sql .= ' order by '.$orderBy;
  431. if ($_pagination->offset){
  432. $_sql .= ' offset '.$_pagination->offset;
  433. }
  434. $_sql .= 'limit '.$_pagination->items_per_page;
  435. $_data = DB::query(self::SELECT,$_sql,$as_object)->execute($db)->as_array();
  436. if(!$_data){
  437. $page->{$dataPro} = false;
  438. $page->{$pagePro} = false;
  439. false를 반환합니다.
  440. }
  441. $page->{$dataPro} = $_data;
  442. $page->{$pagePro} = $_pagination;
  443. return true;
  444. }
  445. /**
  446. * 하위 역할 모두 가져오기
  447. *
  448. * @param Integer $role_id 정수 사용자 역할 ID
  449. * @param Boolean $quote ture인 경우 SQL 인용, false인 경우 원본 SQL 반환
  450. * @param String $role_table 역할 계층 테이블
  451. * @param Integer $level 트리 탐색 시작 수준
  452. * @param String $db 데이터베이스 인스턴스 이름
  453. * @return SQL String
  454. */
  455. 공개 정적 함수 getRoleTreeSql($role_id,$quote = false,$role_table,$level=0,$db='default'){
  456. $_sql = '('.self::getTree($role_table,true,$role_id,'id','pid','id',
  457. 0, //Maxlength
  458. $level에서 ID 선택, //레벨
  459. ';',$db).') utree';
  460. if(!$quote) return $_sql;
  461. else return '('.$_sql.')';
  462. }
  463. /**
  464. * 하위 개체 및 소유 개체의 개체를 쿼리하기 위한 SQL 문자열 가져오기
  465. * 하위 사용자 역할 트리[CURT]
  466. *
  467. * @param 정수 $role_id 사용자의 역할 ID
  468. * @param 정수 $user_id 사용자 ID
  469. * @param String $role_table 역할 테이블
  470. * @param Boolean $quote ture인 경우 SQL 인용, false인 경우 원래 SQL 반환
  471. * @param String $roleCol 역할 ID 열 이름
  472. * @param String $ownerCol 소유자 ID 열 이름
  473. * @param String $db 데이터베이스 인스턴스 이름
  474. * @return SQL 문자열
  475. */
  476. 공개 정적 함수 getCURTreeSql($role_id,$user_id,$role_table,$quote = true,
  477. $roleCol='role_id',$ownerCol = 'owner_id' ,$db='default'){
  478. $_sql = ' '.$roleCol.' in '.self::getRoleTreeSql($role_id,true,$role_table,
  479. 1, //레벨은 1로 시작
  480. $db). ' 또는 '.$ownerCol.'='.self::quote($user_id,$db);
  481. if(!$quote) return $_sql;
  482. else return '('.$_sql.') ';
  483. }
  484. /**
  485. * 트리 쿼리에서 트리로의 배열
  486. *
  487. * @param Array $eles , self::getTree
  488. 에서 설정된 레코드 * @param String $elename, 노드 요소 이름
  489. * @param String $cldname, 하위 노드 이름
  490. * @param String $delimiter, 분기 구분 기호
  491. *
  492. * @return Object , 데이터의 Tree 개체
  493. */
  494. 공개 정적 함수 array2tree($eles,$elename,$cldname,$delimiter=';'){
  495. if($elename = = $cldname){
  496. throw new Exception('Ele 이름은 cldname과 같습니다!');
  497. }
  498. $rtree = array();
  499. foreach ($eles를 $ele로){
  500. $_branch = $ele->branch;
  501. //Log::debug('branch='.$_branch);
  502. //배열의 깊이
  503. $_깊이 = 폭발($delimiter, $_branch);
  504. if(count($_lengths == 1)){
  505. $_root = $_lengths[0];
  506. }
  507. $_cur = &$rtree;
  508. foreach( $_깊이를 $깊이로){
  509. //노드 생성
  510. if(!isset($_cur[$cldname])){
  511. $_cur[$cldname] = array();
  512. }
  513. if(!isset($_cur[$cldname][$length])){
  514. $_cur[$cldname][$length] = array();
  515. $_cur = &$_cur [$cldname][$깊이];
  516. }else{
  517. $_cur = &$_cur[$cldname][$깊이];
  518. }
  519. }
  520. $_cur[$elename] = $ele;
  521. }
  522. return $rtree[$cldname][$_root];
  523. }
  524. }
复system代码


성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.