Ver Mensaje Individual
  #18 (permalink)  
Antiguo 29/05/2016, 14:22
Avatar de pateketrueke
pateketrueke
Modernizr
 
Fecha de Ingreso: abril-2008
Ubicación: Mexihco-Tenochtitlan
Mensajes: 26.399
Antigüedad: 16 años, 7 meses
Puntos: 2534
Respuesta: Después de un UPDATE no continúa WHILE

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
  1. // este método va en tu clase
  2. public function allRows() {
  3.   $out = [];
  4.   // esto es lo mismo que ya haces, pero de forma más discreta
  5.   while ($row = $this->asociaFilas()) {
  6.     $out []= $row;
  7.   }
  8.   return $out;
  9. }
  10.  
  11. // ...
  12. $cnx->ejecutaSql($sql1);
  13. $data = $cnx->allRows();
  14.  
  15. foreach ($data as $row) {
  16.   $cnx->ejecutaSql($sql2);
  17.   $subdata = $cnx->allRows();
  18.  
  19.   foreach ($subdata as $subrow) {
  20.     // ...
  21.   }
  22. }

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.

Cita:
intentaré en otro foro.
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.
__________________
Y U NO RTFM? щ(ºдºщ)

No atiendo por MP nada que no sea personal.