Почему эта ошибка: "Notice: Uninitialized string offset"?Попытка перебрать значения массива
<form method="POST" action="Capt_Calif.php">
<?php
//listado de los alumnos del grupo que estan en esa materia:
foreach ($alumbosByGpoMater as $alumno):
?>
<tr>
<!-- imprime contador de registros, o numero de registros que aparecen recuperados -->
<td><?php if ($i <= $num_rows) { echo $i; } ?></td>
<!-- imprime matrticula de alumno -->
<td><?php echo $alumno[0];?></td>
<!-- imprime nombre de alumno -->
<td><?php echo $alumno[1];?></td>
<!-- casillas para capturar caliicaciones e inasistencias por periodo -->
<!-- parcialP1= calificacion periodo e inasistencias del periodo 1 -->
<!-- intentaba enviar un solo arreglo con ambas columnas: calificacion e inasistencias por periodo -->
<td><input type="text" name="parcialP1[]" class="p1" size="3"></td>
<td><input type="text" name="parcialP1[]" class="ip1" size="3"></td>
<td><input type="text" name="parcialP2[]" class="p2" size="3"></td>
<td><input type="text" name="parcialP2[]" class="ip2" size="3"></td>
<td><input type="text" name="parcialP3[]" class="p3" size="3"></td>
<td><input type="text" name="parcialP3[]" class="ip3" size="3"></td>
<td><input type="text" name="final[]" class="final" size="3"></td>
<!-- parametros enviados para ser usados en la clausula where, -->
<td><input type="hidden" name="idgpo" value="<?php echo $alumno[7]; ?>"></td>
<td><input type="hidden" name="idalumno" value="<?php echo $alumno[10]; ?>"></td>
</tr>
<?php
$i++; //incrementamos contador en 1 luego de cada alumno recuperado,
endforeach
?>
</tbody>
</table>
<button type="submit" name="formAlumno" class="btn btn-success">Guardar</button>
</div>
</form>
<?php
require '../../Model/Model_Docentes.php';
$connect = conectar(); //conexion a la bd
if ( isset($_POST['formAlumno']) && !empty($_POST['idgpo']) && !empty($_POST['idalumno']) ) {
//var_dump($_POST['idgpo']);
//var_dump($_POST['idalumno']);
var_dump($_POST['parcialP1']);
//recibiendo los parametros de grupo y alumno a quienes pertenece cada calificacion y numero de inasistencias
$grupo = $_POST['idgpo'];
$alumno = $_POST['idalumno'];
//recibiendo el arreglo que contiene los valores de las columnas de calificacion e inasistencias del primer periodo
$parcialP1 = $_POST['parcialP1'];
if(is_array($parcialP1))
{
$values = array();
foreach($parcialP1 as $fila => $valor)
{
//intentando recibir la calificacion del periodo1
$p1 = mysqli_real_escape_string($connect, $valor[0]);
//intentando recibir num de inasitencias del periodo1
$inasisP1 = mysqli_real_escape_string($connect, $valor[1]);
$values[] = "('$p1', '$inasisP1')";
}
$sql = "UPDATE alumno_grupo SET parcial1 = '".$p1."', inasisP1 = '".$inasisP1."' WHERE idAlumno = $grupo AND idGrupo = $alumno";
$sql .= implode(', ', $values);
mysqli_query($connect, $sql);
} //if is array
// }
} //isset
?>
//haciendo var_dump al ingresar una calificacion y una inasistencia:
array(74) { [0]=> string(1) "9" [1]=> string(1) "0" [2]=> string(0) "" [3]=> string(0) "" [4]=> string(0) "" [5]=> string(0) "" [6]=> string(0) "" [7]=> string(0) "" [8]=> string(0) "" [9]=> string(0) "" [10]=> string(0) "" [11]=> string(0) "" [12]=> string(0) "" [13]=> string(0) "" [14]=> string(0) "" [15]=> string(0) "" [16]=> string(0) "" [17]=> string(0) "" [18]=> string(0) "" [19]=> string(0) "" [20]=> string(0) "" [21]=> string(0) "" [22]=> string(0) "" [23]=> string(0) "" [24]=> string(0) "" [25]=> string(0) "" [26]=> string(0) "" [27]=> string(0) "" [28]=> string(0) "" [29]=> string(0) "" [30]=> string(0) "" [31]=> string(0) "" [32]=> string(0) "" [33]=> string(0) "" [34]=> string(0) "" [35]=> string(0) "" [36]=> string(0) "" [37]=> string(0) "" [38]=> string(0) "" [39]=> string(0) "" [40]=> string(0) "" [41]=> string(0) "" [42]=> string(0) "" [43]=> string(0) "" [44]=> string(0) "" [45]=> string(0) "" [46]=> string(0) "" [47]=> string(0) "" [48]=> string(0) "" [49]=> string(0) "" [50]=> string(0) "" [51]=> string(0) "" [52]=> string(0) "" [53]=> string(0) "" [54]=> string(0) "" [55]=> string(0) "" [56]=> string(0) "" [57]=> string(0) "" [58]=> string(0) "" [59]=> string(0) "" [60]=> string(0) "" [61]=> string(0) "" [62]=> string(0) "" [63]=> string(0) "" [64]=> string(0) "" [65]=> string(0) "" [66]=> string(0) "" [67]=> string(0) "" [68]=> string(0) "" [69]=> string(0) "" [70]=> string(0) "" [71]=> string(0) "" [72]=> string(0) "" [73]=> string(0) "" }
Notice: Uninitialized string offset: 1 in C:\xampp\htdocs\cebProcedular\View\Docente\Capt_Calif.php on line 28
Notice: Uninitialized string offset: 1 in C:\xampp\htdocs\cebProcedular\View\Docente\Capt_Calif.php on line 28
Notice: Uninitialized string offset: 0 in C:\xampp\htdocs\cebProcedular\View\Docente\Capt_Calif.php on line 27
Notice: Uninitialized string offset: 1 in C:\xampp\htdocs\cebProcedular\View\Docente\Capt_Calif.php on line 28
Notice: Uninitialized string offset: 0 in C:\xampp\htdocs\cebProcedular\View\Docente\Capt_Calif.php on line 27
2 answers
Проблема в этой части кода:
foreach($parcialP1 as $fila => $valor) {
Где foreach
проходит через массив $parcialP1
, присваивая каждое значение $valor
. Внутри цикла $valor
уже является элементом массива. Таким образом, $valor[0]
является первым символом item, а $valor[1]
является вторым символом.
Когда item массива не имеет по крайней мере двух символов, ошибка срабатывает.
Я думаю, что было бы проще разделить заметки и несуществования на 2 разных массива. Без однако мы можем решить это так, как есть.
Предполагая, что значения в массиве parcialP1[]
получены, перечислены следующим образом:
$parcialP1[0]; //nota del primer alumno
$parcialP1[1]; //inasistencias del primer alumno
$parcialP1[2]; //nota del segundo alumno
$parcialP1[3]; //inasistencias del segundo alumno
//etc.
Чтобы иметь возможность перемещаться по заметкам и отсутствиям каждого ученика, мы используем следующий цикл:
$n = count($parcialP1);
$num_alumno = 1;
//bucle que avanza 2 items por cada iteración
for ($i = 1; $i < $n; $i += 2, ++$num_alumno) {
$p1 = $parcialP1[$i - 1];
$inasisP1 = $parcialP1[$i];
echo "Alumno: $num_alumno \t Nota: $p1.\t Inasistencias: $inasisP1 \n";
}
Пример результата:
Alumno: 1 Nota: 9. Inasistencias: 15
Alumno: 2 Nota: 4. Inasistencias: 0
Alumno: 3 Nota: 10. Inasistencias: 11
Этот код, вероятно, может быть реализован по-другому, но я делаю это так, чтобы его было проще понять.
Я оставляю вам более простое решение.
Сначала вы должны изменить в своем HTML атрибут name
inputs
следующим образом:
<input type="text" name="parcial[<?php echo $i-1; ?>][]" class="p1" size="3">
<input type="text" name="parcial[<?php echo $i-1; ?>][]" class="ip1" size="3">
<input type="text" name="parcial[<?php echo $i-1; ?>][]" class="p2" size="3">
<input type="text" name="parcial[<?php echo $i-1; ?>][]" class="ip2" size="3">
<input type="text" name="parcial[<?php echo $i-1; ?>][]" class="p3" size="3">
<input type="text" name="parcial[<?php echo $i-1; ?>][]" class="ip3" size="3">
Переменная $i
Вы запустили ее с 1
поэтому я вычитаю ее, чтобы начать index массива 0
;
И здесь вы передаете значения каждого ученика в foreach
:
if (isset($_POST['formAlumno']) && !empty($_POST['idgpo']) && !empty($_POST['idalumno'])) {
$grupo = $_POST['idgpo'];
$alumno = $_POST['idalumno'];
$parcial = $_POST['parcial'];
if (is_array($parcial)) {
foreach ($parcial as $value) {
$p1 = mysqli_real_escape_string($connect, $value[0]); // campo 1
$inasisP1 = mysqli_real_escape_string($connect, $value[1]); ; // campo 2
$sql = " UPDATE alumno_grupo SET parcial1 = '".$p1."', inasisP1 = '".$inasisP1."' WHERE idAlumno = $grupo AND idGrupo = $alumno ";
mysqli_query($connect, $sql);
}
}
}