Foros del Web » Programando para Internet » PHP »

creando una lista de datos padre, hijos y nietos con mysql

Estas en el tema de creando una lista de datos padre, hijos y nietos con mysql en el foro de PHP en Foros del Web. Buenas. Estoy creando una serie de funciones que muestran las categorías de una web, ordenando las hijo dentro de las padres, y las "nieto" dentro ...
  #1 (permalink)  
Antiguo 18/01/2008, 07:01
Avatar de sumolari  
Fecha de Ingreso: mayo-2006
Ubicación: localhost
Mensajes: 1.367
Antigüedad: 18 años
Puntos: 18
creando una lista de datos padre, hijos y nietos con mysql

Buenas.

Estoy creando una serie de funciones que muestran las categorías de una web, ordenando las hijo dentro de las padres, y las "nieto" dentro de las hijo. Pero también quiero que las "bisnieto" las agrupe dentro de las "nieto".

Primero creé una función de mostrar las padre:
Código PHP:
function show_categories($allow_visibles$allow_subcats$order_by$order_dir) {
    if(!isset(
$allow_visibles)) { $allow_visible 0; }
    if(!isset(
$order_by)) { $order_by 'name'; }
    if(!isset(
$order_dir)) { $order_dir 'asc'; }
    switch(
$order_by) {
        case 
'name':
            
$order 'name';
            break;
        case 
'order':
            
$order 'order';
            break;
        case 
'visible':
            
$order 'visible';
            break;
        default:
            
$order 'id';
            break;
    }
    if(
$order_dir 'asc'){ $ordered_dir 'ASC'; } else { $ordered_dir 'DESC'; }
    if(
$allow_visibles == 'no') { $allowed_visibles 'no'; } elseif ($allow_visibles == 'yes') { $allowed_visibles 'not'; } else {$allowed_visibles 'no'; }
    include(
'config.php');
    
$conn['sql'] = "SELECT * FROM categories WHERE visible <> '$allowed_visibles' AND parent = 'no' ORDER BY $order $ordener_dir";
    
$conn['result'] = mysql_query($conn['sql'])
        or die (
"<strong>Error de consulta:</strong> " mysql_error());
    
$cat mysql_fetch_array($conn['result']);
    echo 
'<ul>';
    do {
        echo 
'<li>'.$cat['name'].'</li>';
        if(
$allow_subcats == 'yes') {
            
show_subcategories($cat['id'], $allowed_visibles$order$ordener_dir);
        }
    } while (
$cat mysql_fetch_array($conn['result']));
    echo 
'</ul>';

Y luego una para mostrar las hijo:

Código PHP:
function show_subcategories($cat_parent$allowed_visibles$order$ordener_dir) {
    include(
'config.php');
    
$conn2['sql'] = "SELECT * FROM categories WHERE parent = '$cat_parent' AND visible <> '$allowed_visibles' ORDER BY $order $ordener_dir";
    
$conn2['result'] = mysql_query($conn2['sql'])
        or die (
"<strong>Error de consulta:</strong> " mysql_error());
    
$subcat mysql_fetch_array($conn2['result']);
    
$num_subcat mysql_num_rows($conn2['result']);
    if(
$num_subcat 0) {
        echo 
'<ul>';
        do {
            echo 
'<li>'.$subcat['name'].'</li>';
        } while (
$subcat mysql_fetch_array($conn2['result']));
        echo 
'</ul>';
    }

Pero así no muestro las "nieto" ni las "bisnieto". Claro, puedo hacer mediante el método que usé para mostrar las hijo, una serie de funciones que me muestren las "nieto", "bisnieto" y las que necesite. Pero el problema es que no sé cuántas necesito. Así que no me voy a estar haciendo 40 funciones para mostrar las categorías que la mayoría de los usuarios crearán.

Necesito un método con el cual no necesite crear tropecientas funciones, sinó sólo un par.

¿Cómo puedo hacerlo?
  #2 (permalink)  
Antiguo 18/01/2008, 08:56
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 18 años
Puntos: 2135
Re: creando una lista de datos padre, hijos y nietos con mysql

Busca en el foro, este tema ya esta tratado y esta en las FAQs, necesitas usar funciones recursivas para obtener todos los hijos del padre y así sucesivamente.

Saludos.
  #3 (permalink)  
Antiguo 21/01/2008, 01:32
Avatar de sumolari  
Fecha de Ingreso: mayo-2006
Ubicación: localhost
Mensajes: 1.367
Antigüedad: 18 años
Puntos: 18
Re: creando una lista de datos padre, hijos y nietos con mysql

OK, ya la he encontrado.

Gracias.

EDITO:

No logro que funcione. Ya hice una prueba con algo similar, obteniendo el mismo resultado.
Lo que ocurre es que repite siempre la categoría 1 hasta que se reinicia la conexión con el servidor.
Código PHP:
function crearArbol(){
    include(
'config.php');
    
// Configuración general de la función
    
$tabla 'categories';
    
$id_field 'id';
    
$show_data 'name';
    
$link_field 'parent';
    
$parant '0';
    
$prefix '-';
    
$sql="SELECT * FROM $tabla WHERE $link_field = $parant";
    
$rs = @mysql_query($sql);
    if(
$rs){
        while(
$arr mysql_fetch_array($rs)){
            echo(
$prefix.$arr[$show_data].'<br>');
            
crearArbol();
        }
    }
    
mysql_close($conn['connection_step1']);


Última edición por sumolari; 21/01/2008 a las 01:47
  #4 (permalink)  
Antiguo 21/01/2008, 02:29
 
Fecha de Ingreso: enero-2008
Ubicación: Sevilla
Mensajes: 22
Antigüedad: 16 años, 3 meses
Puntos: 1
Re: creando una lista de datos padre, hijos y nietos con mysql

Cita:
Iniciado por sumolari Ver Mensaje
OK, ya la he encontrado.

Gracias.

EDITO:

No logro que funcione. Ya hice una prueba con algo similar, obteniendo el mismo resultado.
Lo que ocurre es que repite siempre la categoría 1 hasta que se reinicia la conexión con el servidor.
Código PHP:
function crearArbol(){
    include(
'config.php');
    
// Configuración general de la función
    
$tabla 'categories';
    
$id_field 'id';
    
$show_data 'name';
    
$link_field 'parent';
    
$parant '0';
    
$prefix '-';
    
$sql="SELECT * FROM $tabla WHERE $link_field = $parant";
    
$rs = @mysql_query($sql);
    if(
$rs){
        while(
$arr mysql_fetch_array($rs)){
            echo(
$prefix.$arr[$show_data].'<br>');
            
crearArbol();
        }
    }
    
mysql_close($conn['connection_step1']);

Esto creo que te pasa porque la función crearArbol que muestras siempre va al mismo primer nodo...

yo crearía dos funciones:

1) CrearArbol tal cual la tienes
2) MostrarSubArbol($nodo) de forma que tu while quedara como
while($arr = mysql_fetch_array($rs)){
echo($prefix.$arr[$show_data].'<br>');
MostrarSubArbol($prefix.$arr[$show_data]);
de forma que fuera similar a la crearArbol pero tomando como raíz el nodo que le pases por argumento y como condición de finalización que el nodo a consultar no tuviera hojas. Mientras tenga, vas llamándola recursivamente. El orden en que quieras hacerlo (inorden, postorden, preorden) ya es cosa tuya.

No sé si te queda claro, si no, dímelo e intento aclarártelo.

Saludos
  #5 (permalink)  
Antiguo 21/01/2008, 05:38
Avatar de sumolari  
Fecha de Ingreso: mayo-2006
Ubicación: localhost
Mensajes: 1.367
Antigüedad: 18 años
Puntos: 18
Re: creando una lista de datos padre, hijos y nietos con mysql

Ya he logrado que funcione, este el el código php de las funciones:

Código PHP:
function show_categories($allow_visibles$allow_subcats$order_by$order_dir){
    if(!isset(
$allow_visibles)) { $allow_visible 0; }
    if(!isset(
$order_by)) { $order_by 'name'; }
    if(!isset(
$order_dir)) { $order_dir 'asc'; }
    switch(
$order_by) {
        case 
'name':
            
$order 'name';
            break;
        case 
'order':
            
$order 'order';
            break;
        case 
'visible':
            
$order 'visible';
            break;
        default:
            
$order 'id';
            break;
    }
    if(
$order_dir 'asc'){ $ordered_dir 'ASC'; } else { $ordered_dir 'DESC'; }
    if(
$allow_visibles == 'no') { $allowed_visibles 'no'; } elseif ($allow_visibles == 'yes') { $allowed_visibles 'not'; } else {$allowed_visibles 'no'; }
    include(
'config.php');
    
$sql "SELECT * FROM categories WHERE visible <> '$allowed_visibles' AND parent = 0 ORDER BY $order $ordener_dir";
    
$rs = @mysql_query($sql);
    if(
$rs){
        echo 
'<ul>';
        while(
$cat mysql_fetch_array($rs)){
            echo(
'<li>'.$cat['name'].'</li>');
            if(
$allow_subcats == 'yes') {
            
show_subcategories($cat['id'], $allowed_visibles$order$ordener_dir);
            }
        }
        echo 
'</ul>';
    }
    
mysql_close($conn['connection_step1']);
}  

function 
show_subcategories($parent$allowed_visibles$order$ordener_dir) {
    
$sql "SELECT * FROM categories WHERE visible <> '$allowed_visibles' AND parent = $parent ORDER BY $order $ordener_dir";
    
$result mysql_query($sql);
    if(
$result) {
        echo 
'<ul>';
        while(
$subcat mysql_fetch_array($result)) {
            echo(
'<li>'.$subcat['name'].'</li>');
            
show_subcategories($subcat['id'], $allowed_visibles$order$ordener_dir);
        }
        echo 
'</ul>';
    }


Última edición por sumolari; 21/01/2008 a las 06:00
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Tema Cerrado




La zona horaria es GMT -6. Ahora son las 17:58.