ホームページ  >  記事  >  バックエンド開発  >  Postgresql DB のアクセス クラス

Postgresql DB のアクセス クラス

WBOY
WBOYオリジナル
2016-07-25 09:01:45948ブラウズ
このコードは直接使用するためのものではなく、ツリー サブクエリ、プリペアド ステートメント、バッチ挿入など、PG のさまざまな機能のさまざまなサポートを提供するためのものです。

コードは長い間継続的に改訂されており、今後も長期間変更されることはありません。
  1. /**
  2. * 汎用 DB アクセス クラス、すべての DB アクセスのエントリ
  3. * PG のみがサポートされています -- 201210
  4. *
  5. * @author Anthony
  6. * 2010-2012 予約済み
  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 = 'N/A'; //NULL 値
  26. /**
  27. * 値を指定します。
  28. * 'f' は False、't' は TRUE、'N/A' は NULL 値です
  29. *
  30. * @param String $s、元の値
  31. *
  32. * @return String、指定された値
  33. */
  34. public static functionspecializeValue($s){
  35. if($s === self::N){
  36. return 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、values のデータ配列
  51. * @param String/Array $return_cols 戻り列[s] ]、デフォルトでは 'id' が返されます。複数列の配列
  52. * @param String $db DB 接続のインスタンス名
  53. *
  54. * @return Resultsset return_cols の結果セットを返します
  55. */
  56. public static function insert_batch($table_name,$cols,$values,$return_cols='id',$db='default'){
  57. $_sql = 'insert into '.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 .= ' '.self:: を返しますquote_column($return_cols);
  64. return self::query(self::SELECT,$_sql)->execute($db)->as_array();
  65. }
  66. /**
  67. * 配列データからテーブルに挿入し、列[s]を返します。ID はデフォルトで返されます
  68. *
  69. * @param String $table_name テーブル名
  70. * @param Array $data キーと値のペアの配列データ
  71. * @param String/Array $return_cols 戻り列[s]、デフォルトでは 'id' が返されます、複数の列の配列
  72. * @param String $db DB 接続のインスタンス名
  73. *
  74. * @return Boolean/Resultset 戻り列なしで成功した場合は True 、失敗した場合は False、return_cols が提示された場合は列[s]の値。*/
  75. public static function insert_table($table_name,$data,$return_cols='id',$db='default'){
  76. if (!is_array($data)){
  77. return false;
  78. }
  79. if (is_null($ return_cols)){
  80. $_sql = '.self::quote_table($table_name,$db).'('.self::quote_column(array_keys($data),$db).') 値 ('.
  81. self::quote(array_values($data),$db).')';
  82. return self::query(self::INSERT,$_sql)->execute($db);
  83. }
  84. //値を特殊化する
  85. $data = array_map('self::specializeValue',$data);
  86. if (is_string($return_cols)){
  87. $_sql = 'insert into '.self::quote_table($table_name,$db) .'('.self::quote_column(array_keys($data),$db).') 値 ('.
  88. self::quote(array_values($data),$db).')'." を返します。 $return_cols;
  89. $id = self::query(self::SELECT,$_sql)->execute($db)->get($return_cols);
  90. return $id;
  91. }else{
  92. if ( is_array($return_cols)){
  93. $ids = implode(',',$return_cols);
  94. $_sql = '.self::quote_table($table_name,$db) に挿入します。'('.self::quote_column (array_keys($data),$db).') 値 ('.
  95. self::quote(array_values($data),$db).')'." を返します ".$ids;
  96. $r_ids = self: :query(self::SELECT,$_sql)->execute($db)->current();
  97. return $r_ids;
  98. }
  99. }
  100. return false;
  101. }
  102. /**
  103. * テーブルのデータを更新し、参照データと比較します
  104. *
  105. * @param String $table_name テーブル名
  106. * @param Integer $id データのID
  107. * @param Array $data キーと値のペアの配列データ
  108. * @param配列 $refdata 参照データ
  109. * @param String $id_name IDのカラム名
  110. * @param String $db DB接続のインスタンス名
  111. *
  112. * @return Integer Affected Rows,False if failed!
  113. */
  114. public static function update_data($table_name,$id,$data,$refdata,$id_name='id',$db='default'){
  115. if (!is_array($data)){
  116. throw new Exception('データはcol=>valペア配列である必要があります');
  117. }
  118. foreach($data as $k => $v){
  119. if(is_array($refdata)){
  120. if(isset($refdata[$k])){
  121. if($v == $refdata[$k]){
  122. unset($data[$ k]);
  123. }
  124. }
  125. }elseif(is_object($refdata)){
  126. if(isset($refdata->$k)){
  127. if($v == $refdata->$k){
  128. unset($data[$k]);
  129. }
  130. }
  131. }else{
  132. throw newException('refdata type error');
  133. }
  134. }
  135. //値を特殊化します
  136. $data = array_map('self::specializeValue',$data);
  137. if(count($data)>0){
  138. return self::update_table($table_name,$id, $data,'id',$db);
  139. }else{
  140. return 0;
  141. }
  142. }
  143. /**
  144. * 参照先のデータをチェックせずにテーブルをデータで更新します
  145. *
  146. * @param String $table_name テーブル名
  147. * @param Integer $id データのID
  148. * @param Array $data キーと値のペアの配列データ
  149. * @param String $id_name ID のカラム名
  150. * @param String $db DB 接続のインスタンス名
  151. *
  152. * @return Integer Affected Rows,False if failed!
  153. */
  154. public static function update_table($table_name,$id,$data,$id_name ='id',$db='default'){
  155. if (!is_array($data)){
  156. return false;
  157. }
  158. $_sql = 'update '.self::quote_table($table_name,$db) 。」 '.self::quote_assoicate($data,'=',',',$db)' を設定します。 where '.
  159. self::quote_column($id_name,$db).'='.self::quote($id,$db);
  160. return self::query(self::UPDATE,$_sql)-> execute($db);
  161. }
  162. /**
  163. *col => のキーと値のペアを引用符で囲みます。値
  164. *
  165. * @param 配列 $data、col=>値のペア
  166. * @param 文字列 $concat、デフォルト '='
  167. * @param 文字列区切り文字、デフォルト ','
  168. * @param 文字列データベース インスタンス
  169. *
  170. * @return 文字列
  171. */
  172. public static function quote_assoicate($data,$concat='=',$delimiter=',',$db='default'){
  173. $_sql = '';
  174. $_sqlArray = array();
  175. foreach ($data as $k => $v){
  176. $_sqlArray[] = self::quote_column($k,$db).$concat. self::quote($v,$db);
  177. }
  178. $_sql = implode($delimiter,$_sqlArray);
  179. return $_sql;
  180. }
  181. /**
  182. * Cols を引用
  183. *
  184. * @param String $value、列の名前
  185. * @param String $db、データベース インスタンス名
  186. */
  187. public static function quote_column ($value,$db='default'){
  188. if(!is_array($value)){
  189. return self::quote_identifier($value,$db);
  190. }else{ //quote_column 配列と内部分解
  191. $_qs = array();
  192. foreach ($value as $ele){
  193. $_qs[] = self::quote_column($ele,$db);
  194. }
  195. $_quote_column_String = implode(',',$_qs);
  196. return $_quote_column_String;
  197. }
  198. }
  199. /**
  200. * エスケープする値を引用符で囲みます
  201. *
  202. * @param Scalar/Array $value
  203. *
  204. * @return 引用符文字列または配列
  205. */
  206. public static function quote($value,$db='default'){
  207. if(!is_array($value)){
  208. return データベース: :instance($db)->quote($value);
  209. }else{ //配列を引用符で囲んで内部展開します
  210. $_qs = array();
  211. foreach ($value as $ele){
  212. $_qs[] = self ::quote($ele,$db);
  213. }
  214. $_quoteString = implode(',',$_qs);
  215. return $_quoteString;
  216. }
  217. }
  218. /**
  219. * DBのエスケープ文字列
  220. *
  221. * @param string $s テーブル名
  222. * @param String $db データベースインスタンス名
  223. *
  224. * @return String
  225. */
  226. public static functionscape($s,$db='default'){
  227. return Database::instance($db)->escape($s);
  228. }
  229. /**
  230. * テーブル名を引用
  231. *
  232. * @param string $s テーブル名
  233. * @param String $db データベースインスタンス名
  234. *
  235. * @return String
  236. */
  237. public static function quote_table ($s,$db='default'){
  238. return Database::instance($db)->quote_table($s);
  239. }
  240. /**
  241. * 列名などのデータベース識別子を引用符で囲みます。
  242. *
  243. * $column = DB::quote_identifier($column,'default');
  244. *
  245. * 識別子内で SQL メソッドを使用することもできます。
  246. *
  247. * // "column" の値は引用符で囲まれます
  248. * $column = DB::quote_identifier('COUNT("column")');
  249. *
  250. * この関数に渡されたオブジェクトは文字列に変換されます。
  251. * [Database_Query] オブジェクトはコンパイルされ、サブクエリに変換されます。
  252. * 他のすべてのオブジェクトは、「__toString」メソッドを使用して変換されます。
  253. *
  254. * @parammixed $value 任意の識別子
  255. * @param String $db、データベース インスタンス
  256. * @return string
  257. */
  258. public static function quote_identifier($ value,$db='default'){
  259. return Database::instance($db)->quote_identifier($value);
  260. }
  261. /**
  262. * データベースインスタンスの接続を取得
  263. *
  264. * @param String $db データベースインスタンス名
  265. *
  266. * @return データベースの接続
  267. */
  268. public static function getConnection($db = 'デフォルト'){
  269. return Database::instance($db)->getConnection();
  270. }
  271. /**
  272. * 現在のレコードの子を取得します
  273. *
  274. * @param String $table テーブル名
  275. * @param Bollian $returnSql
  276. * @param Integer $pid テーブルレコードの親 ID
  277. * @param String $idname ID カラム名
  278. * @ param String $pidname 親 ID 列名
  279. * @param String $db データベース インスタンス名
  280. *
  281. * @return 子のレコード
  282. */
  283. public static function getChildren($table,$returnSql = false ,$pid= '0',$idname='id',$pidname='pid' ,$db='デフォルト'){
  284. $_sql = 'select * from '.self::quote_table($table,$db)'。 where '.$pidname.'='.self::quote($pid,$db).
  285. " と $idname <>".self::quote($pid,$db);
  286. if($returnSql){
  287. return $_sql;
  288. }
  289. $_res = self::query(self::SELECT,$_sql,true)->execute($db)->as_array();
  290. if($_res){
  291. return $_res;
  292. }else{
  293. return false;
  294. }
  295. }
  296. /**
  297. * Data のすべての子レコードをトラバースするためのツリー クエリ
  298. *
  299. * @param String $tableName Tablename
  300. * @param Boolean $returnSql Return SQL String if TURE
  301. * @param String $startWith Begin valueof traverse
  302. * @ param String $idCol ID 列名
  303. * @param String $pidCol 親 ID 列名
  304. * @param String $orderCol 順序列
  305. * @param Integer $maxDepth トラバースの深さ、
  306. * @param Integer $level 開始レベル
  307. * @ param String $delimiter ブランチの区切り文字
  308. * @param String $db データベース構成インスタンス
  309. *
  310. * @return Record/String レコード配列または SQL の文字列を返す
  311. */
  312. public static function getTree($tableName,$returnSql=false,$startWith= '0',$idCol='id',$pidCol='pid', $orderCol='id', $maxDepth=0,$level = 0,$delimiter = ';',$db='default'){
  313. $_funcParas = array();
  314. $_funcParas[] = self::quote($tableName,$db); //テーブル|ビュー
  315. $_funcParas[] = self::quote($idCol,$db); //ID列
  316. $_funcParas[] = self::quote($pidCol,$db); //親ID列
  317. $_funcParas[] = self::quote($orderCol,$db); //デフォルトの ASC による順序
  318. $_funcParas[] = self::quote($startWith,$db); // ID の開始
  319. $_funcParas[] = self::quote($maxDepth,$db); //トラバースの深さ
  320. $_funcParas[] = self::quote($delimiter,$db); //分岐の区切り文字,default ';'
  321. $_sql = 'select * from connectby('
  322. .implode(',',$_funcParas).')'
  323. .' as t(id int, pid int, level int, Branch text, pos int)';
  324. if($level > 0){
  325. $_sql .= ' where level >='.self::quote($level ,$db);
  326. }
  327. if($returnSql) return $_sql;
  328. $_res = self::query(self::SELECT,$_sql,true)->execute($db)->as_array( );
  329. if($_res){
  330. return $_res;
  331. }else{
  332. return false;
  333. }
  334. }
  335. /**
  336. * トランザクション開始
  337. *
  338. * @param String $db DBのインスタンス名
  339. *
  340. * @return 結果セット
  341. */
  342. public static function begin($db='default'){
  343. return DB::query(self::UPDATE, "BEGIN")->execute($db);
  344. }
  345. /**
  346. * セーブポイントを定義します
  347. *
  348. * @param String $savepoint
  349. *
  350. * @param String $db
  351. */
  352. public static function savepoint($savepoint, $db='デフォルト'){
  353. return DB::query(self::UPDATE, "SAVEPOINT ".$savepoint)->execute($db);
  354. }
  355. /**
  356. * セーブポイントへのロールバック
  357. *
  358. * @param String $savepoint
  359. *
  360. * @param String $db データベース インスタンス名
  361. */
  362. public static function rollpoint ($savepoint, $db='default'){
  363. return DB::query(self::UPDATE, "ROLLBACK TO ".$savepoint)->execute($db);
  364. }
  365. /**
  366. * トランザクションをコミットします
  367. * @param String DB 接続
  368. */
  369. public static function commit($db='default'){
  370. return DB::query(self::UPDATE, "COMMIT")->execute($db);
  371. }
  372. public static function rollback($db='default'){
  373. return DB::query(self::UPDATE, "ROLLBACK")->execute($db);
  374. }
  375. /**
  376. * 指定されたタイプの新しい [Database_Query] を作成します。
  377. *
  378. * // 新しい SELECT クエリを作成します
  379. * $query = DB::query(self::SELECT, 'SELECT * FROM users');
  380. *
  381. * // 新しい DELETE クエリを作成します
  382. * $query = DB::query(self::DELETE, 'DELETE FROM users WHERE id = 5');
  383. *
  384. * 型を指定すると、返される結果が変わります。
  385. * self::SELECT を使用すると、[Database_Query_Result] が返されます。
  386. * self::INSERT クエリは、挿入 ID と行数を返します。
  387. * 他のすべてのクエリについては、影響を受ける行の数が返されます。
  388. *
  389. * @param 整数型: self::SELECT、self::UPDATE など
  390. * @param string SQL ステートメント
  391. * @param Boolean $as_object true の場合は結果セットをオブジェクトとして返し、デフォルトは FALSE
  392. * @param Array $params SQLのクエリパラメータ、デフォルトのarray()
  393. * @param String $stmt_name クエリはTRUEの場合プリペアドステートメントです、
  394. * $paramがNULLでない場合にプリペアドステートメントを実行
  395. * $paramがNULLの場合プリペアドステートメント
  396. *
  397. * @returnデータベース_クエリ
  398. */
  399. public static function query($type, $sql = NULL ,$as_object = false,$params = array(),$stmt_name = NULL)
  400. {
  401. return new Database_Query($ type, $sql,$as_object,$params,$stmt_name);
  402. }
  403. /**
  404. * 元の SQL からページ分割されたページを取得します
  405. *
  406. * @param String $sql SQL クエリ
  407. * @param UTL オブジェクト &$page tempalte の UTL オブジェクト
  408. * @param String $orderBy 列順に並べ替え、デフォルトは「更新された説明」
  409. * @param String $dataPro データ プロパティ名、デフォルト 'data'
  410. * @param String $pagePro Pagnation Framement プロパティ名、デフォルト 'pagination'
  411. * @param Array $config ページネーション設定配列オーバーライダー
  412. * @param String $db データベース インスタンス名、デフォルトは 'default'
  413. * @param Boolean $as_object TRUE の場合はデータをオブジェクトとして取り込み、デフォルトは TRUE
  414. * @param String $_paginClass ページネーションのクラス名
  415. * @return 成功した場合は True
  416. */
  417. public static function getPage($_sql,&$page,$orderBy ='更新された説明', $ dataPro='data',$pagePro = 'ページネーション',
  418. $config = NULL,$db = 'default',$as_object= true,$_paginClass='ページネーション'){
  419. $_csql = 'select count(1) as c from ('.$_sql.') st';
  420. $_c = DB::query(self::SELECT,$_csql)->execute($db)->get('c');
  421. if($config){
  422. $config['total_items' ] = $_c;
  423. $_pagination = new $_paginClass($config);
  424. }else{
  425. $config = array();
  426. $config['total_items'] = $_c;
  427. $_pagination = new $_paginClass($ config);
  428. }
  429. $_sql .= ' order by '.$orderBy;
  430. if($_pagination->offset){
  431. $_sql .= ' offset '.$_pagination->offset;
  432. }
  433. $_sql .= ' 制限 '.$_pagination->items_per_page;
  434. $_data = DB::query(self::SELECT,$_sql,$as_object)->execute($db)->as_array() ;
  435. if(!$_data){
  436. $page->gt;{$dataPro} = false;
  437. $page->gt;{$pagePro} = false;
  438. return false;
  439. }
  440. $page->gt;{$dataPro} = $_data;
  441. $page->gt;{$pagePro} = $_pagination;
  442. return true;
  443. }
  444. /**
  445. * 部下のすべてのロールを取得します
  446. *
  447. * @param Integer $role_id Integer ユーザーロール ID
  448. * @param Boolean $quote 正しい場合は SQL を引用し、false の場合は元の SQL を返します
  449. * @param String $role_table ロール階層のテーブル
  450. * @param Integer $level ツリートラバースの開始レベル
  451. * @param String $db データベースインスタンス名
  452. * @return SQL String
  453. */
  454. public static function getRoleTreeSql($role_id,$quote = false,$role_table,$level=0,$db='default'){
  455. $_sql = 'select id from ('.self::getTree($role_table,true,$ role_id,'id','pid','id',
  456. 0, //Max Depth
  457. $level, //Level
  458. ';',$db).') utree';
  459. if(!$quote) return $ _sql;
  460. else return '('.$_sql.')';
  461. }
  462. /**
  463. * 従属オブジェクトと所有オブジェクトのオブジェクトをクエリするための SQL 文字列を取得します
  464. * 子ユーザー ロール ツリー[CURT]
  465. *
  466. * @param integer $role_id ユーザーのロール ID
  467. * @param integer $user_id ユーザー ID
  468. * @param String $ role_table ロールのテーブル
  469. * @param Boolean $quote 正しい場合は SQL を引用し、false の場合は元の SQL を返す
  470. * @param String $roleCol ロール ID 列名
  471. * @param String $ownerCol オーナー ID 列名
  472. * @param String $ db データベースインスタンス名
  473. * @return SQL 文字列
  474. */
  475. public static function getCURTreeSql($role_id,$user_id,$role_table,$quote = true,
  476. $ roleCol='role_id',$ownerCol = 'owner_id' ,$db='default'){
  477. $_sql = ' '.$roleCol.' in '.self::getRoleTreeSql($role_id,true,$role_table,
  478. 1, //レベルは 1 から始まります
  479. $db)。 ' または '.$ownerCol.'='.self::quote($user_id,$db);
  480. if(!$quote) return $_sql;
  481. else return '('.$_sql.')';
  482. }
  483. /**
  484. * ツリークエリからツリーへの配列
  485. *
  486. * @param Array $eles 、self::getTree から設定されたレコード
  487. * @param String $elename、ノードの要素名
  488. * @param String $cldname、子ノード名
  489. * @param String $delimiter、ブランチの区切り文字
  490. *
  491. * @return Object、データのツリーオブジェクト
  492. */
  493. public static function array2tree($eles,$elename,$cldname,$delimiter=';'){
  494. if($elename == $cldname){
  495. throw new Exception( 'Ele 名は cldname と等しい!');
  496. }
  497. $rtree = array();
  498. foreach ($eles as $ele){
  499. $_branch = $ele->branch;
  500. //Log::debug('branch ='.$_branch);
  501. //配列内の深さ
  502. $_ Depths =explode($delimiter,$_branch);
  503. if(count($_ Depths == 1)){
  504. $_root = $_ Depths[0] ;
  505. }
  506. $_cur = &$rtree;
  507. foreach ($_ Depths as $ Depth){
  508. //NODE を作成します
  509. if(!isset($_cur[$cldname])){
  510. $_cur[$cldname] = array ();
  511. }
  512. if(!isset($_cur[$cldname][$ Depth])){
  513. $_cur[$cldname][$ Depth] = array();
  514. $_cur = &$_cur[$ cldname][$ Depth];
  515. }else{
  516. $_cur = &$_cur[$cldname][$ Depth];
  517. }
  518. }
  519. $_cur[$elename] = $ele;
  520. }
  521. return $rtree[$ cldname][$_root];
  522. }
  523. }
复制發


声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。