-
Notifications
You must be signed in to change notification settings - Fork 0
/
DataBase.class.php
executable file
·247 lines (215 loc) · 7.66 KB
/
DataBase.class.php
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
<?php
###########################################################################################################
#DataBase.class.php
#Extensão da Classe PDO.
#Com médotos para auxilio de execução de queries.
#Página Orientada a Objetos
#Desenvolvido pela Head Trust
#Criado em: 09/05/2008
#Modificado em: (26/08/2008) - (13/10/2008) - (19/10/2008) - (20/10/2008) - (30/10/2008)- (14/12/2008)
# - (25/12/2008) - (27/02/2009) - (16/03/2009) - (18/03/2009) - (06/05/2009) - (03/07/2009) - (13/05/2010)
# - (07/02/2011)
###########################################################################################################
class DataBase extends PDO {
private $debug, $debugCode; //Atributos de Debug
private $showQuery = 0;//Status do ShowQuery
private $affected = array(), $countedRows = array(), $fetchedResult = array(), $fetchList = array(), $numberResult = 0; //Atributos de resultados de operações
static $_SHOW_OFF = 0, $_SHOW_ON = 1;
/*
* Métodos get e set dos atributos para acesso externo
*/
public function getDbServer(){
return $this->dbServer;
}
public function setDbServer($server){
$this->dbServer = $server;
}
public function getDbLog(){
return $this->dbLog;
}
public function setDbLog($log){
$this->dbLog = $log;
}
public function getDbPass(){
return $this->dbPass;
}
public function setDbPass($pass){
$this->dbPass = $pass;
}
public function getDebug(){
return $this->debug;
}
public function setDebug($debug){
$this->debug = $debug;
}
/*
* Fim dos métodos get e set
*/
//Construtor da classe DataBase :: DataBase()
public function __construct($dbServer, $dbLog, $dbPass){
try{
parent::__construct($dbServer, $dbLog, $dbPass);
} catch(Exception $e){}
}
//Retorna um array com os resultados de uma query
//Parametros: Resultado do método query()
//mixed fetchArray ([int])
public function fetchArray($result = ''){
$numberResult = ($result == '') ? $this->numberResult : $result;
$key = $this->fetchList[$numberResult];
$this->fetchList[$numberResult]++;
if(array_key_exists($key,$this->fetchedResult[$numberResult])){
return $this->fetchedResult[$numberResult][$key];
} else {
$this->fetchList[$numberResult] = 0;
return false;
}
}
//Retorna um array com os resultados de uma query
//Parametros: Resultado do método query()
//mixed fetchAll ([int])
public function fetchAll($result = ''){
$numberResult = ($result == '') ? $this->numberResult : $result;
if(array_key_exists($key,$this->fetchedResult[$numberResult])){
return $this->fetchedResult[$numberResult];
} else {
$this->fetchList[$numberResult] = 0;
return false;
}
}
//Retorna a quantidade de linhas afetadas por uma query
//Parametros: Resultado do método query()
//mixedaffectedRows ([int])
public function affectedRows($result = ''){
$key = ($result == '') ? $this->numberResult : $result;
if(array_key_exists($key,$this->affected)){
return $this->affected[$key];
} else {
return false;
}
}
//Retorna a quantidade de linhas selecionadas por uma query
//Parametros: Resultado do método query()
//mixed numRows ([int])
public function numRows($result=''){
$key = ($result == '') ? $this->numberResult : $result;
if(array_key_exists($key,$this->countedRows)){
return $this->countedRows[$key];
} else {
return false;
}
}
//Retorna um único resultado de uma requisição query
//Parametros: Resultado do método query(), Posição do array, Posição do array ou chave do array associativo
//mixed fetchResult (int, int, mixed)
public function result($result, $position, $column){
if(array_key_exists($result,$this->fetchedResult)){
if(array_key_exists($position,$this->fetchedResult[$result])){
if(array_key_exists($column,$this->fetchedResult[$result][$position])){
return $this->fetchedResult[$result][$position][$column];
} else {
return false;
}
} else {
return false;
}
} else {
return false;
}
}
public function showQuery($status = 1){
$this->showQuery = $status;
}
//Executa uma query, o parametro bind se for passado irá fazer um bind automático conforme o array
//Parametros: (Query a ser executada, Array de binds)
//mixed query (string $query , [ array $bind ] )
public function query($query, array $bind = array()){
if($this->showQuery == self::$_SHOW_ON){
echo $query . '<br />';
}
//Escolhe um número aleatóriamente para o sistema descançar.
$state = parent::prepare($query);
//É feito um descanço ao sistema
// System::noExhaust();
if($state->execute($bind)){
$this->analysis($state,$query);
return $this->numberResult;
} else {
$this->debug($state->errorInfo(),$query);
return false;
}
}
//Analisa a query e verifica quais valores devem ser atribuido a quais atributos.
//Parametros (Objeto PDO, Query executada)
//void analysis (Object, String)
private function analysis(PDOStatement $state, $query){
$numResult = ++$this->numberResult;
$words = explode(' ', $query);
$haystack = array('select', 'show', 'describe', 'explain', 'load', 'flush', 'reset', 'status', 'privileges', 'slave', 'user_resources', 'hosts', 'des_key_files');
if(!in_array(strtolower($words[0]), $haystack)){
$this->affected[$numResult] = $state->rowCount();
} else {
$results = $state->fetchAll();
$count = count($results);
$this->fetchList[$numResult] = 0;
$this->fetchedResult[$numResult] = $results;
$this->countedRows[$numResult] = $count;
}
}
//Pega um array de Queries e executa todas dentro de uma trasação
//Parametros (Array de queries a serem executadas, Array de valores para bind)
//bool transaction (Array, [Array])
public function transaction(array $queries, array $bind = array()){
parent::beginTransaction();
$count = count($queries);
for($i = 0; $i < $count; $i++){
$binding = (isset($bind[$i])) ? $bind[$i] : array();
$result = $this->query($queries[$i], $binding);
$results[] = ($result != false) ? $this->affectedRows($result) : false;
}
if(array_search(false, $results, 1) === false){
parent::commit();
return true;
} else {
parent::rollBack();
return false;
}
}
//Gera uma string contendo todos os erros que foram gerados
//Parametros: (Texto com o erro gerado, A query executada)
//void debug (String, String)
private function debug($errors, $query){
$this->debug .= "\n[" . ++$this->debugCode . "] Problemas com a execução da query\n";
$this->debug .= "Erro gerado (" . end($errors) . ")\n";
$this->debug .= "Query executada (" . $query . ")\n";
}
//Limpa todos os grupos atributos de resultados desta classe.
//Parametros: void
//void cleanResults (void)
public function cleanResults(){
$this->affected = array();
$this->countedRows = array();
$this->fetchedResult = array();
$this->fetchList = array();
$this->numberResult = null;
}
//Limpa um único grupo de atributos de resultados desta classe.
//Parametros (Valor retornado pelo método query)
//void cleanSingleResult (int)
public function cleanSingleResult($result){
if(array_key_exists($result, $this->affected)){
$this->affected[$result] = array();
}
if(array_key_exists($result, $this->countedRows)){
$this->countedRows[$result] = array();
}
if(array_key_exists($result, $this->$this->fetchedResult)){
$this->$this->fetchedResult[$result] = array();
}
if(array_key_exists($result, $this->$this->fetchList)){
$this->$this->fetchList[$result] = array();
}
}
public function __destruct(){}
}
?>