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