En ocasiones nos es necesario crear una lista (<ul>) de un determinado número de registros de una base de datos. Y para rizar el rizo, esos datos están entrelazados, es decir, que unos registros dependen de otros.

Lo más fácil es crear un recordset, y dentro del bucle crear otro con los parámetros necesarios, pero ay!! que suele suceder que no nos resulta posible el saber cuantos registros habrán ni cuantos niveles de profundidad tendremos.

Vamos a partir de una base de datos llamada por ejemplo «registros». «Registros» tendrá podría tener 3 campos (y añadir más no sería complicado).

1
2
3
4
5
6
CREATE TABLE `registros` (
`id` INT(11) NOT NULL AUTO_INCREMENT,
`sub_id` INT(11) NOT NULL DEFAULT '0',
`registro` VARCHAR(80) NOT NULL,
PRIMARY KEY  (`id`)
) ENGINE=MyISAM  DEFAULT CHARSET=utf8 AUTO_INCREMENT=21 ;

Como podemos comprobar tenemos un campo «id» autonumérico, un campo «sub_id» por el cuál relacionaremos un registro con otro, y un último campo llamado «registro» ( en original no me gana nadie) y como decía antes, para muchos casos será necesario el añadir más campos, lo cuál se puede hacer con total normalidad.

La idea es relacionar una serie de ciudades, con sus provincias, y a estas con sus comunidades y países.
Y como buen mago, guardo en el bolsillo todos esos registros.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
INSERT INTO `registros` VALUES (1, 0, 'España');
INSERT INTO `registros` VALUES (2, 0, 'Portugal');
INSERT INTO `registros` VALUES (3, 1, 'Galicia');
INSERT INTO `registros` VALUES (4, 1, 'Asturias');
INSERT INTO `registros` VALUES (5, 2, 'Oporto');
INSERT INTO `registros` VALUES (6, 2, 'Lisboa');
INSERT INTO `registros` VALUES (7, 2, 'Chaves');
INSERT INTO `registros` VALUES (8, 3, 'Pontevedra');
INSERT INTO `registros` VALUES (9, 3, 'La Coruña');
INSERT INTO `registros` VALUES (10, 3, 'Ourense');
INSERT INTO `registros` VALUES (11, 3, 'Lugo');
INSERT INTO `registros` VALUES (12, 4, 'Oviedo');
INSERT INTO `registros` VALUES (13, 8, 'Pontevedra');
INSERT INTO `registros` VALUES (14, 8, 'Vigo');
INSERT INTO `registros` VALUES (15, 8, 'Cangas');
INSERT INTO `registros` VALUES (16, 9, 'La Coruña');
INSERT INTO `registros` VALUES (17, 9, 'Santiago de Compostela');
INSERT INTO `registros` VALUES (18, 9, 'Ferrol');
INSERT INTO `registros` VALUES (19, 12, 'Oviedo');
INSERT INTO `registros` VALUES (20, 12, 'Gijón');

Bueno, tenemos nuestra base de datos, la tabla y también los datos. Ahora solo nos queda plasmar la idea. Y como todo, es muy sencilla.Crearemos una función con un recordset cuya consulta vaya filtrada por su «sub_id» que es el que relaciona a un registro con otro y dentro de los resultados que nos devuelva la consulta, llamamos a la función que estamos creando, pasándole como parámetro el «id» de ese registro.

Y como es más fácil mostrarlo que contarlo, nos ponemos a ello.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
<?php
// Creamos la conexion
$hostname_conn = "localhost";
$database_conn = "pruebas";
$username_conn = "root";
$password_conn = "";
$conn = mysql_pconnect($hostname_conn,
   $username_conn, $password_conn) or
   trigger_error(mysql_error(),E_USER_ERROR);

function arbol($id=0)
{
   // Convertimos a globales el nombre de la bd y la conexion
   global $database_conn, $conn;

   // Creamos el recordset
   mysql_select_db($database_conn, $conn);
   $query_rsRegistro = 'SELECT * from registros
                        WHERE sub_id = '
.$id;
   $rsRegistro = mysql_query($query_rsRegistro, $conn)
                   or die(mysql_error());
   $row_rsRegistro = mysql_fetch_assoc($rsRegistro);
   $totalRows_rsRegistro = mysql_num_rows($rsRegistro);

   // Comprobamos que no esta vacia
   if($totalRows_rsRegistro > 0)
   {
      // Inicializamos la lista
      echo '<ul>';

      // Mostramos todos los resultados
      do
      {
          echo '<li>'.$row_rsRegistro['registro'];

         // Ejecutamos la funcion dentro de si misma
         // Y le pasamos el id del registro actual
         arbol($row_rsRegistro['id']);

         echo '</li>';
      }
      while($row_rsRegistro = mysql_fetch_assoc($rsRegistro));

      echo '</ul>';
   }
}
?>

Ahora solo nos queda realizar la llamada en el lugar que consideremos oportuno, haciéndolo de la siguiente manera

1
<?php  arbol();?>

Fácil, no ? Esto nos devuelve algo similar a esto.

* España
* Galicia
* Pontevedra
* Pontevedra
* Vigo
* Cangas
* La Coruña
* La Coruña
* Santiago de Compostela
* Ferrol
* Ourense
* Lugo
* Asturias
* Oviedo
* Oviedo
* Gijón
* Portugal
* Oporto
* Lisboa
* Chaves