>  기사  >  백엔드 개발  >  PHP PDO操作MYSQL封装类

PHP PDO操作MYSQL封装类

WBOY
WBOY원래의
2016-07-25 08:42:281028검색
  1. /**
  2. * auther soulence
  3. * 调用数据类文件
  4. * modify 2015/06/12
  5. */
  6. class DBConnect
  7. {
  8. private $dbname = null;
  9. private $pdo = null;
  10. private $persistent = false;
  11. private $statement = null;
  12. private $lastInsID = null;
  13. private static $_instance = [];
  14. private function __construct($dbname,$attr)
  15. {
  16. $this->dbname = $dbname;
  17. $this->persistent = $attr;
  18. }
  19. public static function db($flag='r',$persistent=false)
  20. {
  21. if(!isset($flag)){
  22. $flag = 'r';
  23. }
  24. if (!class_exists('PDO'))
  25. {
  26. throw new Exception('not found 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 => 'SET NAMES '.$mysql_server[$flag]['charset'],PDO::ATTR_DEFAULT_FETCH_MODE=>PDO::FETCH_ASSOC);
  34. if($persistent === true){
  35. $options_arr[PDO::ATTR_PERSISTENT] = true;
  36. }
  37. try {
  38. $pdo = new PDO($mysql_server[$flag]['connectionString'],$mysql_server[$flag]['username'],$mysql_server[$flag]['password'],$options_arr);
  39. } catch (PDOException $e) {
  40. throw new Exception($e->getMessage());
  41. //exit('连接失败:'.$e->getMessage());
  42. return false;
  43. }
  44. if(!$pdo) {
  45. throw new Exception('PDO CONNECT ERROR');
  46. return false;
  47. }
  48. return $pdo;
  49. }
  50. /**
  51. * 得到操作数据库对象
  52. * @param string $dbname 对应的数据库是谁
  53. * @param bool $attr 是否长连接
  54. * return false说明给定的数据库不存在
  55. */
  56. public static function getInstance($dbname = 'r',$attr = false)
  57. {
  58. $mysql_server = Yaf_Registry::get('mysql');
  59. if(!isset($mysql_server[$dbname])){
  60. return false;
  61. }
  62. $key = md5(md5($dbname.$attr,true));
  63. if (!isset(self::$_instance[$key]) || !is_object(self::$_instance[$key]))
  64. self::$_instance[$key] = new self($dbname,$attr);
  65. return self::$_instance[$key];
  66. }
  67. private function getConnect(){
  68. $this->pdo = self::db($this->dbname,$this->persistent);
  69. }
  70. /**
  71. * 查询操作
  72. * @param string $sql 执行查询的sql语句
  73. * @param array $data 查询的条件 格式为[':id'=>$id,':name'=>$name](推荐)或者为[1=>$id,2=>$name]
  74. * @param bool $one 是否返回一条内容 默认为否
  75. */
  76. public function query($sql, $data = [], $one = false)
  77. {
  78. if (!is_array($data) || empty($sql) || !is_string($sql))
  79. return false;
  80. $this->free();
  81. return $this->queryCommon($data,$sql,$one);
  82. }
  83. /**
  84. * 内部查询的共用方法
  85. */
  86. private function queryCommon($data,$sql,$one)
  87. {
  88. $this->pdoExec($data,$sql);
  89. if ($one){
  90. return $this->statement->fetch(PDO::FETCH_ASSOC);
  91. }else{
  92. return $this->statement->fetchAll(PDO::FETCH_ASSOC);
  93. }
  94. }
  95. /**
  96. * 多条SQL语句的查询操作
  97. * @param array $arr_sql 执行查询的sql语句数组 格式为[$sql1,$sql2]
  98. * @param array $arr_data 查询与$arr_sql对应的条件 格式为[[':id'=>$id,':name'=>$name],[':id'=>$id,':name'=>$name]](推荐)或者为[[1=>$id,2=>$name],[1=>$id,2=>$name]]
  99. * @param bool $one 是否返回一条内容 默认为否 这里如果设置为true那么每一条sql都只返回一条数据
  100. */
  101. public function queryes($arr_sql, $arr_data = [], $one = false)
  102. {
  103. if(!is_array($arr_sql) || empty($arr_sql) || !is_array($arr_data))
  104. return false;
  105. $this->free();
  106. $res = [];$i = 0;
  107. foreach ($arr_sql as $val) {
  108. if(!isset($arr_data[$i]))
  109. $arr_data[$i] = [];
  110. elseif(!is_array($arr_data[$i]))
  111. throw new Exception('Error where queryes sql:'.$val.' where:'.$arr_data[$i]);
  112. $res[] = $this->queryCommon($arr_data[$i],$val,$one);
  113. $i++;
  114. }
  115. return $res;
  116. }
  117. /**
  118. * 分页封装
  119. *
  120. * @param string $sql
  121. * @param int $page 表示从第几页开始取
  122. * @param int $pageSize 表示每页多少条
  123. * @param array $data 查询的条件
  124. */
  125. public function limitQuery($sql, $page=0, $pageSize=20, $data = [])
  126. {
  127. $page = intval($page);
  128. if ($page return [];
  129. }
  130. $pageSize = intval($pageSize);
  131. if ($pageSize > 0) { // pageSize 为0时表示取所有数据
  132. $sql .= ' LIMIT ' . $pageSize;
  133. if ($page > 0) {
  134. $start_limit = ($page - 1) * $pageSize;
  135. $sql .= ' OFFSET ' . $start_limit;
  136. }
  137. }
  138. return $this->query($sql, $data);
  139. }
  140. /**
  141. * 这个是用来进行添加 删除 修改操作 使用事务操作
  142. * @param string $sql 执行查询的sql语句
  143. * @param array $data 查询的条件 格式为[':id'=>$id,':name'=>$name](推荐)或者为[1=>$id,2=>$name]
  144. * @param bool $Transaction 是否事务操作 默认为否
  145. */
  146. public function executeDDL($sql, $data = [],$Transaction = false){
  147. if (!is_array($data) || !is_string($sql))
  148. return false;
  149. $this->free();
  150. if($Transaction)
  151. $this->pdo->beginTransaction();//开启事务
  152. try{
  153. $this->execRes($data,$sql);
  154. if($Transaction)
  155. $this->pdo->commit();//事务提交
  156. return $this->lastInsID;
  157. } catch (Exception $e) {
  158. if($Transaction)
  159. $this->pdo->rollBack();//事务回滚
  160. throw new Exception('Error DDLExecute '.$e->getMessage());
  161. return false;
  162. }
  163. }
  164. /**
  165. * 这个是用来进行添加 删除 修改操作 使用事务操作
  166. * 它是执行多条的
  167. * @param array $arr_sql 需要执行操作的SQL语句数组
  168. * @param array $arr_data 与数组对应SQL语句的条件
  169. * @param bool $Transaction 是否事务操作 默认为否
  170. */
  171. public function executeDDLes($arr_sql, $arr_data = [],$Transaction = false){
  172. if(!is_array($arr_sql) || empty($arr_sql) || !is_array($arr_data))
  173. return false;
  174. $res = [];
  175. $this->free();
  176. if($Transaction)
  177. $this->pdo->beginTransaction();//开启事务
  178. try{
  179. $i = 0;
  180. foreach($arr_sql as $val){
  181. if(!isset($arr_data[$i]))
  182. $arr_data[$i] = [];
  183. elseif(!is_array($arr_data[$i])){
  184. if($Transaction)
  185. $this->pdo->rollBack();//事务回滚
  186. throw new Exception('Error where DDLExecutees sql:'.$val.' where:'.$arr_data[$i]);
  187. }
  188. $this->execRes($arr_data[$i],$val);
  189. $res[] = $this->lastInsID;
  190. $i++;
  191. }
  192. if($Transaction)
  193. $this->pdo->commit();//事务提交
  194. return $res;
  195. } catch (Exception $e) {
  196. if($Transaction)
  197. $this->pdo->rollBack();//事务回滚
  198. throw new Exception('Error DDLExecutees array_sql:'.json_encode($arr_sql).' '.$e->getMessage());
  199. return false;
  200. }
  201. return $res;
  202. }
  203. /**
  204. * 此方法是用来计算查询返回的条数 注意 它只支持SELECT COUNT(*) FROM TABLE...或者SELECT COUNT(0) FROM TABLE...方式
  205. * @param string $sql 查询的sql语句
  206. * @param array $data SQL语句的条件
  207. */
  208. public function countRows($sql,$data = []){
  209. if (!is_array($data) || empty($sql) || !is_string($sql))
  210. return false;
  211. $this->free();
  212. $res = $this->pdoExec($data,$sql);
  213. if($res == false)
  214. return false;
  215. return $this->statement->fetchColumn();
  216. }
  217. /**
  218. * 此方法是用来计算查询返回的条数 它是执行多条SQL
  219. * @param string $sql 查询的sql语句
  220. * @param array $data SQL语句的条件
  221. */
  222. public function countRowses($arr_sql,$arr_data = []){
  223. if(!is_array($arr_sql) || empty($arr_sql) || !is_array($arr_data))
  224. return false;
  225. $res = [];
  226. $this->free();
  227. $i = 0;
  228. foreach ($arr_sql as $val) {
  229. if(!isset($arr_data[$i]))
  230. $arr_data[$i] = [];
  231. elseif(!is_array($arr_data[$i]))
  232. throw new Exception('Error where CountRowses sql:'.$val.' where:'.$arr_data[$i]);
  233. $res1 = $this->pdoExec($arr_data[$i],$val);
  234. if($res1 == false)
  235. $res[] = false;
  236. else
  237. $res[] = $this->statement->fetchColumn();
  238. }
  239. return $res;
  240. }
  241. /**
  242. * 这里再提供一个方法 由于项目中会有很多需要提供开启事务 然后再进行操作 最后提交
  243. * @param bool $Transaction 是否事务操作 默认为否
  244. */
  245. public function getDB($Transaction=false)
  246. {
  247. $this->Transaction = $Transaction;
  248. $this->getConnect();
  249. if($Transaction === true)
  250. $this->pdo->beginTransaction();//开启事务
  251. return $this;
  252. }
  253. /**
  254. * 此方法可以执行多次 它是执行DDL语句的
  255. * 注意 它是需要配合getDB和sQCommit一起使用 不能单独使用哦
  256. * 如果没有开启事务 sQCommit方法可以不调用
  257. * @param string $sql 查询的sql语句
  258. * @param array $data SQL语句的条件
  259. */
  260. public function execSq($sql,$data = [])
  261. {
  262. if($this->checkParams($sql,$data) === false)
  263. return false;
  264. try{
  265. $this->execRes($data,$sql);
  266. return $this->lastInsID;
  267. } catch (Exception $e) {
  268. if(isset($this->Transaction) && $this->Transaction === true)
  269. $this->pdo->rollBack();//事务回滚
  270. throw new Exception('Error execSq'.$e->getMessage());
  271. return false;
  272. } finally {
  273. if (!empty($this->statement))
  274. {
  275. $this->statement->closeCursor();
  276. unset($this->statement);
  277. }
  278. }
  279. }
  280. /**
  281. * 执行查询的方法 它需要传一个连接数据库对象
  282. * @param string $sql 执行查询的sql语句
  283. * @param array $data 查询的条件 格式为[':id'=>$id,':name'=>$name](推荐)或者为[1=>$id,2=>$name]
  284. * @param bool $one 是否返回一条内容 默认为否
  285. */
  286. public function querySq($sql,$data = [],$one = false)
  287. {
  288. if($this->checkParams($sql,$data) === false)
  289. return false;
  290. return $this->pdoExecSq($sql,$data,[1,$one]);
  291. }
  292. /**
  293. * 分页封装
  294. *
  295. * @param string $sql
  296. * @param int $page 表示从第几页开始取
  297. * @param int $pageSize 表示每页多少条
  298. * @param array $data 查询的条件
  299. */
  300. public function limitQuerySq($sql, $page=0, $pageSize=20, $data = [])
  301. {
  302. $page = intval($page);
  303. if ($page return [];
  304. }
  305. $pageSize = intval($pageSize);
  306. if ($pageSize > 0) { // pageSize 为0时表示取所有数据
  307. $sql .= ' LIMIT ' . $pageSize;
  308. if ($page > 0) {
  309. $start_limit = ($page - 1) * $pageSize;
  310. $sql .= ' OFFSET ' . $start_limit;
  311. }
  312. }
  313. return $this->querySq($sql, $data);
  314. }
  315. /**
  316. * 此方法是用来计算查询返回的条数 注意 它只支持SELECT COUNT(*) FROM TABLE...或者SELECT COUNT(0) FROM TABLE...方式
  317. * @param string $sql 查询的sql语句
  318. * @param array $data SQL语句的条件
  319. */
  320. public function countRowsSq($sql,$data = []){
  321. if($this->checkParams($sql,$data) === false)
  322. return false;
  323. return $this->pdoExecSq($sql,$data,[2]);
  324. }
  325. /**
  326. * 这里再提供一个方法 这是最后提交操作 如果没有开启事务 此方法最后可以不调用的
  327. */
  328. public function sQCommit()
  329. {
  330. if(empty($this->pdo) || !is_object($this->pdo))
  331. return false;
  332. if(isset($this->Transaction) && $this->Transaction === true)
  333. $this->pdo->commit();//提交事务
  334. unset($this->pdo);
  335. }
  336. /**
  337. * 内部调用方法
  338. */
  339. public function checkParams($sql,$data)
  340. {
  341. if (empty($this->pdo) || !is_object($this->pdo) || !is_array($data) || empty($sql) || !is_string($sql))
  342. return false;
  343. return true;
  344. }
  345. /**
  346. * 内部调用方法
  347. */
  348. private function pdoExecSq($sql,$data,$select = []){
  349. try{
  350. $res = $this->pdoExec($data,$sql);
  351. if(empty($select))
  352. return $res;
  353. else{
  354. if($select[0] === 1){
  355. if($select[1] === true)
  356. return $this->statement->fetch(PDO::FETCH_ASSOC);
  357. else
  358. return $this->statement->fetchAll(PDO::FETCH_ASSOC);
  359. }elseif($select[0] === 2)
  360. return $this->statement->fetchColumn();
  361. else
  362. return false;
  363. }
  364. } catch (Exception $e) {
  365. throw new Exception($e->getMessage());
  366. return false;
  367. } finally {
  368. if (!empty($this->statement))
  369. {
  370. $this->statement->closeCursor();
  371. unset($this->statement);
  372. }
  373. }
  374. }
  375. /**
  376. * 内部调用方法
  377. */
  378. private function execRes($data,$sql){
  379. $res = $this->pdoExec($data,$sql);
  380. $in_id = $this->pdo->lastInsertId();
  381. if (preg_match("/^\s*(INSERT\s+INTO|REPLACE\s+INTO)\s+/i", $sql) && !empty($in_id))
  382. $this->lastInsID = $in_id;
  383. else
  384. $this->lastInsID = $res;
  385. }
  386. /**
  387. * 内部调用方法 用来直接执行SQL语句的方法
  388. */
  389. private function pdoExec($data,$sql){
  390. $this->statement = $this->pdo->prepare($sql);
  391. if (false === $this->statement)
  392. return false;
  393. if (!empty($data))
  394. {
  395. foreach ($data as $k => $v)
  396. {
  397. $this->statement->bindValue($k, $v);
  398. }
  399. }
  400. $res = $this->statement->execute();
  401. if (!$res)
  402. {
  403. throw new Exception('sql:'.$sql.'where:'.json_encode($data).'error:'.json_encode($this->statement->errorInfo()));
  404. }else{
  405. return $res;
  406. }
  407. }
  408. /**
  409. * 内部调用方法 用来释放的
  410. */
  411. private function free()
  412. {
  413. if (is_null($this->pdo))
  414. $this->getConnect();
  415. if (!empty($this->statement))
  416. {
  417. $this->statement->closeCursor();
  418. $this->statement = null;
  419. }
  420. }
  421. }
  422. ?>
复制代码

PHP, PDO, MYSQL


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