一区二区三区日韩精品-日韩经典一区二区三区-五月激情综合丁香婷婷-欧美精品中文字幕专区

分享

超輕的 PHP 數(shù)據(jù)庫(kù)工具包[轉(zhuǎn)]

 wwwijhyt圖書館 2014-05-11

超輕的 PHP 數(shù)據(jù)庫(kù)工具包[轉(zhuǎn)]  

2011-10-15 11:45:37|  分類: 程序設(shè)計(jì) |舉報(bào) |字號(hào) 訂閱

 一個(gè)很輕的 PHP 數(shù)據(jù)庫(kù)工具包,誕生時(shí)間兩天(足以證明很輕了)。
兩個(gè)類,一個(gè) Connection 管理 PDO 連接(支持多數(shù)據(jù)庫(kù)),一個(gè) QuickQuery 用來快速執(zhí)行數(shù)據(jù)庫(kù)操作(不用在 PDO 和 PDOStatement 之間來回折騰)

使用范例

01 use Persistence\DbAccess;
02
03 // 在框架初始化的地方添加連接信息
04 DbAccess\Connection::add(
05 'default',
06 'sqlite',
07 '/db/mydb.sqlite',
08 null, null, false
09 );
10
11 // 下面是使用
12 $conn = DbAccess\Connection::instance('default');
13
14 // 查詢
15 $query = new DbAccess\QuickQuery($conn);
16 $query->prepare('select :name as name')->execute(array(':name'=>'sssssss'));
17
18 // 對(duì)象直接作為迭代器產(chǎn)生數(shù)據(jù)數(shù)組
19 foreach($query as $i) {
20 var_dump($i);
21 }
22
23 // 如果有偏執(zhí)的話,輸出響應(yīng)之前手動(dòng)斷開連接
24 DbAccess\Connection::disconnectAll();

[代碼] Persistence/DbAccess/QuickQuery.php


001 <?php
002 namespace Persistence\DbAccess;
003 use PDO, ArrayObject, DateTime;
004 use LogicException, InvalidArgumentException;
005
006 /**
007 * 快捷查詢通道
008 *
009 * @version 0.3
010 * @author sssssss<ssssssss@testabc.com>
011 * @link http://stu.
012 * @license http://www./licenses/mit-license.html
013 * @copyright StuCampus Development Team, Shenzhen University
014 *
015 */
016 class QuickQuery implements \IteratorAggregate
017 {
018 /**
019 * 數(shù)據(jù)庫(kù)連接
020 *
021 * @var \Persistence\DbAccess\Connection
022 */
023 private $connection = null;
024
025 /**
026 * PDO Statement
027 *
028 * @var PDOStatement
029 */
030 private $stmt = null;
031
032 /**
033 * 被檢查參數(shù)集
034 *
035 * @var array
036 */
037 private $checkedParams = array();
038
039
040 /**
041 * 構(gòu)造查詢通道
042 *
043 * @param \Persistence\DbAccess\Connection $connection 數(shù)據(jù)庫(kù)連接
044 */
045 public function __construct(Connection $connection)
046 {
047 $this->connection = $connection;
048 }
049
050 /**
051 * 預(yù)編譯 SQL 語句
052 *
053 * @param string $sqlCommand SQL語句
054 * @return \Persistence\DbAccess\QuickQuery
055 */
056 public function prepare($sqlCommand)
057 {
058 // 從連接獲取 PDO, 并對(duì) SQL 語句執(zhí)行 prepare, 產(chǎn)生 PDO Statement
059 $this->stmt = $this->connection->getPDO()->prepare($sqlCommand);
060 // 修改 PDO Statement 模式為關(guān)聯(lián)數(shù)組數(shù)據(jù)
061 $this->stmt->setFetchMode(PDO::FETCH_ASSOC);
062 // 返回方法鏈
063 return $this;
064 }
065
066 /**
067 * 執(zhí)行數(shù)據(jù)查詢
068 *
069 * @throws PDOException
070 * @return \Persistence\DbAccess\QuickQuery
071 */
072 public function execute($params = array())
073 {
074 $stmt = $this->getStatement();
075
076 // 參數(shù)檢查
077 $diff = array_diff($this->checkedParams, array_keys($params));
078 if (count($this->checkedParams) && count($diff)) {
079 throw new InvalidArgumentException('缺少必備參數(shù):'.implode(' | ', $diff));
080 }
081
082 // 將 PHP 數(shù)據(jù)類型對(duì)應(yīng)到數(shù)據(jù)庫(kù)數(shù)據(jù)類型
083 foreach($params as $key => $value) {
084 $type = null;
085 switch(true) {
086 case is_int($value):
087 $type = PDO::PARAM_INT;
088 break;
089 case is_bool($value):
090 $type = PDO::PARAM_BOOL;
091 break;
092 case ($value instanceof DateTime):
093 $type = PDO::PARAM_STR;
094 $value = $value->format(\DateTime::W3C);
095 break;
096 case is_null($value):
097 $type = PDO::PARAM_NULL;
098 break;
099 default:
100 $type = PDO::PARAM_STR;
101 }
102
103 $stmt->bindValue($key, $value, $type);
104 }
105
106 $stmt->execute();
107 $this->checkedParams = array(); // 清空參數(shù)檢查
108 return $this;
109 }
110
111 /**
112 * 獲取 Statement 對(duì)象
113 *
114 * 返回對(duì)象可以被綁定參數(shù)重新執(zhí)行, 也可以被當(dāng)作迭代器遍歷獲取數(shù)據(jù)。
115 *
116 * @return \PDOStatement
117 */
118 public function getStatement()
119 {
120 if (!$this->stmt) {
121 throw new LogicException('SQL語句應(yīng)該先被 QuickQuery.prepare 預(yù)處理');
122 }
123
124 return $this->stmt;
125 }
126
127 /**
128 * getStatement 方法的替代名
129 *
130 * 實(shí)現(xiàn) PHP 標(biāo)準(zhǔn)庫(kù) 中的 IteratorAggregate 接口, 外部可以直接將本對(duì)象作為迭代器遍
131 * 歷。和 getStatment 唯一不同之處, 是本方法不會(huì)拋出 LogicException 異常。如果
132 * 沒有事先使用 prepare 和 execute, 會(huì)返回一個(gè)空迭代器。
133 *
134 * @return Traversable
135 */
136 public function getIterator()
137 {
138 try {
139 return $this->getStatement();
140 } catch (LogicException $ex) {
141 return new \ArrayObject();
142 }
143 }
144
145 /**
146 * 設(shè)置查詢參數(shù)檢查
147 *
148 * 通過此處導(dǎo)入的被檢查查詢參數(shù), 如果沒有得到賦值, 則查詢時(shí)會(huì)拋出 LogicException 異常。
149 *
150 * @param array $params
151 * @return \Persistence\DbAccess\QuickQuery
152 */
153 public function setParamsCheck(array $params)
154 {
155 $this->checkedParams = $params;
156
157 return $this;
158 }
159
160 /**
161 * 將結(jié)果集轉(zhuǎn)換為數(shù)組
162 *
163 * @return array
164 */
165 public function toArray()
166 {
167 return iterator_to_array($this->getStatement());
168 }
169
170 /**
171 * 獲取最后一個(gè)插入結(jié)果(或序列)的 ID
172 *
173 * @param string $name
174 * @return int
175 */
176 public function getLastInsertId($name=null)
177 {
178 return $this->connection->getPDO()->lastInsertId($name);
179 }
180 }

[代碼] Persistence/DbAccess/Connection.php

001 <?php
002 namespace Persistence\DbAccess;
003 use InvalidArgumentException, BadMethodCallException;
004 use PDO, PDOException;
005
006 /**
007 * 連接工廠,提供全局的PDO對(duì)象,并管理事務(wù)。
008 *
009 * @version 0.3
010 * @author  sssssss<ssssssss@testabc.com>
011 * @link http://stu.
012 * @license http://www./licenses/mit-license.html
013 * @copyright StuCampus Development Team, Shenzhen University
014 *
015 */
016 final class Connection
017 {
018 /**
019 * Connector 實(shí)例集合
020 *
021 * @var array
022 */
023 static private $instances = array();
024
025 /**
026 * 數(shù)據(jù)庫(kù)驅(qū)動(dòng)名
027 *
028 * @var string
029 */
030 private $driver = '';
031
032 /**
033 * 數(shù)據(jù)庫(kù)連接字符串(Database Source Name)
034 *
035 * @var string
036 */
037 private $dsn = '';
038
039 /**
040 * PDO 實(shí)例
041 *
042 * @var \PDO
043 */
044 private $pdo = null;
045
046 /**
047 * 用戶名
048 *
049 * @var string
050 */
051 private $username = '';
052
053 /**
054 * 密碼
055 *
056 * @var string
057 */
058 private $password = '';
059
060 /**
061 * 是否開啟持久連接
062 *
063 * @var bool
064 */
065 private $isPersisten = false;
066
067 /**
068 * 是否開啟仿真預(yù)編譯
069 *
070 * @var bool
071 */
072 private $isEmulate = false;
073
074 /**
075 * 是否在事務(wù)中
076 *
077 * @var bool
078 */
079 private $isInTransation = false;
080
081 /**
082 * 私有構(gòu)造函數(shù),阻止外部使用 new 操作符實(shí)例化
083 */
084 private function __construct(){}
085
086 /**
087 * 生產(chǎn) Connector 實(shí)例(多例)
088 *
089 * @param string $name
090 * @return \StuCampus\DataModel\Connector
091 */
092 static public function getInstance($name = 'default')
093 {
094 if (!isset(self::$instances[$name])) {
095 // 如果訪問的實(shí)例不存在則拋出錯(cuò)誤異常
096 throw new InvalidArgumentException("[{$name}] 不存在");
097 }
098
099 return self::$instances[$name];
100 }
101
102 /**
103 * 斷開所有數(shù)據(jù)庫(kù)實(shí)例的連接
104 */
105 static public function disconnectAll()
106 {
107 foreach (self::$instances as $instance) {
108 $instance->disconnect();
109 }
110 }
111
112 /**
113 * 添加數(shù)據(jù)庫(kù)
114 *
115 * 向?qū)嵗禾砑?Connector
116 *
117 * @param string $name 標(biāo)識(shí)名
118 * @param string $driver 驅(qū)動(dòng)名
119 * @param string $dsn 連接字符串
120 * @param string $usr 數(shù)據(jù)庫(kù)用戶名
121 * @param string $pwd 數(shù)據(jù)庫(kù)密碼
122 * @param bool $emulate 仿真預(yù)編譯查詢
123 * @param bool $persisten 是否持久連接
124 */
125 static public function registry($name, $driver, $dsn, $usr, $pwd, $emulate = false, $persisten = false)
126 {
127 if (isset(self::$instances[$name])) {
128 // 如果添加的實(shí)例名已經(jīng)存在則拋出異常
129 throw new BadMethodCallException("[{$name}] 已被注冊(cè)");
130 }
131
132 // 實(shí)例化自身,并推入數(shù)組中
133 self::$instances[$name] = new self();
134 self::$instances[$name]->dsn = $driver . ':' . $dsn;
135 self::$instances[$name]->username = $usr;
136 self::$instances[$name]->password = $pwd;
137 self::$instances[$name]->driver = $driver;
138 self::$instances[$name]->isPersisten = (bool)$persisten;
139 self::$instances[$name]->isEmulate = (bool)$emulate;
140 }
141
142 /**
143 * 獲取 PHP Database Object
144 *
145 * @return \PDO
146 */
147 public function getPDO()
148 {
149 if (!$this->pdo) {
150 // 檢查 PDO 是否已經(jīng)實(shí)例化,否則先實(shí)例化 PDO
151 $this->pdo = new PDO($this->dsn, $this->username, $this->password);
152 // 錯(cuò)誤模式為拋出 PDOException 異常
153 $this->pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
154 // 開啟查詢緩存
155 $this->pdo->setAttribute(PDO::ATTR_EMULATE_PREPARES, $this->isEmulate);
156 // 開啟持久連接
157 $this->pdo->setAttribute(PDO::ATTR_PERSISTENT, $this->isPersisten);
158
159 }
160
161 return $this->pdo;
162 }
163
164 /**
165 * 獲取數(shù)據(jù)庫(kù)驅(qū)動(dòng)名
166 *
167 * @return string
168 */
169 public function getDriverName()
170 {
171 return $this->driver;
172 }
173
174 /**
175 * 開始事務(wù)
176 */
177 public function transationBegin()
178 {
179 $this->isInTransation = $this->getPDO()->beginTransaction();
180 }
181
182 /**
183 * 提交事務(wù)
184 */
185 public function transationCommit()
186 {
187 if ($this->isInTransation) {
188 $this->getPDO()->commit();
189 } else {
190 trigger_error('transationBegin 應(yīng)該先于 transationCommit 調(diào)用');
191 }
192 }
193
194 /**
195 * 回滾事務(wù)
196 * @return bool
197 */
198 public function transationRollback()
199 {
200 if ($this->isInTransation) {
201 $this->getPDO()->rollBack();
202 } else {
203 trigger_error('transationBegin 應(yīng)該先于 transationRollback 調(diào)用');
204 }
205 }
206
207 /**
208 * 連接是否在事務(wù)中
209 *
210 * @return bool
211 */
212 public function isInTransation()
213 {
214 return $this->isInTransation;
215 }
216
217 /**
218 * 在事務(wù)中執(zhí)行回調(diào)函數(shù)
219 *
220 * @param function $callback 匿名函數(shù)或閉包函數(shù)
221 * @param bool $autoRollback 異常發(fā)生時(shí)是否自動(dòng)回滾
222 * @throws \PDOException
223 * @return bool
224 */
225 public function transationExecute($callback, $autoRollback = true)
226 {
227 try {
228 // 開始事務(wù)
229 $this->transationBegin();
230 // 調(diào)用回調(diào)函數(shù)
231 if (is_callable($callback)) {
232 $callback();
233 } else {
234 throw new InvalidArgumentException('$callback應(yīng)該為回調(diào)函數(shù)');
235 }
236 // 提交事務(wù)
237 return $this->transationCommit();
238 } catch(PDOException $pex) {
239 // 如果開啟了自動(dòng)回滾, 則捕捉到 PDO 異常時(shí)先回滾再拋出
240 if ($autoRollback) {
241 $this->transationRollback();
242 }
243 throw $pex;
244 }
245 }
246
247 /**
248 * 安全地?cái)嚅_數(shù)據(jù)庫(kù)連接
249 */
250 public function disconnect()
251 {
252 if ($this->pdo) {
253 // 檢查 PDO 是否已經(jīng)實(shí)例化,是則設(shè)置為null
254 $this->pdo = null;
255 }
256 }
257
258 /**
259 * 阻止克隆
260 */
261 public function __clone()
262 {
263 trigger_error('被阻止的 __clone 方法, Connector 是單例類');
264 }
265 }
閱讀(76)| 評(píng)論(2)
|      
喜歡 推薦 轉(zhuǎn)載

最近讀者

熱度

評(píng)論

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購(gòu)買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類似文章 更多

    福利一区二区视频在线| 亚洲精品偷拍视频免费观看| 欧美黄色成人真人视频| 国产精品一区二区丝袜| 在线欧洲免费无线码二区免费| 成人精品国产亚洲av久久| 好吊日视频这里都是精品| 亚洲中文字幕在线观看四区| 欧美日韩人妻中文一区二区 | 中文字幕有码视频熟女| 五月天丁香婷婷一区二区| 国产日韩欧美综合视频| 欧美成人精品国产成人综合| 亚洲欧美日本国产不卡| 美女黄片大全在线观看| 久一视频这里只有精品| 国产精品免费视频专区| 亚洲国产欧美精品久久| 国产在线一区二区三区不卡| 亚洲综合激情另类专区老铁性| 99香蕉精品视频国产版| 国产一级精品色特级色国产| 日韩免费成人福利在线| 两性色午夜天堂免费视频| av在线免费播放一区二区| 中文字幕中文字幕一区二区| 亚洲午夜福利不卡片在线| 最近的中文字幕一区二区| 国产精品福利一二三区| 成人精品视频在线观看不卡| 91麻豆精品欧美视频| 国产性色精品福利在线观看| 99国产高清不卡视频| 高清不卡一卡二卡区在线| 亚洲视频偷拍福利来袭| 亚洲成人久久精品国产| 精品久久综合日本欧美| 国产精品内射婷婷一级二级| 国产韩国日本精品视频| 国产综合香蕉五月婷在线| 久久精品a毛片看国产成人|