Introducción
Acabamos de ver cómo obtener un listado de tablas de MySQL a través de PHP usando PDO. Pues bien, ahora veamos algo más preciso o específico y es: cómo obtener un listado de las columnas que tiene una tabla usando PHP y PDO.
Es decir, obtener la estructura o campos de una tabla, no sus datos. Para ello igualmente usaremos una consulta.
Lo que traerá la consulta será el tipo de dato y el nombre del campo o columna, pero podemos modificarla para que traiga más o menos datos.
Columnas que tiene una tabla usando PHP y MySQL
Primero la consulta al motor
Bueno, la consulta es simple y muy parecida a la que vimos hace un momento.
Esta difiere del comando SHOW CREATE TABLE que vimos en el post de respaldar una base de datos porque obtiene las columnas de una forma limpia.
La consulta es:
SELECT COLUMN_NAME AS columna FROM
information_schema.columns WHERE
table_schema = 'nombre_de_tu_base_de_datos'
AND
table_name = 'nombre_de_la_tabla';
En ese caso usamos un alias para seleccionar el nombre de la columna como “columna”. Por cierto, podemos obtener otros datos, los cuales son:
- TABLE_CATALOG
- TABLE_SCHEMA
- TABLE_NAME
- COLUMN_NAME
- ORDINAL_POSITION
- COLUMN_DEFAULT
- IS_NULLABLE
- DATA_TYPE
- CHARACTER_MAXIMUM_LENGTH
- CHARACTER_OCTET_LENGTH
- NUMERIC_PRECISION
- NUMERIC_SCALE
- DATETIME_PRECISION
- CHARACTER_SET_NAME
- COLLATION_NAME
- COLUMN_TYPE
- COLUMN_KEY
- EXTRA
- PRIVILEGES
- COLUMN_COMMENT
Seguramente las que te interesarán (como a mí) serán el tipo de dato, el cual está en COLUMN_TYPE, así como el IS_NULLABLE para saber si puede ser nulo.
Pero bueno, así lo hacemos en el motor. Veamos cómo se hace desde PHP.
Conectar esa consulta con PHP usando PDO
Veamos ahora cómo podemos hacerlo a través de PDO. Vamos a encerrarlo en una función para que sea reutilizable.
<?php
function obtenerColumnasDeUnaTabla($host, $usuario, $pass, $nombreDeLaBaseDeDatos, $nombreDeLaTabla)
{
try {
$base_de_datos = new PDO("mysql:host=$host;dbname=$nombreDeLaBaseDeDatos",
$usuario, $pass);
} catch (Exception $e) {
echo "Ocurrió algo con la base de datos: " . $e->getMessage();
}
return $base_de_datos
->query("SELECT COLUMN_NAME AS columna, COLUMN_TYPE AS tipo
FROM information_schema.columns WHERE
table_schema = '$nombreDeLaBaseDeDatos'
AND table_name = '$nombreDeLaTabla'")
->fetchAll(PDO::FETCH_OBJ);
}
Ok… aquí sí hay una diferencia con el ejemplo en donde obteníamos las tablas. Ahora no regresamos un arreglo de strings, sino un arreglo de objetos.
¿Y qué tienen esos objetos? tienen dos propiedades. El nombre de la tabla, y el tipo. El nombre está en ->columna
y el tipo en ->tipo
.
Por mostrar un ejemplo podemos hacer esto:
<?php
$columnas = obtenerColumnasDeUnaTabla("localhost", "root", "", "mascotas", "mascotas");
print_r($columnas);
Espero no confundir al lector. Recordemos que el último argumento es el nombre de la tabla, y en mi caso tengo una tabla con el mismo nombre que la base de datos.
Si nuestra base de datos fuera “ventas” y la tabla “productos” entonces la llamada quedaría así:
<?php
$columnas = obtenerColumnasDeUnaTabla("localhost", "root", "", "ventas", "productos");
Esto suponiendo que la tabla productos existe dentro de ventas.
Aquí la salida:
Como se ve ahí, dentro del arreglo hay objetos. Podríamos recorrerlos así:
<?php
foreach($columnas as $columna){
echo "La columna es: " . $columna->columna . " y su tipo es: " . $columna->tipo . "\n";
}
Obteniendo este resultado:
Así de simple es. Con eso terminamos por hoy.