首頁 >後端開發 >php教程 >PHP PDO操作MYSQL封裝類

PHP PDO操作MYSQL封裝類

WBOY
WBOY原創
2016-07-25 08:42:281083瀏覽
  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. */
  322. public function sQCommit()
  323. {
  324. if(empty($this->pdo) || !is_object($this->pdo) pdo))
  325. return false;
  326. if(isset($this->Transaction) && $this->Transaction === true)
  327. $this->pdo->commit() ;//提交事務
  328. unset($this->pdo);
  329. }
  330. /**
  331. * 內部呼叫方法
  332. */
  333. public function checkParams($sql,$data)
  334. {
  335. if ($this->pdo) || !is_object($this->pdo) || !is_array($data) || 空($sql) || !is_string($sql))
  336. 回傳false;
  337. 回傳true;
  338. }
  339. /**
  340. * 內部呼叫方法
  341. */
  342. 外部函數pdoExecSq($sql,$data,$ select = []){
  343. 嘗試{
  344. $res = $this->pdoExec($data,$sql);
  345. if(empty($select))
  346. return $res;
  347. else{
  348. if ($select[0] === 1){
  349. if($select[1] === true)
  350. return $this->statement->fetch( PDO::FETCH_ASSOC);
  351. else
  352. return $this->statement->fetchAll(PDO::FETCH_ASSOC);
  353. }elseif($select[0] === 2)
  354. return $this->statement->fetchColumn();
  355. else
  356. return false;
  357. }
  358. } catch (Exception $e) {
  359. throw new Exception($e-> ;getMessage());
  360. return false;
  361. } 最後{
  362. if (!empty($this->statement))
  363. {
  364. $this->statement->; closeCursor();
  365. unset($this->語句);
  366. }
  367. }
  368. }
  369. /**
  370. * 內部呼叫方法
  371. */
  372. 中斷函數 execRes( $資料,$sql){
  373. $res = $this->pdoExec($data,$sql);
  374. $in_id = $this->pdo->lastInsertId( );
  375. if (preg_match("/^s*(INSERTs INTO|REPLACEs INTO)s /i", $sql) && !empty($in_id))
  376. $this->lastInsID = $in_id;
  377. else
  378. $this->lastInsID = $res;
  379. }
  380. /**
  381. * 內部呼叫方法 用來直接執行SQL語句的方法
  382. */
  383. 外部函數pdoExec($data,$sql ){
  384. $ $ this->statement = $this->pdo->prepare($sql);
  385. if (false === $this->statement)
  386. return false;
  387. if (!empty($data) )
  388. {
  389. foreach ($data as $k =>; $v)
  390. {
  391. $this->語句->bindValue($k, $v);
  392. }
  393. }
  394. $res = $this->語句-> ;execute();
  395. if (!$res)
  396. {
  397. throw new Exception('sql:'.$sql.'where:'.json_encode($data ).'錯誤:'.json_encode($this->statement->errorInfo()));
  398. }else{
  399. return $res;
  400. }
  401. }
  402. /**
  403. * 內部呼叫方法 用來釋放的
  404. */
  405. 原生函數free()
  406. {
  407. if (is_null($this->pdo ))
  408. $this->getConnect();
  409. if (!empty($this->statement))
  410. {
  411. $this->statement->closeCursor();
  412. $this ->statement = null;
  413. }
  414. }
  415. }
  416. ?>
複製程式碼

PHP、PDO、MYSQL


陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn