00001 <?php 00023 class DbMySQLi extends DbBase implements DbBaseInterface { 00024 00030 public $id_connection; 00031 00037 public $last_result_query; 00038 00044 private $last_query; 00050 public $last_error; 00051 00056 const DB_ASSOC = MYSQLI_ASSOC; 00057 00062 const DB_BOTH = MYSQLI_BOTH; 00063 00068 const DB_NUM = MYSQLI_NUM; 00069 00070 00075 const TYPE_INTEGER = 'INTEGER'; 00076 00081 const TYPE_DATE = 'DATE'; 00082 00087 const TYPE_VARCHAR = 'VARCHAR'; 00088 00093 const TYPE_DECIMAL = 'DECIMAL'; 00094 00099 const TYPE_DATETIME = 'DATETIME'; 00100 00105 const TYPE_CHAR = 'CHAR'; 00106 00113 public function connect($config){ 00114 00115 if(!extension_loaded('mysqli')){ 00116 throw new KumbiaException('Debe cargar la extensión de PHP llamada php_mysqli'); 00117 return false; 00118 } 00119 00120 if($this->id_connection = mysqli_connect($config['host'], $config['username'], $config['password'], $config['name'], $config['port'])){ 00121 return true; 00122 } else { 00123 throw new KumbiaException($this->error(), $this->no_error(), false); 00124 return false; 00125 } 00126 00127 } 00128 00135 public function query($sql_query){ 00136 $this->debug($sql_query); 00137 if($this->logger){ 00138 Logger::debug($sql_query); 00139 } 00140 if(!$this->id_connection){ 00141 $this->connect(); 00142 if(!$this->id_connection){ 00143 return false; 00144 } 00145 } 00146 $this->last_query = $sql_query; 00147 if($result_query = mysqli_query($this->id_connection, $sql_query)){ 00148 $this->last_result_query = $result_query; 00149 return $result_query; 00150 } else { 00151 $this->last_result_query = false; 00152 throw new KumbiaException($this->error(" al ejecutar <i>\"$sql_query\"</i>"), $this->no_error()); 00153 return false; 00154 } 00155 } 00156 00162 public function close(){ 00163 if($this->id_connection) { 00164 return mysqli_close($this->id_connection); 00165 } 00166 } 00167 00175 public function fetch_array($result_query='', $opt=''){ 00176 if($opt==='') $opt = db::DB_BOTH; 00177 if(!$this->id_connection){ 00178 return false; 00179 } 00180 if(!$result_query){ 00181 $result_query = $this->last_result_query; 00182 if(!$result_query){ 00183 return false; 00184 } 00185 } 00186 return mysqli_fetch_array($result_query, $opt); 00187 } 00188 00194 public function __construct($config){ 00195 $this->connect($config); 00196 } 00197 00201 public function num_rows($result_query=''){ 00202 if(!$this->id_connection){ 00203 return false; 00204 } 00205 if(!$result_query){ 00206 $result_query = $this->last_result_query; 00207 if(!$result_query){ 00208 return false; 00209 } 00210 } 00211 if(($number_rows = mysqli_num_rows($result_query))!==false){ 00212 return $number_rows; 00213 } else { 00214 throw new KumbiaException($this->error(), $this->no_error()); 00215 return false; 00216 } 00217 return false; 00218 } 00219 00227 public function field_name($number, $result_query=''){ 00228 if(!$this->id_connection){ 00229 return false; 00230 } 00231 if(!$result_query){ 00232 $result_query = $this->last_result_query; 00233 if(!$result_query){ 00234 return false; 00235 } 00236 } 00237 if(($fieldName = mysqli_field_seek($result_query, $number))!==false){ 00238 $field = mysqli_fetch_field($result_query); 00239 return $field->name; 00240 } else { 00241 throw new KumbiaException($this->error(), $this->no_error()); 00242 return false; 00243 } 00244 return false; 00245 } 00246 00247 00255 public function data_seek($number, $result_query=''){ 00256 if(!$result_query){ 00257 $result_query = $this->last_result_query; 00258 if(!$result_query){ 00259 return false; 00260 } 00261 } 00262 if(($success = mysqli_data_seek($result_query, $number))!==false){ 00263 return $success; 00264 } else { 00265 throw new KumbiaException($this->error(), $this->no_error()); 00266 return false; 00267 } 00268 return false; 00269 } 00270 00277 public function affected_rows($result_query=''){ 00278 if(($numberRows = mysqli_affected_rows($this->id_connection))!==false){ 00279 return $numberRows; 00280 } else { 00281 throw new KumbiaException($this->error(), $this->no_error()); 00282 return false; 00283 } 00284 return false; 00285 } 00286 00292 public function error($err=''){ 00293 $this->last_error = mysqli_error($this->id_connection) ? mysqli_error($this->id_connection) : "[Error Desconocido en MySQL: $err]"; 00294 $this->last_error.= $err; 00295 if($this->logger){ 00296 Logger::error($this->last_error); 00297 } 00298 return $this->last_error; 00299 } 00300 00306 public function no_error(){ 00307 return mysqli_errno($this->id_connection); 00308 } 00309 00315 public function last_insert_id($table='', $primary_key=''){ 00316 if(!$this->id_connection){ 00317 return false; 00318 } 00319 return mysqli_insert_id($this->id_connection); 00320 } 00321 00328 public function table_exists($table, $schema=''){ 00329 $table = addslashes("$table"); 00330 if($schema==''){ 00331 $num = $this->fetch_one("select count(*) from information_schema.tables where table_name = '$table'"); 00332 } else { 00333 $schema = addslashes("$schema"); 00334 $num = $this->fetch_one("select count(*) from information_schema.tables where table_name = '$table' and table_schema = '$schema'"); 00335 } 00336 return $num[0]; 00337 } 00338 00345 public function limit($sql){ 00346 $params = Util::getParams(func_get_args()); 00347 $sql_new = $sql; 00348 00349 if(isset($params['limit']) && is_numeric($params['limit'])){ 00350 $sql_new.=" LIMIT $params[limit]"; 00351 } 00352 00353 if(isset($params['offset']) && is_numeric($params['offset'])){ 00354 $sql_new.=" OFFSET $params[offset]"; 00355 } 00356 00357 return $sql_new; 00358 } 00359 00366 public function drop_table($table, $if_exists=true){ 00367 if($if_exists){ 00368 return $this->query("DROP TABLE IF EXISTS $table"); 00369 } else { 00370 return $this->query("DROP TABLE $table"); 00371 } 00372 } 00373 00387 public function create_table($table, $definition, $index=array()){ 00388 $create_sql = "CREATE TABLE $table ("; 00389 if(!is_array($definition)){ 00390 new KumbiaException("Definición invalida para crear la tabla '$table'"); 00391 return false; 00392 } 00393 $create_lines = array(); 00394 $index = array(); 00395 $unique_index = array(); 00396 $primary = array(); 00397 $not_null = ""; 00398 $size = ""; 00399 foreach($definition as $field => $field_def){ 00400 if(isset($field_def['not_null'])){ 00401 $not_null = $field_def['not_null'] ? 'NOT NULL' : ''; 00402 } else { 00403 $not_null = ""; 00404 } 00405 if(isset($field_def['size'])){ 00406 $size = $field_def['size'] ? '('.$field_def['size'].')' : ''; 00407 } else { 00408 $size = ""; 00409 } 00410 if(isset($field_def['index'])){ 00411 if($field_def['index']){ 00412 $index[] = "INDEX(`$field`)"; 00413 } 00414 } 00415 if(isset($field_def['unique_index'])){ 00416 if($field_def['unique_index']){ 00417 $index[] = "UNIQUE(`$field`)"; 00418 } 00419 } 00420 if(isset($field_def['primary'])){ 00421 if($field_def['primary']){ 00422 $primary[] = "`$field`"; 00423 } 00424 } 00425 if(isset($field_def['auto'])){ 00426 if($field_def['auto']){ 00427 $field_def['extra'] = isset($field_def['extra']) ? $field_def['extra']." AUTO_INCREMENT" : "AUTO_INCREMENT"; 00428 } 00429 } 00430 if(isset($field_def['extra'])){ 00431 $extra = $field_def['extra']; 00432 } else { 00433 $extra = ""; 00434 } 00435 $create_lines[] = "`$field` ".$field_def['type'].$size.' '.$not_null.' '.$extra; 00436 } 00437 $create_sql.= join(',', $create_lines); 00438 $last_lines = array(); 00439 if(count($primary)){ 00440 $last_lines[] = 'PRIMARY KEY('.join(",", $primary).')'; 00441 } 00442 if(count($index)){ 00443 $last_lines[] = join(',', $index); 00444 } 00445 if(count($unique_index)){ 00446 $last_lines[] = join(',', $unique_index); 00447 } 00448 if(count($last_lines)){ 00449 $create_sql.= ','.join(',', $last_lines).')'; 00450 } 00451 return $this->query($create_sql); 00452 00453 } 00454 00460 public function list_tables(){ 00461 return $this->fetch_all("SHOW TABLES"); 00462 } 00463 00470 public function describe_table($table, $schema=''){ 00471 if($schema==''){ 00472 return $this->fetch_all("DESCRIBE `$table`"); 00473 } else { 00474 return $this->fetch_all("DESCRIBE `$schema`.`$table`"); 00475 } 00476 } 00477 }