KumbiaPHP beta2-dev
Framework PHP en español
|
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 } 00118 00119 $this->id_connection = new mysqli($config['host'], $config['username'], $config['password'], $config['name'], $config['port']); 00120 if(mysqli_connect_error()) { //no se usa $object->error() ya que solo funciona a partir de 5.2.9 y 5.3 00121 throw new KumbiaException(mysqli_connect_error()); 00122 } else { 00123 //Selecciona charset 00124 if(isset($config['charset'])){ 00125 $this->id_connection->set_charset($config['charset']); 00126 } 00127 return TRUE; 00128 } 00129 } 00130 00137 public function query($sql_query){ 00138 $this->debug($sql_query); 00139 if($this->logger){ 00140 Logger::debug($sql_query); 00141 } 00142 if(!$this->id_connection){ 00143 $this->connect(); 00144 if(!$this->id_connection){ 00145 return false; 00146 } 00147 } 00148 $this->last_query = $sql_query; 00149 if($result_query = mysqli_query($this->id_connection, $sql_query)){ 00150 $this->last_result_query = $result_query; 00151 return $result_query; 00152 } else { 00153 $this->last_result_query = false; 00154 throw new KumbiaException($this->error(" al ejecutar <em>\"$sql_query\"</em>")); 00155 } 00156 } 00157 00163 public function close(){ 00164 if($this->id_connection) { 00165 return mysqli_close($this->id_connection); 00166 } 00167 } 00168 00176 public function fetch_array($result_query='', $opt=MYSQLI_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()); 00215 } 00216 return false; 00217 } 00218 00226 public function field_name($number, $result_query=''){ 00227 if(!$this->id_connection){ 00228 return false; 00229 } 00230 if(!$result_query){ 00231 $result_query = $this->last_result_query; 00232 if(!$result_query){ 00233 return false; 00234 } 00235 } 00236 if(($fieldName = mysqli_field_seek($result_query, $number))!==false){ 00237 $field = mysqli_fetch_field($result_query); 00238 return $field->name; 00239 } else { 00240 throw new KumbiaException($this->error()); 00241 } 00242 return false; 00243 } 00244 00245 00253 public function data_seek($number, $result_query=''){ 00254 if(!$result_query){ 00255 $result_query = $this->last_result_query; 00256 if(!$result_query){ 00257 return false; 00258 } 00259 } 00260 if(($success = mysqli_data_seek($result_query, $number))!==false){ 00261 return $success; 00262 } else { 00263 throw new KumbiaException($this->error()); 00264 } 00265 return false; 00266 } 00267 00274 public function affected_rows($result_query=''){ 00275 if(($numberRows = mysqli_affected_rows($this->id_connection))!==false){ 00276 return $numberRows; 00277 } else { 00278 throw new KumbiaException($this->error()); 00279 } 00280 return false; 00281 } 00282 00288 public function error($err=''){ 00289 $this->last_error = mysqli_error($this->id_connection) ? mysqli_error($this->id_connection) : "[Error Desconocido en MySQL: $err]"; 00290 $this->last_error.= $err; 00291 if($this->logger){ 00292 Logger::error($this->last_error); 00293 } 00294 return $this->last_error; 00295 } 00296 00302 public function no_error(){ 00303 return mysqli_errno($this->id_connection); 00304 } 00305 00311 public function last_insert_id($table='', $primary_key=''){ 00312 if(!$this->id_connection){ 00313 return false; 00314 } 00315 return mysqli_insert_id($this->id_connection); 00316 } 00317 00324 public function table_exists($table, $schema=''){ 00325 $table = addslashes("$table"); 00326 if($schema==''){ 00327 $num = $this->fetch_one("select count(*) from information_schema.tables where table_name = '$table'"); 00328 } else { 00329 $schema = addslashes("$schema"); 00330 $num = $this->fetch_one("select count(*) from information_schema.tables where table_name = '$table' and table_schema = '$schema'"); 00331 } 00332 return $num[0]; 00333 } 00334 00341 public function limit($sql){ 00342 $params = Util::getParams(func_get_args()); 00343 $sql_new = $sql; 00344 00345 if(isset($params['limit']) && is_numeric($params['limit'])){ 00346 $sql_new.=" LIMIT $params[limit]"; 00347 } 00348 00349 if(isset($params['offset']) && is_numeric($params['offset'])){ 00350 $sql_new.=" OFFSET $params[offset]"; 00351 } 00352 00353 return $sql_new; 00354 } 00355 00362 public function drop_table($table, $if_exists=true){ 00363 if($if_exists){ 00364 return $this->query("DROP TABLE IF EXISTS $table"); 00365 } else { 00366 return $this->query("DROP TABLE $table"); 00367 } 00368 } 00369 00383 public function create_table($table, $definition, $index=array()){ 00384 $create_sql = "CREATE TABLE $table ("; 00385 if(!is_array($definition)){ 00386 throw new KumbiaException("Definición invalida para crear la tabla '$table'"); 00387 } 00388 $create_lines = array(); 00389 $index = array(); 00390 $unique_index = array(); 00391 $primary = array(); 00392 $not_null = ""; 00393 $size = ""; 00394 foreach($definition as $field => $field_def){ 00395 if(isset($field_def['not_null'])){ 00396 $not_null = $field_def['not_null'] ? 'NOT NULL' : ''; 00397 } else { 00398 $not_null = ""; 00399 } 00400 if(isset($field_def['size'])){ 00401 $size = $field_def['size'] ? '('.$field_def['size'].')' : ''; 00402 } else { 00403 $size = ""; 00404 } 00405 if(isset($field_def['index'])){ 00406 if($field_def['index']){ 00407 $index[] = "INDEX(`$field`)"; 00408 } 00409 } 00410 if(isset($field_def['unique_index'])){ 00411 if($field_def['unique_index']){ 00412 $index[] = "UNIQUE(`$field`)"; 00413 } 00414 } 00415 if(isset($field_def['primary'])){ 00416 if($field_def['primary']){ 00417 $primary[] = "`$field`"; 00418 } 00419 } 00420 if(isset($field_def['auto'])){ 00421 if($field_def['auto']){ 00422 $field_def['extra'] = isset($field_def['extra']) ? $field_def['extra']." AUTO_INCREMENT" : "AUTO_INCREMENT"; 00423 } 00424 } 00425 if(isset($field_def['extra'])){ 00426 $extra = $field_def['extra']; 00427 } else { 00428 $extra = ""; 00429 } 00430 $create_lines[] = "`$field` ".$field_def['type'].$size.' '.$not_null.' '.$extra; 00431 } 00432 $create_sql.= join(',', $create_lines); 00433 $last_lines = array(); 00434 if(count($primary)){ 00435 $last_lines[] = 'PRIMARY KEY('.join(",", $primary).')'; 00436 } 00437 if(count($index)){ 00438 $last_lines[] = join(',', $index); 00439 } 00440 if(count($unique_index)){ 00441 $last_lines[] = join(',', $unique_index); 00442 } 00443 if(count($last_lines)){ 00444 $create_sql.= ','.join(',', $last_lines).')'; 00445 } 00446 return $this->query($create_sql); 00447 00448 } 00449 00455 public function list_tables(){ 00456 return $this->fetch_all("SHOW TABLES"); 00457 } 00458 00465 public function describe_table($table, $schema=''){ 00466 if($schema==''){ 00467 return $this->fetch_all("DESCRIBE `$table`"); 00468 } else { 00469 return $this->fetch_all("DESCRIBE `$schema`.`$table`"); 00470 } 00471 } 00472 }