Foros del Web » Programando para Internet » PHP »

[SOLUCIONADO] FOR se ejecuta una vez más de lo requerido

Estas en el tema de FOR se ejecuta una vez más de lo requerido en el foro de PHP en Foros del Web. Tengo el código que ya habrán visto varias veces en otros hilos pero ya he avanzado un poco más: tengo el código de abajo y ...
  #1 (permalink)  
Antiguo 05/01/2016, 06:09
 
Fecha de Ingreso: diciembre-2014
Ubicación: Madrid
Mensajes: 274
Antigüedad: 9 años, 11 meses
Puntos: 5
FOR se ejecuta una vez más de lo requerido

Tengo el código que ya habrán visto varias veces en otros hilos pero ya he avanzado un poco más: tengo el código de abajo y me da el siguiente error debajo:
Cita:
Notice: Undefined offset: 2 in /Applications/XAMPP/xamppfiles/htdocs/calif2/Dentro/CuadernoCalificaciones/VerCalificaciones.php on line 33
¿Cómo solventarlo?
Gracias
Código PHP:
Ver original
  1. <form action="Guardar.php" method="get">
  2. <table border="1" style="border-collapse: collapse; border: 1px solid black">
  3.     <tr>
  4.         <td><b>Alumno</b></td>
  5. <?php
  6. include ("../../Dentro/Siempre.php");
  7. // Creo el nombre general de la tabla
  8. $Tabla = "PROF".$_SESSION['Usuario']."-ASIG".$_SESSION['Curso']."-EV".$_GET['Evaluacion'];
  9. // Traigo los nombres de los ítems y los muestro en fila
  10. $Query = "SELECT Reducido FROM `".$Tabla."-ItemsExistentes`";
  11. $MyQuery = $MyConnect->query($Query);
  12. while ($MyFetch = $MyQuery->fetch_assoc()){
  13.     echo '<td><b>'.$MyFetch['Reducido'].'</b></td>';
  14. }
  15. ?>
  16.     </tr>
  17. <?php
  18. // Busco los alumnos matriculados
  19. $Query2 = "SELECT * FROM `Matriculaciones` WHERE `Asignatura` = '".$_SESSION['Curso']."'";
  20. $MyQuery2 = $MyConnect->query($Query2);
  21. while($MyFetch2 = $MyQuery2->fetch_assoc()){
  22.     $Query3 = "SELECT * FROM `Alumnos` WHERE `ID` = '".$MyFetch2['Alumno']."'";
  23.     $MyQuery3 = $MyConnect->query($Query3);
  24.     while ($MyFetch3 = $MyQuery3->fetch_assoc()){
  25.         echo '<tr><td>'.utf8_encode($MyFetch3['NombreCompleto']).'</td>';
  26.         $Query4 = "SELECT * FROM `".$Tabla."-CuadernoCalificaciones` WHERE `NumeroIdentidadAlumno` = '".$MyFetch2['ID']."';";
  27.         $MyQuery4 = $MyConnect->query($Query4);
  28.         while ($MyFetch4 = $MyQuery4->fetch_array(MYSQL_NUM)){
  29.             $NuevoArray = $MyFetch4;
  30.             print_r($NuevoArray);
  31.             array_shift($MyFetch4);
  32.             for ($i = 0; $i <= count($MyFetch4); $i++) {
  33.                 echo '<td data-ID="'.$i.'"><input type="text" value="'.$MyFetch4[$i].'"/></td>';
  34.             }
  35.         }
  36.     }
  37. }
  38. ?>
  39. </table>
  40. <br>
  41. <input type="submit" value="Guardar cuaderno">
  42. </form>
  #2 (permalink)  
Antiguo 05/01/2016, 06:26
 
Fecha de Ingreso: diciembre-2015
Ubicación: Valencia
Mensajes: 61
Antigüedad: 8 años, 10 meses
Puntos: 10
Respuesta: FOR se ejecuta una vez más de lo requerido

Porque estás recorriendo el for una vez más de lo necesario:
Código PHP:
Ver original
  1. for ($i = 0; $i <= count($MyFetch4); $i++) {

Se ejecuta el bucle, el contador $i está a 0, lo incrementa y ejecuta el código
El bucle se repite, el contador $i está 1, lo incrementa y ejecuta el código
El bucle se repite, el contador $i está 2, todavía se le permite ejecutar el código

Por tanto, el bucle se ha ejecutado 3 veces, y el count del array dice que tiene 2 valores en el array, teniendo en cuenta que empieza por 0. Serían 2 indices; $MyFetch4[0], $MyFetch4[1]. Cuando llega a la tercera ejecución del bucle, claramente el índice $MyFetch4[2] no existe.

La solución, es simplemente quitarle el =

Código PHP:
Ver original
  1. for ($i = 0; $i < count($MyFetch4); $i++) {

No sé si lo ves más claro de la forma en que te lo he explicado.

Un saludo
  #3 (permalink)  
Antiguo 05/01/2016, 06:34
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 17 años
Puntos: 2658
Respuesta: FOR se ejecuta una vez más de lo requerido

Resumiendo en pocas palabras:
- Los objetos de un array se numeran del 0 a N.
- SIendo el primer valor el cero, implica que un array con 16 entradas se numera del 0 al 15.
- La iteración de un FOR debe hacerse mientras el contador sea menor que la cantidad de entradas. En cuanto sea igual se interrumpe (supera la cantidad de entradas reales) y sale.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)

Etiquetas: ejecuta, select, sql, tabla, vez
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.
Respuesta




La zona horaria es GMT -6. Ahora son las 22:20.