2010-10-21 27 views
8

Mi MySQL es así: (el nombre de la tabla es la categoría)PHP función recursiva para eliminar todos los nodos hijos causas Stackoverflow

'id', 'content', 'parent' 

donde:

  • id = el id de la categoría
  • content = alguna de texto que-dont-care-sobre
  • matriz = el id de la matriz categoría

esto es lo que estoy tratando en este momento:

function remrecurs($id) { 
    $qlist=mysql_query("SELECT * FROM category WHERE parent='$id'"); 
    if (mysql_num_rows($qlist)>0) { 
     while($curitem=mysql_fetch_array($qlist)) { 
       remrecurs($curitem['parent']); 
     } 
    } 
    mysql_query("DELETE FROM category WHERE id='$id'"); 
} 

que por alguna razón no funciona y se estrella .. Alguna idea de lo que estoy haciendo mal?

Respuesta

11

El problema está en la llamada recursiva:

remrecurs($curitem['parent']); 

que debe ser:

remrecurs($curitem['id']); 

¿Por qué?

Su objetivo es eliminar la fila con la identificación proporcionada. Primero revisa para ver si tiene hijos. En caso afirmativo, debe llamar a la eliminación recursiva en cada uno de los niños que no está en el elemento primario de nuevo. Está llamando de nuevo a la función recursivamente en el padre ... esto lleva a llamadas recursivas infinitas, destruye la pila y falla.

+0

gracias! Funciona muy bien ahora - Odio cuando cosas como esa me ralentizan - Creo que uno necesita otro punto de vista en algunas cosas :) – DreamWave

5

Alternativamente, podría dejar que la base de datos maneje esto. En MySQL, un InnoDB ON DELETE CASCADE hará esto automáticamente.

CREATE TABLE category (
    id INT PRIMARY KEY AUTO_INCREMENT, 
    parent_id INT NULL, 
    FOREIGN KEY (parent_id) REFERENCES category (id) ON DELETE CASCADE 
) ENGINE=InnoDB 

nodos raíz debe tener NULL como padre (no 0 como algunos parecen emplear en la lista de adyacencia tablas).

Cuestiones relacionadas