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 }