Tratar de hacer un índice de árbol con php y tabla

Después de estar varias semanas pensando en resolver el problema y no encontrarle solución, recurro a ti para ver si me puedes echar una mano.
Paso a exponerte el problema.
Tengo una tabla con muchos registros sobre nombres de plantas, la tabla tiene más o menos la siguiente estructura:
-----------------------------------------------------------------------------
| GENERO | ESPECIE | INFRANK | INFRA| AUTABRE | PAGINAS |
----------------------------------------------------------------------------- 
| Rosa   |                   |               |           | L.            | 116, 210|
-----------------------------------------------------------------------------
| Rosa   | canina        |               |           | Herr.       | 115, 200|
----------------------------------------------------------------------------- 
| Rosa   | canina        | subsp.    |Lutea  | Willk.      | 115, 200|
----------------------------------------------------------------------------- 
| Rosa   | Lutea         |                |           | L.           | 5            |
----------------------------------------------------------------------------- 
| Rubus  |                  |                |           | Boiss.    | 116        |
-----------------------------------------------------------------------------
| Rubus  | mayor       |                |           | Reaj .     | 115, 200|
-----------------------------------------------------------------------------
| Rubus  | mayor       | var.         |Lutea  | Willk.      | 115, 200|
----------------------------------------------------------------------------- 
| Rubus  | alba          |                |           | Aedo      | 8            |
-----------------------------------------------------------------------------
|Veronica|                 |                |           | Mall.       | 116, 210|
-----------------------------------------------------------------------------
|Veronica| minor       |                |           | Willk.      | 115, 200|
----------------------------------------------------------------------------- 
|Veronica|vulgare     |                |           | L.              | 1, 8     |
-----------------------------------------------------------------------------
Bien. La forma que desearía que saliera sería:
Rosa L., 116, 210
    Canina herr., 115, 200
        Subsp. Lutea Willk., 115, 200
    Lútea
Rubus Boiss., 116
    Alba Aedo, 8
    Mayor Reaj., 115, 200
        var. Lutea Willk., 115, 200
Verónica Mall., 116, 210
    Minor Willk., 115, 200
    vulgare L., 1, 8
Es decir el campo GENERO que solo salga una vez si se repite con su autor y página
El campo ESPECIE solo una vez también y con un sangrado.
El campo INFRANK + INFRA con un doble sangrado sin que salga la ESPECIE y debajo de su ESPECIE.
Cada uno con su AUTABRE y su PÁGINAS.
En realidad es un índice que necesito sacar de una gran tabla de plantas y preciso que sea lo más claro posible.
Te estaría muy agradecido si me pudieras echar un mano.
El código que yo tengo es (No funciona):
$sql = mysql_query("SELECT GENERO FROM indice GROUP BY GENERO", $conexion);
        while($plantas = mysql_fetch_assoc($sql))
          {
             $genero = $plantas['GENERO'];
             $sql2 = mysql_query("SELECT ESPECIE FROM indice WHERE GENERO = ".$genero." GROUP BY ESPECIE", $conexion);
             echo $genero."<br/>";
            while($generos = mysql_fetch_assoc($sql))
              {
                $especie = $generos['GENERO'];
               $sql3 = mysql_query("SELECT * FROM indice WHERE GENERO = $especie", $conexion);
             while($especies = mysql_fetch_array($sql3))
                  {
                     echo $genero.$especies["ESPECIE"]."<BR/>";
                   }
             }
          }

1 respuesta

Respuesta
1
¿Te importa explicarme o pegar qué es lo que genera tu código? Así veo las diferencias mucho más rapido que si las busco yo ;)
Me saca un listado de los Géneros:
Aeonium
Aichryson
Aithales
Aldrovanda
Anacampseros
Anagallis
Androsace
Antiphylla
Etc...
Por ahí estabas haciendo una consulta sobre $sql cuando debería ser sobre $sql2
$sql = mysql_query("SELECT GENERO FROM indice GROUP BY GENERO", $conexion);
        while($plantas = mysql_fetch_assoc($sql))
          {
             $genero = $plantas['GENERO'];
             $sql2 = mysql_query("SELECT ESPECIE FROM indice WHERE GENERO = ".$genero." GROUP BY ESPECIE", $conexion);
             echo $genero."<br/>";
            while($generos = mysql_fetch_assoc($sql2))
              {
                $especie = $generos['GENERO'];
               $sql3 = mysql_query("SELECT * FROM indice WHERE GENERO = $especie", $conexion);
             while($especies = mysql_fetch_array($sql3))
                  {
                     echo $genero.$especies["ESPECIE"]."<BR/>";
                   }
             }
          }
Cuéntame a ver si con eso avanzamos algo...
Yo también creía que había que cambiar la variable $sql por $sql2 pero no dejaba de dar este error:
Aeonium
Warning: mysql_fetch_assoc(): supplied argument is not a valid MySQL result resource in D:\wamp\www\apendices\cientificos.php on line 226
Aichryson
Warning: mysql_fetch_assoc(): supplied argument is not a valid MySQL result resource in D:\wamp\www\apendices\cientificos.php on line 226
Aithales
Warning: mysql_fetch_assoc(): supplied argument is not a valid MySQL result resource in D:\wamp\www\apendices\cientificos.php on line 226
etc...
Es decir sale el Género y cuando se supone tiene que salir la Especie se produce el error
Justo encima de donde defines $sql2 pon:
echo "SELECT ESPECIE FROM indice WHERE GENERO =".$genero;
die();
Recarga la página, copia el texto que te salga y ejecútalo en tu cliente de bases de datos, a ver qué te sale (y me lo pegas a mí también, por favor).
O también puedes, en vez de lo de arriba, poner:
echo mysql_error(); die()
Lo que te devolvería el error que se está produciendo al ejecutar la consulta (me lo pegas, claro).
El error básicamente te dice que el resultado no es válido, que puede ser porque $genero esté vacío...
<div id="_mcePaste" style="overflow: hidden; position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px;"> mysql_error( </div>
Ah:
Yo también creía que había que cambiar la variable $sql por $sql2 pero no dejaba de dar este error
Es que ahí tienes que ejecutar $sql2, porque si no, lo que estás haciendo es ejecutar de nuevo la primera consulta y me imagino que lo que quieres ejecutar es la segunda...
Esto es lo que sale:
SELECT ESPECIE FROM indice WHERE GENERO =Aeonium
Es decir el primer género de la tabla.
Quizá deberíamos olvidarnos un poco del código que yo tengo y explicarte detalladamente lo que quiero. Creo que es un problema de sintaxis para decirle por PHP lo que quiero de la tabla.
Yo tengo una tabla con una serie de campos. Entre ellos están Género Especie y infraespecifico
Es decir el nombre de una planta por ejemplo:
Rosa canina subsp. vulgare
Rosa = Género
canina = especie
vulgare = infra especifico
En la tabla tengo todas las especies de rosas y en el campo "GENERO" pone Rosa.
Todos los infraespecificos en el campo "INFRA", y en el campo "GENERO" pone Rosa y en el campo "ESPECIE" la especie de Rosa a la que pertenezca
De tal manera que en la tabla figura:
Rosa lútea
Rosa canina
Rosa canina subsp. vulgare
Rosa canina subs. Alba
Rosa mollis
Con todo esto (cerca de 30.000 registros) pretendo hacer un índice que salga de la siguiente manera:
Rosa
   Canina
      subsp. Alba
      subsp. vulgare
   Lútea
   mollis
Otro género
   Especie de ese genero
Etc...
Cuando no haya más Rosas seguiríamos con otro Género.
Creo que está claro lo que quiero, un indice en forma jerárquica, otra cosa es que sepa decírselo a PHP. Y es por todo esto por lo que recurro a ti.
Muchas gracias.
Veo que tienes claro lo que quieres, y el código que tienes, es un principio porque se asemeja bastante a lo que quieres. Partimos del código que ya tienes, no de cero.
Cuando haces una consulta sql, has de tener en cuenta el tipo de dato sobre el que preguntas.
Si preguntas por un dato de tipo texto o fecha, has de usar comillas. Si preguntas por un dato de tipo numérico, no has de utilizar.(También has de tener cuidado con que las comillas que introduces no interfieren con las comillas entre las que pones la consulta).
¿A qué no has ejecutado esa consulta en tu gestor de base de datos cómo te dije? Si lo ejecutas, te dirá que esa consulta tiene un error y es, precisamente, que le faltan unas comillas. (También has de tener cuidad
De manera que en
$sql2 = mysql_query("SELECT ESPECIE FROM indice WHERE GENERO = ".$genero." GROUP BY ESPECIE", $conexion);
y en $sql3 = mysql_query("SELECT * FROM indice WHERE GENERO = $especie", $conexion);
Creo que lo que te faltan son unas comillas (ponlas simples ', para que no interfieran con las comillas dobles).
Una vez tengas puestas las comillas ( WHERE GENERO = '".$genero."' y WHERE GENERO = '$especie'") ejecutas todo de nuevo, sin los mensajes que te dije que pusieras antes y a ver qué te sale.
PD: he puesto las comillas simples con negrita.
El error ahora es el siguiente:
Aeonium
Notice: Undefined index: GENERO in D:\wamp\www\apendices\cientificos.php on line 228
Notice: Undefined index: GENERO in D:\wamp\www\apendices\cientificos.php on line 228
Notice: Undefined index: GENERO in D:\wamp\www\apendices\cientificos.php on line 228
Notice: Undefined index: GENERO in D:\wamp\www\apendices\cientificos.php on line 228
Notice: Undefined index: GENERO in D:\wamp\www\apendices\cientificos.php on line 228
Notice: Undefined index: GENERO in D:\wamp\www\apendices\cientificos.php on line 228
Notice: Undefined index: GENERO in D:\wamp\www\apendices\cientificos.php on line 228
Notice: Undefined index: GENERO in D:\wamp\www\apendices\cientificos.php on line 228
Aichryson
Notice: Undefined index: GENERO in D:\wamp\www\apendices\cientificos.php on line 228
Notice: Undefined index: GENERO in D:\wamp\www\apendices\cientificos.php on line 228
Notice: Undefined index: GENERO in D:\wamp\www\apendices\cientificos.php on line 228
Aithales
¿Cómo se puede apreciar sale el género y luego una notica donde tendría que salir la especie?
¿Qué es lo que hay en la línea 228 del archivo científicos?
$sql = mysql_query("SELECT GENERO FROM indice GROUP BY GENERO", $conexion);
             while($plantas = mysql_fetch_assoc($sql))
               {
                  $genero = $plantas['GENERO'];
                  $sql2 = mysql_query("SELECT ESPECIE FROM indice WHERE GENERO = '".$genero."' GROUP BY ESPECIE", $conexion);
                  echo $genero."<br/>";
                  while($generos = mysql_fetch_assoc($sql2))
                    {
228                       $especie = $generos['GENERO'];
                       $sql3 = mysql_query("SELECT * FROM indice WHERE GENERO = '".$especie."'", $conexion);
                       while($especies = mysql_fetch_array($sql3))
                         {
                           echo $genero.$especies["ESPECIE"]."<BR/>";
                         }
                    }
               }
             $sql = mysql_query("SELECT GENERO FROM indice GROUP BY GENERO", $conexion);             while($plantas = mysql_fetch_assoc($sql))               {                  $genero = $plantas['GENERO'];                  $sql2 = mysql_query("SELECT ESPECIE FROM indice WHERE GENERO = '".$genero."' GROUP BY ESPECIE", $conexion);                  echo $genero."<br/>";                  while($generos = mysql_fetch_assoc($sql2))                    {                       $especie = $generos['GENERO'];                       $sql3 = mysql_query("SELECT * FROM indice WHERE GENERO = '".$especie."'", $conexion);                       while($especies = mysql_fetch_array($sql3))                         {                           echo $genero.$especies["ESPECIE"]."<BR/>";                         }                    }               }
Creo que es porque lo tienes que poner en minúsculas (exactamente igual que como lo tienes en la base de datos).
Prueba a ver, porque no estoy segura de eso.
Esta es parte de la estructura de la tabla `indice`
--
Create table if not exists `indice` (
  `GENERO` varchar(22) default null,
  `HIB` varchar(1) default null,
  `ESPECIE` varchar(150) default null,
  `INFRANK` varchar(25) default null,
  `INFRA` varchar(50) default null,
  `AUTABRE` varchar(100) default null,
  `PARENTALES` varchar(150) default null,
Ah, claro, qué boba, no sé cómo lo vi antes:
$sql2 = mysql_query("SELECT ESPECIE FROM indice WHERE GENERO = '".$genero."' GROUP BY ESPECIE", $conexion);
$especie = $generos['GENERO'];
En la consulta sql estás pidiendo que te muestre la especie y luego quieres mostrar el género... por eso te dice que el index no existe... porque no coinciden!
Puedes poner asterisco (*) o bien "select especie, genero from..."
Creo que estamos dando palos de ciego.
Mira, con este código:
$sql = mysql_query("SELECT GENERO FROM indice GROUP BY GENERO", $conexion);
             while($plantas = mysql_fetch_array($sql))
               {
                  $genero = $plantas['GENERO'];
                  $sql2 = mysql_query("SELECT * FROM indice WHERE GENERO = '".$genero."'                    GROUP BY ESPECIE", $conexion);
                  while($generos = mysql_fetch_array($sql2))
                    {
                       //echo $genero."<BR/>".$especies["ESPECIE"]."<BR/>";
                       $especie = $generos['GENERO'];
                       $sql3 = mysql_query("SELECT * FROM indice WHERE GENERO = '".$especie."'", $conexion);
                       while($especies = mysql_fetch_assoc($sql3))
                         {
                           echo $genero."<BR/>".$especies["ESPECIE"]."<BR/>";
                         }
                    }
               }
Sale esto:
Género
Especie
Mismo género
Especie
Aeonium
arboreum
Aeonium
decorum
Aeonium
haworthii
Aeonium
korneliuslemsii
Aeonium
manriqueorum
Aeonium
percarneum
Aeonium
undulatum
Vamos que no están bien hechos los GROUP o que desconocemos la sintaxis necesaria para decirle lo que tiene que hacer. No creo que sea tan complicado, por internet he encontrado fórmulas para árboles jerárquicos, pero no tengo los suficientes conocimientos de PHP para implementarlo (si no sería experto en todoexpertos), de hecho este código es una mala implementación que fui poniendo a lo largo de mi lucha con el tema.
Haz una cosa, exporta la base de datos a un archivo sql, datos y estructura y mándamelo a [email protected]
Es mucho más rapido si puedo hacer las pruebas yo misma ;)
Mandado.
Muchas gracias por tu interés.
Un saludo.
Contestado!
No tengo palabras en expresar mi gratitud a esta experta por su implicación en la resolución del problema.
Gente como esta persona inducen a los principiantes a no tirar la tolla. Siempre encontrarán una mano amiga.

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas