<?php |
002 | /** |
003 | * @throws Error |
004 | * PDO数据库 |
005 | */ |
006 |
007 | class
PdoDb extends DatabaseAbstract |
008 | { |
009 | /** |
010 | * PDO实例 |
011 | * @var PDO |
012 | */ |
013 | protected
$DB; |
014 | /** |
015 | * PDO准备语句 |
016 | * @var PDOStatement |
017 | */ |
018 | protected
$Stmt; |
019 | /** |
020 | * 最后的SQL语句 |
021 | * @var string |
022 | */ |
023 | protected
$Sql; |
024 | /** |
025 | * 配置信息 $config=array('dsn'=>xxx,'name'=>xxx,'password'=>xxx,'option'=>xxx) |
026 | * @var array |
027 | */ |
028 | protected
$Config; |
029 |
030 | /** |
031 | * 构造函数 |
032 | * @param array $config |
033 | */ |
034 | public
function __construct($config) |
035 | { |
036 | $this->Config =
$config; |
037 | } |
038 |
039 |
040 | /** |
041 | * 连接数据库 |
042 | * @return void |
043 | */ |
044 | public
function connect() |
045 | { |
046 | $this->DB =
new PDO($this->Config['dsn'],
$this->Config['name'],
$this->Config['password'],
$this->Config['option']); |
047 | //默认把结果序列化成stdClass |
048 | $this->DB->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_OBJ); |
049 | //自己写代码捕获Exception |
050 | $this->DB->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_SILENT); |
051 | } |
052 |
053 | /** |
054 | * 断开连接 |
055 | * @return void |
056 | */ |
057 | public
function disConnect() |
058 | { |
059 | $this->DB = null; |
060 | $this->Stmt = null; |
061 | } |
062 |
063 | /** |
064 | * 执行sql,返回新加入的id |
065 | * @param string $statement |
066 | * @return string |
067 | */ |
068 | public
function exec($statement) |
069 | { |
070 | if
($this->DB->exec($statement)) { |
071 | $this->Sql =
$statement; |
072 | return
$this->lastId(); |
073 | } |
074 | $this->errorMessage(); |
075 | } |
076 |
077 | /** |
078 | * 查询sql |
079 | * @param string $statement |
080 | * @return PdoDb |
081 | */ |
082 | public
function query($statement) |
083 | { |
084 | $res
= $this->DB->query($statement); |
085 | if
($res) { |
086 | $this->Stmt =
$res; |
087 | $this->Sql =
$statement; |
088 | return
$this; |
089 | } |
090 | $this->errorMessage(); |
091 | } |
092 |
093 | /** |
094 | * 序列化一次数据 |
095 | * @return mixed |
096 | */ |
097 | public
function fetchOne() |
098 | { |
099 | return
$this->Stmt->fetch(); |
100 | } |
101 |
102 | /** |
103 | * 序列化所有数据 |
104 | * @return array |
105 | */ |
106 | public
function fetchAll() |
107 | { |
108 | return
$this->Stmt->fetchAll(); |
109 | } |
110 |
111 | /** |
112 | * 最后添加的id |
113 | * @return string |
114 | */ |
115 | public
function lastId() |
116 | { |
117 | return
$this->DB->lastInsertId(); |
118 | } |
119 |
120 | /** |
121 | * 影响的行数 |
122 | * @return int |
123 | */ |
124 | public
function affectRows() |
125 | { |
126 | return
$this->Stmt->rowCount(); |
127 | } |
128 |
129 | /** |
130 | * 预备语句 |
131 | * @param string $statement |
132 | * @return PdoDb |
133 | */ |
134 | public
function prepare($statement) |
135 | { |
136 | $res
= $this->DB->prepare($statement); |
137 | if
($res) { |
138 | $this->Stmt =
$res; |
139 | $this->Sql =
$statement; |
140 | return
$this; |
141 | } |
142 | $this->errorMessage(); |
143 | } |
144 |
145 | /** |
146 | * 绑定数据 |
147 | * @param array $array |
148 | * @return PdoDb |
149 | */ |
150 | public
function bindArray($array) |
151 | { |
152 | foreach
($array
as $k =>
$v) { |
153 | if
(is_array($v)) { |
154 | //array的有效结构 array('value'=>xxx,'type'=>PDO::PARAM_XXX) |
155 | $this->Stmt->bindValue($k
+ 1, $v['value'],
$v['type']); |
156 | }
else { |
157 | $this->Stmt->bindValue($k
+ 1, $v, PDO::PARAM_STR); |
158 | } |
159 | } |
160 | return
$this; |
161 | } |
162 |
163 | /** |
164 | * 执行预备语句 |
165 | * @return bool |
166 | */ |
167 | public
function execute() |
168 | { |
169 | if
($this->Stmt->execute()) { |
170 | return
true; |
171 | } |
172 | $this->errorMessage(); |
173 | } |
174 |
175 | /** |
176 | * 开启事务 |
177 | * @return bool |
178 | */ |
179 | public
function beginTransaction() |
180 | { |
181 | return
$this->DB->beginTransaction(); |
182 | } |
183 |
184 | /** |
185 | * 执行事务 |
186 | * @return bool |
187 | */ |
188 | public
function commitTransaction() |
189 | { |
190 | return
$this->DB->commit(); |
191 | } |
192 |
193 | /** |
194 | * 回滚事务 |
195 | * @return bool |
196 | */ |
197 | public
function rollbackTransaction() |
198 | { |
199 | return
$this->DB->rollBack(); |
200 | } |
201 |
202 | /** |
203 | * 抛出错误 |
204 | * @throws Error |
205 | * @return void |
206 | */ |
207 | public
function errorMessage() |
208 | { |
209 | $msg
= $this->DB->errorInfo(); |
210 | throw
new Error('数据库错误:'
. $msg[2]); |
211 | } |
212 |
213 | //--------------------- |
214 | /** |
215 | * 单例实例 |
216 | * @var PdoDb |
217 | */ |
218 | protected
static $_instance; |
219 |
220 | /** |
221 | * 默认数据库 |
222 | * @static |
223 | * @param array $config |
224 | * @return PdoDb |
225 | */ |
226 | public
static function
instance($config) |
227 | { |
228 | if
(!self::$_instance
instanceof PdoDb) { |
229 | self::$_instance
= new
PdoDb($config); |
230 | self::$_instance->connect(); |
231 | } |
232 | return
self::$_instance; |
233 | } |
234 |
235 | //---------------------- |
236 |
237 | /** |
238 | * 获取PDO支持的数据库 |
239 | * @static |
240 | * @return array |
241 | */ |
242 | public
static function
getSupportDriver(){ |
243 | return
PDO::getAvailableDrivers(); |
244 | } |
245 | /** |
246 | * 获取数据库的版本信息 |
247 | * @return array |
248 | */ |
249 | public
function getDriverVersion(){ |
250 | $name
= $this->DB->getAttribute(PDO::ATTR_DRIVER_NAME); |
251 | return
array($name=>$this->DB->getAttribute(PDO::ATTR_CLIENT_VERSION)); |
252 | } |
253 |
254 | } |
1037

被折叠的 条评论
为什么被折叠?



