ホームページ  >  記事  >  バックエンド開発  >  PHP PDO 操作 MYSQL カプセル化クラス

PHP PDO 操作 MYSQL カプセル化クラス

WBOY
WBOYオリジナル
2016-07-25 08:42:281069ブラウズ
  1. /**
  2. * 著者 soulence
  3. * データクラスファイルを呼び出す
  4. * 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. false を返します。
  43. }
  44. if(!$pdo) {
  45. throw new Exception('PDO CONNECT ERROR');
  46. false を返します。
  47. }
  48. return $pdo;
  49. }
  50. /**
  51. * 操作データベースオブジェクトを取得します
  52. * @param string $dbname 対応するデータベースは誰ですか?
  53. * @param bool $attr 接続が長いかどうか
  54. * 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] = 新しい self($dbname,$attr);
  65. return self: :$_instance[$key];
  66. }
  67. プライベート関数 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 コンテンツの一部を返すかどうか、デフォルトは no です
  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. プライベート関数 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 コンテンツを返すかどうか。デフォルトは no です。 true に設定すると、各 SQL は 1 つのデータのみを返します
  100. */
  101. パブリック関数クエリ($arr_sql, $arr_data = [], $one = false)
  102. {
  103. if(!is_array($arr_sql) ||空($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('SQL: をクエリするエラー'.$val. ' ここで:'.$arr_data[$i]);
  112. $res[] = $this->queryCommon($arr_data[$i],$val,$one);
  113. $i++;
  114. }
  115. return $レス;
  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 トランザクション操作のデフォルトが No かどうか
  145. */
  146. public functionexecuteDDL($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->gt;execRes($data,$sql);
  154. if($Transaction)
  155. $this->gt;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 トランザクション操作のデフォルトが No かどうか
  170. */
  171. public functionexecuteDDLes( $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('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) ||空($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. * このメソッドは、クエリによって返される項目の数を計算するために使用されます。
  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 トランザクション操作を実行するかどうか、デフォルトは no です
  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 query 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. public function sQCommit()
  328. {
  329. if(empty($this->pdo) || !is_object($this->pdo))
  330. return false;
  331. if( isset($this->Transaction) && $this->Transaction === true)
  332. $this->pdo->commit();//提交事务
  333. unset($this->pdo);
  334. }
  335. /**
  336. * 内部呼び出しメソッド
  337. */
  338. public function checkParams($sql,$data)
  339. {
  340. if (empty($this->pdo) || !is_object($this->pdo) | | !is_array($data) || empty($sql) || !is_string($sql))
  341. return false;
  342. return true;
  343. }
  344. /**
  345. * 内部呼び出しメソッド
  346. */
  347. プライベート関数 pdoExecSq($ sql,$data,$select = []){
  348. try{
  349. $res = $this->pdoExec($data,$sql);
  350. if(empty($select))
  351. return $res;
  352. else{
  353. if($select[0] === 1){
  354. if($select[1] === true)
  355. return $this->statement->fetch(PDO::FETCH_ASSOC);
  356. else
  357. return $this->statement->fetchAll(PDO::FETCH_ASSOC);
  358. }elseif($select[0] === 2)
  359. return $this->statement->fetchColumn();
  360. else
  361. return false;
  362. }
  363. } catch (Exception $e) {
  364. throw new Exception($e->getMessage());
  365. return false;
  366. }finally {
  367. if (!empty($this->statement))
  368. {
  369. $this->statement->closeCursor();
  370. unset($this->statement);
  371. }
  372. }
  373. }
  374. /**
  375. * 内部呼び出しメソッド
  376. */
  377. プライベート関数 execRes($data ,$sql){
  378. $res = $this->pdoExec($data,$sql);
  379. $in_id = $this->pdo->lastInsertId();
  380. if (preg_match("/ ^s*(INSERTs+INTO|REPLACEs+INTO)s+/i", $sql) && !empty($in_id))
  381. $this->lastInsID = $in_id;
  382. else
  383. $this->lastInsID = $ res;
  384. }
  385. /**
  386. * SQLステートメントを直接実行するために使用される内部呼び出しメソッド
  387. */
  388. プライベート関数 pdoExec($data,$sql){
  389. $this->statement = $this->pdo->prepare($sql);
  390. if (false === $this->statement)
  391. return false;
  392. if (!empty($data))
  393. {
  394. foreach ($data as $k => $v)
  395. {
  396. $this->statement->bindValue($k, $v);
  397. }
  398. }
  399. $res = $this->statement->execute();
  400. if (!$ res)
  401. {
  402. throw new Exception('sql:'.$sql.'<====>where:'.json_encode($data).'<====>error:'.json_encode ($this->statement->errorInfo()));
  403. }else{
  404. return $res;
  405. }
  406. }
  407. /**
  408. * 解放に使用される内部呼び出しメソッド
  409. */
  410. private function free()
  411. {
  412. if ( is_null($this->pdo))
  413. $this->getConnect();
  414. if (!empty($this->statement))
  415. {
  416. $this->statement->closeCursor() ;
  417. $this->statement = null;
  418. }
  419. }
  420. }
  421. ?>
复制代

PHP、PDO、MYSQL

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