Cita: Cuando ejecuto el while, el resultado de asociafilas está guardado en $row por lo tanto no pasa nada, te digo que tengo estructuras exactamente iguales pero con consultas diferentes y funcionan.
Te explico:
Sí, el resultado de asociaFilas() lo guardas en $row ¿pero entiendes cómo funciona internamente un while() y la relación implícita con tu método?
La cosa, es que en cada vuelta del while() se vuelve a invocar asociaFilas(), cada vez.
Por eso cuando eliminas la sub-consulta funciona de maravilla, pero dado que la sub-consulta altera las referencias internas de toda clase todo se rompe ahí.
Para que todo funcione como tienes en mente debes evitar sobre-escribir dichas referencias, ni más ni menos.
Cita: He pedido ayuda, y si no estuviera seguro de lo que digo no te llevaría la contraria, al margen de eso si te llevo la contraria lo hago con respeto y no con ironias.
También recuerda que estás en un
foro de discusión, no es yahoo answers, ni taringa.
Si me quieres llevar la contraria sin argumentos bien por ti, pero te platico que tengo mucha más experiencia haciendo OOP y por eso el problema es muy fácil de identificar para mi.
Te sugiero que leas bien como funcionan las estructuras de un while(), para que veas como cada vez se ejecuta la función que devuelve un registro, etc.
Una solución directa podría ser pre-acumular en un array los registros dentro de la clase con un método, y entonces usar dicho array por fuera: así podrás ejecutar cientos de consultas con la misma clase sin chocar referencias entre si:
Código PHP:
Ver original// este método va en tu clase
public function allRows() {
$out = [];
// esto es lo mismo que ya haces, pero de forma más discreta
while ($row = $this->asociaFilas()) {
$out []= $row;
}
return $out;
}
// ...
$cnx->ejecutaSql($sql1);
$data = $cnx->allRows();
foreach ($data as $row) {
$cnx->ejecutaSql($sql2);
$subdata = $cnx->allRows();
foreach ($subdata as $subrow) {
// ...
}
}
En dicho ejemplo usé foreach() que es más claro cuando trabajas sobre estructuras ya hechas, que a diferencia de while() no necesita llamar frecuentemente a la misma expresión, etc.
Bueno, si eres de los que sólo ven el árbol cuando hay detrás un bosque entero entiendo tu partida.
Suerte y mucho éxito en lo tuyo.