Ver Mensaje Individual
  #27  
Antiguo 29-05-2006
Avatar de dec
dec dec is offline
Moderador
 
Registrado: dic 2004
Ubicación: Alcobendas, Madrid, España
Posts: 13.141
Reputación: 36
dec Tiene un aura espectaculardec Tiene un aura espectacular
Hola,

Ya comprendo por dónde querías ir Kayetano. En realidad podría utilizarse la función "mysql_fetch_assoc", con lo que ya nos quedaría un Array asociativo, mucho más "parecido" a lo que tenemos que el Array numérico que obtendríamos con "mysql_fetch_array".

En todo caso el tema estaba en "traducir" el objeto resultado de la función "mysql_fetch_field". De hecho ahora mismo en la clase BDatos de que venimos hablando no se utilizan Arrays, sino que se traduce el objeto, mejor dicho, las propiedades del objeto devuelto por la función "mysql_fetch_field" al español.

Para ello utilizo una clase auxiliar... pero no sé si fruto de mi ignorancia, de no ver otra forma de hacerlo, al menos de momento. El caso es que lo se pretendía conseguir era traducir los nombres de las propiedades del objeto mencionado.

Ahora mismo viene quedando el código fuente como se verá. Lo siguiente es el método que puede utilizarse para obtener información sobre las columnas (campos) de una determinada tabla de una base de datos:

Código PHP:
  /**
   * Devuelve información acerca de los campos de una
   * determinada tabla de la base de datos. El resul-
   * tado de este método puede consistir en un Array
   * de Objetos, un Array de Arrays asociativos o un
   * Array de Arrays numéricos.
   * 
   * @param string $tabla Nombre de la tabla
   * @return mixed array
   * @access public
   */
  
function Campos($tabla$tipoSalida TS_OBJETO
  {
    
// Comprobamos que se especifica una tabla
    
if(!isset($tabla) || $tabla == '')
      return 
false;
    
    
// Preparamos el resultado
    
$resultadoMetodo   = array();    
           
    
/* Nótese lo "mágico" de la consulta.
       (Gracias Román ;)
    */
    
$sql "SELECT * FROM $tabla WHERE 0 = 1";
    
    
/* ¿Porqué no utilizamos el método Consulta conque cuenta
       esta misma clase para obtener los resultados? La razón
       está en que el método Consulta no devuelve un "recurso"
       como lo hace "mysql_query", así que no podríamos luego
       utilizar el resultado más abajo, como se verá.
    */
    
$resultadoConsulta = @mysql_query($sql$this->enlaceConexionBd);
        
    
// ¿Algún error en la sala?
        
if(@mysql_error($this->enlaceConexionBd))
        {
            
$this->Error(@mysql_error($this->enlaceConexionBd));
            return 
false;
        }              

        
/* Es aquí donde necesitamos un resultado como el que nos
           devuelve la función "mysql_query", para utilizarlo en
           la función "mysql_fetch_field".
        */
    
while ($datosCampo = @mysql_fetch_field($resultadoConsulta)) 
    {            
      
/* Esto puede ser un poco estúpido. Lo único que
         nos ofrece la clase "InfoCampo" es un objeto
         cuyas propiedades son las mismas que el objeto
         que ahora contiene "$datosCampo". La diferencia
         está en que en el objeto "InfoCampo" sus propie-
         dades están en español. ¿Será esto útil?           
      */
      
$infoCampo = new InfoCampo($datosCampo);
      
      
/* A continuación toca mirar por el tipo de salida
         que se precisa, por defecto un Array de objetos,
         como en el resto de métodos de esta clase que
         devuelven datos.
      */
      
switch ($tipoSalida
      {
          case 
TS_ARRAY_ASOCIATIVO:
              
$resultadoMetodo[] = get_object_vars($infoCampo);
              break;
        case 
TS_ARRAY_NUMERICO:
          
$resultadoMetodo[] = array_values(get_object_vars($infoCampo));
          break;
          case 
TS_OBJETO:
          default:
            
$resultadoMetodo[] = $infoCampo;
            break;
      }
    }
     
    
// Liberamos los resultados de la consulta
    
@mysql_free_result($resultadoConsulta);   
       
    
// Y devolvemos el resultado del método
    
return $resultadoMetodo;     
  } 
Y, el objeto que obtenemos como resultado se conforma a partir de la clase "InfoCampo", que es esta lindeza de aquí:

Código PHP:
/**
 * 
 * @name InfoCampo
 * @access private
 * @package phpclasses
 * @version 0.1 26/5/2006
 * @author David Esperalta
 * @link mailto:[email protected]
 * 
 * @copyright 2006 David Esperalta
 * 
 */
class InfoCampo 
{
  
/**
   * Nombre del campo
   *
   * @var string
   * @access public
   * 
   */
  
var $nombre '';

  
/**
   * Nombre de la tabla
   *
   * @var string
   * @access public
   * 
   */  
  
var $tabla '';

  
/**
   * Valor por defecto
   *
   * @var string
   * @access public
   * 
   */    
  
var $porDefecto '';
  
  
/**
   * Máxima longitud
   *
   * @var integer
   * @access public
   * 
   */    
  
var $maxLogitud 0;

  
/**
   * ¿Admite valores nulos?
   *
   * @var integer
   * @access public
   * 
   */    
  
var $admiteNulos 0;

  
/**
   * ¿Es clave primaria?
   *
   * @var integer
   * @access public
   * 
   */    
  
var $esClavePrimaria 0;
  
  
/**
   * ¿Es clave única?
   *
   * @var integer
   * @access public
   * 
   */      
  
var $esClaveUnica 0;
  
  
/**
   * ¿Es clave múltiple?
   *
   * @var integer
   * @access public
   * 
   */      
  
var $esClaveMultiple 0;
  
  
/**
   * ¿Es de tipo numérico?
   *
   * @var integer
   * @access public
   * 
   */      
  
var $esNumerico 0;
  
  
/**
   * ¿Es de tipo "Blob"?
   *
   * @var integer
   * @access public
   * 
   */      
  
var $esBlob 0;

  
/**
   * Nombre del tipo
   *
   * @var string
   * @access public
   * 
   */      
  
var $tipo '';
  
  
/**
   * ¿Tiene signo?
   *
   * @var integer
   * @access public
   * 
   */      
  
var $sinSigno 0;
  
  
/**
   * ¿Se rellena con ceros?
   *
   * @var integer
   * @access public
   * 
   */
  
var $rellenoCeros 0;   
  
  
/**
   * Constructor de la clase
   *
   * El parámetro ha de ser un objeto del tipo
   * que devuelve la función "mysql_fech_field".
   * 
   * @param Object $datosCampo
   * @return InfoCampo
   * @access public
   * 
   */
  
function InfoCampo($datosCampo)
  {
    if(!isset(
$datosCampo))
      return 
null;
    else
      
$this->Cargar($datosCampo);  
    return 
true;
  }
  
  
/**
   * Traladamos las propiedades del objeto que
   * se pasa como parámetro a este propio objeto.
   * 
   * En realidad, como puede verse, lo único que
   * hacemos es "traducir" las propiedades del in-
   * glés al español.
   *
   * @param Object $datosCampo
   * @access private
   * 
   */
  
function Cargar($datosCampo)
  {
    
$this->nombre          $datosCampo->name;
    
$this->tabla           $datosCampo->table;
    
$this->porDefecto      $datosCampo->def;
    
$this->maxLogitud      $datosCampo->max_length;
    
$this->admiteNulos     $datosCampo->not_null;
    
$this->esClavePrimaria $datosCampo->primary_key;
    
$this->esClaveUnica    $datosCampo->unique_key;
    
$this->esClaveMultiple $datosCampo->multiple_key;
    
$this->esNumerico      $datosCampo->numeric;
    
$this->esBlob          $datosCampo->blob;
    
$this->tipo            $datosCampo->type;
    
$this->sinSigno        $datosCampo->unsigned;
    
$this->rellenoCeros    $datosCampo->zerofill;
  }

// class InfoCampo 
__________________
David Esperalta
www.decsoftutils.com
Responder Con Cita