KumbiaPHP beta2-dev
Framework PHP en español
|
00001 <?php 00023 class DbMySQL extends DbBase implements DbBaseInterface { 00024 00030 public $id_connection; 00031 00037 public $last_result_query; 00038 00044 private $last_query; 00045 00051 public $last_error; 00052 00057 const DB_ASSOC = MYSQL_ASSOC; 00058 00063 const DB_BOTH = MYSQL_BOTH; 00064 00069 const DB_NUM = MYSQL_NUM; 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('mysql')){ 00116 throw new KumbiaException('Debe cargar la extensión de PHP llamada php_mysql'); 00117 } 00118 if(!isset($config['port']) || !$config['port']) { 00119 $config['port'] = 3306; 00120 } 00121 00122 if($this->id_connection = mysql_connect("{$config['host']}:{$config['port']}", $config['username'], $config['password'], true)){ 00123 if($config['name']!=='') { 00124 if(!mysql_select_db($config['name'], $this->id_connection)){ 00125 throw new KumbiaException($this->error()); 00126 } 00127 } 00128 //Selecciona charset 00129 if(isset($config['charset'])){ 00130 mysql_query("SET NAMES {$config['charset']}"); 00131 //mysql_set_charset($config['charset'],$this->id_connection); //Necesita mysql > 5.0.7 00132 } 00133 return true; 00134 } else { 00135 throw new KumbiaException($this->error()); 00136 } 00137 } 00138 00145 public function query($sql_query){ 00146 $this->debug($sql_query); 00147 if($this->logger){ 00148 Logger::debug($sql_query); 00149 } 00150 if(!$this->id_connection){ 00151 $this->connect(); 00152 if(!$this->id_connection){ 00153 return false; 00154 } 00155 } 00156 00157 $this->last_query = $sql_query; 00158 if($result_query = mysql_query($sql_query, $this->id_connection)){ 00159 $this->last_result_query = $result_query; 00160 return $result_query; 00161 } else { 00162 $this->last_result_query = false; 00163 throw new KumbiaException($this->error(" al ejecutar <em>\"$sql_query\"</em>")); 00164 } 00165 } 00166 00170 public function close(){ 00171 if($this->id_connection) { 00172 return mysql_close(); 00173 } 00174 return false; 00175 } 00176 00184 public function fetch_array($result_query='', $opt=MYSQL_BOTH){ 00185 if(!$this->id_connection){ 00186 return false; 00187 } 00188 if(!$result_query){ 00189 $result_query = $this->last_result_query; 00190 if(!$result_query){ 00191 return false; 00192 } 00193 } 00194 return mysql_fetch_array($result_query, $opt); 00195 } 00196 00202 public function __construct($config){ 00203 $this->connect($config); 00204 } 00205 00209 public function num_rows($result_query=''){ 00210 if(!$this->id_connection){ 00211 return false; 00212 } 00213 if(!$result_query){ 00214 $result_query = $this->last_result_query; 00215 if(!$result_query){ 00216 return false; 00217 } 00218 } 00219 if(($number_rows = mysql_num_rows($result_query))!==false){ 00220 return $number_rows; 00221 } else { 00222 throw new KumbiaException($this->error()); 00223 } 00224 return false; 00225 } 00226 00234 public function field_name($number, $result_query=''){ 00235 if(!$this->id_connection){ 00236 return false; 00237 } 00238 if(!$result_query){ 00239 $result_query = $this->last_result_query; 00240 if(!$result_query){ 00241 return false; 00242 } 00243 } 00244 if(($fieldName = mysql_field_name($result_query, $number))!==false){ 00245 return $fieldName; 00246 } else { 00247 throw new KumbiaException($this->error()); 00248 } 00249 return false; 00250 } 00251 00252 00260 public function data_seek($number, $result_query=''){ 00261 if(!$result_query){ 00262 $result_query = $this->last_result_query; 00263 if(!$result_query){ 00264 return false; 00265 } 00266 } 00267 if(($success = mysql_data_seek($result_query, $number))!==false){ 00268 return $success; 00269 } else { 00270 throw new KumbiaException($this->error()); 00271 } 00272 return false; 00273 } 00274 00281 public function affected_rows($result_query=''){ 00282 if(($numberRows = mysql_affected_rows())!==false){ 00283 return $numberRows; 00284 } else { 00285 $this->lastError = $this->error(); 00286 throw new KumbiaException($this->error()); 00287 } 00288 return false; 00289 } 00290 00296 public function error($err=''){ 00297 if(!$this->id_connection){ 00298 $this->last_error = mysql_error() ? mysql_error() : "[Error Desconocido en MySQL: $err]"; 00299 if($this->logger){ 00300 Logger::error($this->last_error); 00301 } 00302 return $this->last_error; 00303 } 00304 $this->last_error = mysql_error() ? mysql_error() : "[Error Desconocido en MySQL: $err]"; 00305 $this->last_error.= $err; 00306 if($this->logger){ 00307 Logger::error($this->last_error); 00308 } 00309 return $this->last_error; 00310 } 00311 00317 public function no_error(){ 00318 if(!$this->id_connection){ 00319 return false; 00320 } 00321 return mysql_errno(); 00322 } 00323 00329 public function last_insert_id($table='', $primary_key=''){ 00330 if(!$this->id_connection){ 00331 return false; 00332 } 00333 return mysql_insert_id($this->id_connection); 00334 } 00335 00342 public function table_exists($table, $schema=''){ 00343 $table = addslashes("$table"); 00344 if($schema==''){ 00345 $num = $this->fetch_one("SELECT COUNT(*) FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = '$table'"); 00346 } else { 00347 $schema = addslashes("$schema"); 00348 $num = $this->fetch_one("SELECT COUNT(*) FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = '$table' AND TABLE_SCHEMA = '$schema'"); 00349 } 00350 return $num[0]; 00351 } 00352 00359 public function limit($sql){ 00360 $params = Util::getParams(func_get_args()); 00361 $sql_new = $sql; 00362 00363 if(isset($params['limit']) && is_numeric($params['limit'])){ 00364 $sql_new.=" LIMIT $params[limit]"; 00365 } 00366 00367 if(isset($params['offset']) && is_numeric($params['offset'])){ 00368 $sql_new.=" OFFSET $params[offset]"; 00369 } 00370 00371 return $sql_new; 00372 } 00373 00380 public function drop_table($table, $if_exists=true){ 00381 if($if_exists){ 00382 return $this->query("DROP TABLE IF EXISTS $table"); 00383 } else { 00384 return $this->query("DROP TABLE $table"); 00385 } 00386 } 00387 00401 public function create_table($table, $definition, $index=array()){ 00402 $create_sql = "CREATE TABLE $table ("; 00403 if(!is_array($definition)){ 00404 throw new KumbiaException("Definición invalida para crear la tabla '$table'"); 00405 } 00406 $create_lines = array(); 00407 $index = array(); 00408 $unique_index = array(); 00409 $primary = array(); 00410 $not_null = ""; 00411 $size = ""; 00412 foreach($definition as $field => $field_def){ 00413 if(isset($field_def['not_null'])){ 00414 $not_null = $field_def['not_null'] ? 'NOT NULL' : ''; 00415 } else { 00416 $not_null = ""; 00417 } 00418 if(isset($field_def['size'])){ 00419 $size = $field_def['size'] ? '('.$field_def['size'].')' : ''; 00420 } else { 00421 $size = ""; 00422 } 00423 if(isset($field_def['index'])){ 00424 if($field_def['index']){ 00425 $index[] = "INDEX(`$field`)"; 00426 } 00427 } 00428 if(isset($field_def['unique_index'])){ 00429 if($field_def['unique_index']){ 00430 $index[] = "UNIQUE(`$field`)"; 00431 } 00432 } 00433 if(isset($field_def['primary'])){ 00434 if($field_def['primary']){ 00435 $primary[] = "`$field`"; 00436 } 00437 } 00438 if(isset($field_def['auto'])){ 00439 if($field_def['auto']){ 00440 $field_def['extra'] = isset($field_def['extra']) ? $field_def['extra']." AUTO_INCREMENT" : "AUTO_INCREMENT"; 00441 } 00442 } 00443 if(isset($field_def['extra'])){ 00444 $extra = $field_def['extra']; 00445 } else { 00446 $extra = ""; 00447 } 00448 $create_lines[] = "`$field` ".$field_def['type'].$size.' '.$not_null.' '.$extra; 00449 } 00450 $create_sql.= join(',', $create_lines); 00451 $last_lines = array(); 00452 if(count($primary)){ 00453 $last_lines[] = 'PRIMARY KEY('.join(",", $primary).')'; 00454 } 00455 if(count($index)){ 00456 $last_lines[] = join(',', $index); 00457 } 00458 if(count($unique_index)){ 00459 $last_lines[] = join(',', $unique_index); 00460 } 00461 if(count($last_lines)){ 00462 $create_sql.= ','.join(',', $last_lines).')'; 00463 } 00464 return $this->query($create_sql); 00465 00466 } 00467 00473 public function list_tables(){ 00474 return $this->fetch_all("SHOW TABLES"); 00475 } 00476 00483 public function describe_table($table, $schema=''){ 00484 if($schema==''){ 00485 return $this->fetch_all("DESCRIBE `$table`"); 00486 } else { 00487 return $this->fetch_all("DESCRIBE `$schema`.`$table`"); 00488 } 00489 } 00490 00498 public function fetch_object($result_query=null, $class='stdClass'){ 00499 if(!$result_query){ 00500 $result_query = $this->last_result_query; 00501 } 00502 return mysql_fetch_object($result_query, $class); 00503 } 00504 }