PHP PDO 작업 MYSQL 캡슐화 클래스

WBOY
풀어 주다: 2016-07-25 08:42:28
원래의
1075명이 탐색했습니다.
  1. /**
  2. * auther soulence
  3. * 呼叫資料類別檔案
  4. * modify 2015/06/12
  5. */
  6. class DBConnect
  7. {
  8. private $dbname = null;
  9. private $dodbdo = null;
  10. private $persistent = false;
  11. private $statement = null;
  12. private $lastInsID = null;
  13. private static $_instance = [];
  14. private static $_instance = [];
  15. {
  16. $this->dbname = $dbname;
  17. $this->persistent = $attr;
  18. }
  19. 公共靜態函數db ($flag='r',$persistent=false)
  20. {
  21. if(!isset($flag)){
  22. $flag = 'r';
  23. }
  24. if (!class_exists('PDO'))
  25. {
  26. throw new Exception('找不到PDO');
  27. return false;
  28. }
  29. $mysql_server = Yaf_Registry::get('mysql');
  30. if(!isset($mysql_server[$flag])){
  31. return false;
  32. }
  33. $options_arr = array(PDO::MYSQL_ATTR_INIT_COMMAND => '設定名稱'.$mysql_server[$flag]['charset'],PDO::ATTR_DEFAULT_FETCH_MODE=>PDO::FETCH_ASSOC); if(Ypersed $ === true){
  34. $options_arr[PDO::ATTR_PERSISTENT] = true;
  35. }
  36. 嘗試{
  37. $pdo = new PDO($mysql_server[$flag][ '🎜> $pdo = new PDO($mysql_server_server '],$mysql_server[$flag]['使用者名稱'],$mysql_server[$flag]['password'],$options_arr);
  38. } catch (PDOException $e) {
  39. 引發新例外( $e->getMessage());
  40. //exit('連線失敗:'.$e->getMessage());
  41. 回傳 false;
  42. }
  43. if(!$pdo) {
  44. throw new Exception('PDO CONNECT ERROR');
  45. 回傳 false;
  46. }
  47. return $pdo;
  48. }
  49. /**
  50. * 得到操作資料庫物件
  51. * @param string $dbname 對應的資料庫是誰
  52. * @param bool $attr 是否長連接
  53. * return false說明給定的資料庫不存在
  54. */
  55. public static function getgetstance($dbname = ' r',$attr = false)
  56. {
  57. $mysql_server = Yaf_Registry::get('mysql');
  58. if(!isset($mysql_server[$dbname])){
  59. return false ;
  60. }
  61. $key = md5(md5($dbname.$attr,true));
  62. if (!isset(self::$_instance[$key]) || !is_object(self: :$_instance[$key] ]))
  63. self::$_instance[$key] = new self($dbname,$attr);
  64. return self::$_instance[$key];
  65. }
  66. 私有函數getConnect(){
  67. $this->pdo = self::db($this->dbname,$this->persistent);
  68. }
  69. /**
  70. * 查詢操作
  71. * @param string $sql 執行查詢的sql語句
  72. * @param array $data 查詢的條件格式為[':id'=>$id,':name'=> $name](推薦)或為[1=>$id,2=>$name]
  73. * @param bool $one 是否回傳一條內容預設為否
  74. */
  75. 公用函數查詢($sql, $data = [], $one = false)
  76. {
  77. if (!is_array($data) ||empty($sql ) || ! is_string($sql))
  78. 回傳false;
  79. $this->free();
  80. return $this->queryCommon($data,$sql,$ one) ;
  81. }
  82. /**
  83. * 內部查詢的共用方法
  84. */
  85. 乾燥函數queryCommon($data,$sql,$one)
  86. {
  87. $this->pdoExec( $ data,$sql);
  88. if ($one){
  89. return $this->statement->fetch(PDO::FETCH_ASSOC);
  90. }else{
  91. return $this ->statement->fetchAll(PDO::FETCH_ASSOC);
  92. }
  93. }
  94. /**
  95. * 多條SQL語句的查詢操作
  96. * @param array $arr_sql 執行查詢的sql語句數組格式為[$sql1,$sql2]
  97. * @param array $arr_data 查詢與$arr_sql對應的條件格式為[[':id'=>$id,':name'=>$name],[':id'=>$id,':name'=>$name]](推薦)或為[ [1=>$id,2=>$name],[1=>$id,2=>$name]]
  98. * @param bool $one 是否回傳一條內容預設為否這裡如果設定為true那麼每一條sql都只回傳一條資料
  99. */
  100. 公用函數查詢($arr_sql, $arr_data = [] , $one = false)
  101. {
  102. if(!is_array($arr_sql) ||空($arr_sql) || !is_array($arr_data))
  103. return false;
  104. $this->free();
  105. $res = [];$i = 0;
  106. foreach ( $ arr_sql as $val) {
  107. if(!isset($arr_data[$i]))
  108. $arr_data[$i] = [];
  109. elseif(!is_array($arr_data[$i]) ))
  110. throw new Exception('查詢sql時發生錯誤:'.$val.' where:'.$arr_data[$i]);
  111. $res[] = $this->queryCommon ( $arr_data[$i],$val,$one);
  112. $i ;
  113. }
  114. return $res;
  115. }
  116. /**
  117. * 分頁封裝
  118. *
  119. * @param string $sql
  120. * @param int $page 表示從第幾頁開始取
  121. * @param int $pageSize 表示每頁多少條
  122. * @param array $data 查詢的條件
  123. */
  124. public function limitQuery($sql, $page=0, $pageSize=20, $data = [])
  125. {
  126. $page = intval($page);
  127. if ($page return [];
  128. }
  129. $pageSize = intval($pageSize);
  130. if ($pageSize > 0) { // pageSize 為0時表示取得所有資料
  131. $sql .= ' LIMIT ' . $pageSize;
  132. if ($page > 0) {
  133. $start_limit = ($page - 1) * $pageSize;
  134. $sql .= ' OFFSET ' 。 > }
  135. return $this->query($sql, $data);
  136. }
  137. /**
  138. * 這個是用來進行新增刪除修改操作使用事務操作
  139. * @param string $sql 執行查詢的sql語句
  140. * @param array $data 查詢的條件格式為[':id'= >$id,':name'=>$name](推薦)或為[1=>$id,2=>$name]
  141. * @param bool $Transaction 是否交易操作預設為否
  142. */
  143. public functionexecuteDDL($sql, $data = [ ],$Transaction = false){
  144. if (!is_array($data) || !is_string($sql))
  145. return false;
  146. $this->free();
  147. if($Transaction)
  148. $this->pdo->beginTransaction();//開啟交易
  149. try{
  150. $ this->execRes($data,$sql);
  151. if($Transaction)
  152. $this->pdo->commit();//提交交易
  153. return $this->; lastInsID;
  154. } catch (Exception $e) {
  155. if($Transaction)
  156. $this->pdo->rollBack();//交易回滾
  157. throw new Exception('錯誤 DDLExecute '.$e->getMessage());
  158. return false;
  159. }
  160. }
  161. /**
  162. * 這個是用來進行新增刪除修改操作使用事務操作
  163. * 它是執行多條的
  164. * @param array $arr_sql 需要執行操作的SQL語句數組
  165. * @param array $ arr_data 與陣列對應SQL語句的條件
  166. * @param bool $Transaction 是否事務操作預設為否
  167. * /
  168. public functionexecuteDDLes($arr_sql, $arr_data = [],$Transaction = false){
  169. if(!is_array($arr_sql) || 空($arr_sql) || !is_array($ arr_data))
  170. return false;
  171. $res = [];
  172. $this->free();
  173. if($Transaction)
  174. $this->pdo-> beginTransaction();//開啟事務
  175. try{
  176. $i = 0;
  177. foreach($arr_sql as $val){
  178. if(!isset( $arr_data[$i]))
  179. $arr_data[$i] = [];
  180. elseif(!is_array($arr_data[$i])){
  181. if($Transaction)
  182. $ this->pdo->rollBack() ;// 交易回溯
  183. throw new Exception('Error where DDLExecutees sql:'.$val.' where:'.$arr_data[$i]);
  184. }
  185. $this- >execRes($arr_data[$i],$val);
  186. $res[] = $this->lastInsID;
  187. $i ;
  188. }
  189. if($Transaction)
  190. $this->pdo->commit();// 交易提交
  191. return $res;
  192. } catch (Exception $ e) {
  193. if($Transaction)
  194. $ this->pdo->rollBack();//交易回滾
  195. throw new Exception('Error DDLExecutees array_sql:'.json_encode($arr_sql) ).' '.$e->getMessage());
  196. 回傳 false;
  197. }
  198. 回傳 $res;
  199. }
  200. /**
  201. * 此方法是用來計算查詢傳回的條數注意它只支援SELECT COUNT(*) FROM TABLE...或SELECT COUNT(0) FROM TABLE...方式
  202. * @param string $sql查詢的sql語句
  203. * @param array $data SQL語句的條件
  204. */
  205. public function countRows($sql,$data = []){
  206. if (!is_array($data) ||空($sql) || !is_string($sql))
  207. return false;
  208. $this->free();
  209. $res = $this->pdoExec($data,$sql);
  210. if($res == false)
  211. return false;
  212. return $this->statement->fetchColumn();
  213. }
  214. /**
  215. * 此方法是用來計算查詢傳回的條數 它是執行多條SQL
  216. * @param string $sql 查詢的sql語句
  217. * @param array $data SQL語句的條件
  218. */
  219. public function countRowses($arr_sql,$arr_data = []){
  220. if(!is_array($arr_sql) || empempty($ arr_sql) || !is_array($arr_data))
  221. 回傳false;
  222. $res = [];
  223. $this->free();
  224. $i = 000 ;
  225. foreach ($arr_sql as $val) {
  226. if(!isset($arr_data[$i]))
  227. $arr_data[$i] = [];
  228. elseif(!is_array ( $arr_data[$i]))
  229. throw new Exception('Error where CountRowses sql:'.$val.' where:'.$arr_data[$i]);
  230. $res1 = $ this ->pdoExec($arr_data[$i],$val);
  231. if($res1 == false)
  232. $res[] = false;
  233. else
  234. $res [] = $this->statement->fetchColumn();
  235. }
  236. return $res;
  237. }
  238. /**
  239. * 這裡再提供一個方法 由於專案中會有很多需要提供開啟事務 然後再進行操作 最後提交
  240. * @param bool $Transaction 是否事務操作 預設為否
  241. */
  242. public function getDB ($Transaction=false)
  243. {
  244. $this->Transaction = $Transaction;
  245. $this->getConnect();
  246. if($Transaction === true )
  247. $this ->pdo->beginTransaction();//開啟事務
  248. return $this;
  249. }
  250. /**
  251. * 此方法可以執行多次它是執行DDL語句的
  252. * 注意它是需要配合getDB和sQCommit一起使用不能單獨使用哦
  253. * 如果沒有開啟事務sQCommit方法可以不調用
  254. * @param string $sql 查詢的sql語句
  255. * @param array $data SQL語句的條件
  256. */
  257. public function execSq($sql,$data = [])
  258. {
  259. if($this->checkParams($sql,$data) === false)
  260. return false;
  261. 嘗試{
  262. $this- >execRes($data,$sql);
  263. return $this->lastInsID;
  264. } catch (Exception $e) {
  265. if(isset($ this->Transaction) && $this->Transaction === true)
  266. $this->pdo->rollBack();//交易回滾
  267. throw new Exception('Error execSq'.$e->getMessage());
  268. return false;
  269. } 最後 {
  270. if (!empty($this->statement))
  271. {
  272. $this->statement->closeCursor();
  273. unset($this->statement);
  274. }
  275. }
  276. }
  277. /* *
  278. * 執行查詢的方法它需要傳遞一個連接資料庫物件
  279. * @param string $sql 執行查詢的sql語句
  280. * @param array $data 查詢的條件格式為[':id'=> $id,':name'=>$name](推薦)或為[1=>$id,2=>$name]
  281. * @param bool $one 是否回傳一條內容預設為否
  282. */
  283. public function querySq($sql,$data = [],$one = false)
  284. {
  285. if($this->checkParams($sql,$data) = == false)
  286. return false;
  287. return $this->pdoExecSq($sql,$data,[1,$one]);
  288. }
  289. /* *
  290. * 分頁封裝
  291. *
  292. * @param string $sql
  293. * @param int $page 表示從第幾頁開始取
  294. * @param int $pageSize 表示每頁多少條
  295. * @param array $data 查詢的條件
  296. */
  297. public function limitQuerySq($sql, $page=0, $pageSize=20, $data = [])
  298. {
  299. $page = intval($page);
  300. if ($page return [];
  301. }
  302. $pageSize = intval($pageSize);
  303. if ($pageSize > 0) { // pageSize 為0時表示取得所有資料
  304. $ sql .= '限制' 。 ;
  305. }
  306. }
  307. return $this->querySq($sql, $data);
  308. }
  309. /**
  310. * 此方法是用來計算查詢傳回的條數注意它只支援SELECT COUNT(*) FROM TABLE...或SELECT COUNT(0) FROM TABLE...方式
  311. * @param string $sql查詢的sql語句
  312. * @param array $data SQL語句的條件
  313. */
  314. 公共函數countRowsSq ($sql,$data = []){
  315. if($this->checkParams($sql,$data) === false)
  316. return false;
  317. return $this->pdoExecSq($ sql,$data,[2]);
  318. }
  319. /**
  320. * 또 다른 메소드는 다음과 같습니다. 트랜잭션이 시작되지 않은 경우 마지막에 이 메소드를 호출할 필요가 없습니다.*/
  321. 공개 함수 sQCommit()
  322. {
  323. if(empty($this->pdo) || !is_object($this-> pdo))
  324. return false;
  325. if(isset($this->Transaction) && $this->Transaction === true)
  326. $this->pdo->commit() ;//提交事务
  327. unset($this->pdo);
  328. }
  329. /**
  330. * 내부 호출 방법
  331. */
  332. 공용 함수 checkParams($sql,$data)
  333. {
  334. if (empty($this->pdo) || !is_object($this->pdo) || !is_array($data) || 비어 있음($sql) || !is_string($ sql))
  335. false 반환;
  336. true 반환;
  337. }
  338. /**
  339. * 내부 호출 방법
  340. */
  341. 개인 함수 pdoExecSq($sql,$data,$ select = []){
  342. 시도{
  343. $res = $this->pdoExec($data,$sql);
  344. if(empty($select))
  345. return $res;
  346. else{
  347. if($select[0] === 1){
  348. if($select[1] === true)
  349. return $this->statement->fetch( PDO::FETCH_ASSOC);
  350. else
  351. return $this->statement->fetchAll(PDO::FETCH_ASSOC);
  352. }elseif($select[0] === 2)
  353. return $this->statement->fetchColumn();
  354. else
  355. return false;
  356. }
  357. } catch(Exception $e) {
  358. throw new Exception($e-> ;getMessage());
  359. return false;
  360. } 마침내 {
  361. if (!empty($this->statement))
  362. {
  363. $this->statement-> closeCursor();
  364. unset($this->statement);
  365. }
  366. }
  367. }
  368. /**
  369. * 내부 호출 방법
  370. */
  371. 비공개 함수 execRes( $data,$sql){
  372. $res = $this->pdoExec($data,$sql);
  373. $in_id = $this->pdo->lastInsertId( );
  374. if (preg_match("/^s*(INSERTs INTO|REPLACEs INTO)s /i", $sql) && !empty($in_id))
  375. $this->lastInsID = $in_id;
  376. else
  377. $this->lastInsID = $res;
  378. }
  379. /**
  380. * SQL 문을 직접 실행하기 위해 사용하는 내부 호출 방식
  381. */
  382. 개인 함수 pdoExec($data,$sql ){
  383. $this->statement = $this->pdo->prepare($sql);
  384. if (false === $this->statement)
  385. return false;
  386. if (!empty($data))
  387. {
  388. foreach ($data를 $k => $v)
  389. {
  390. $this->statement->bindValue($k, $v);
  391. }
  392. }
  393. $res = $this->statement-> ;execute();
  394. if (!$res)
  395. {
  396. throw new Exception('sql:'.$sql.'<====>where:'.json_encode($data ).'<====>error:'.json_encode($this->statement->errorInfo()));
  397. }else{
  398. return $res;
  399. }
  400. }
  401. /**
  402. * 해제에 사용된 내부 호출 방법
  403. */
  404. 개인 함수 free()
  405. {
  406. if (is_null($this->pdo))
  407. $this- >getConnect();
  408. if (!empty($this->statement))
  409. {
  410. $this->statement->closeCursor();
  411. $this ->문 = null;
  412. }
  413. }
  414. }
  415. ?>
复代码

PHP, PDO, MYSQL

관련 라벨:
원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿