Из чего проистекает эта ошибка: “Notice: Uninitialized string офсет”? Стараясь повторять стоимость array

<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
3
задан 01.11.2016, 23:10
2 ответа

Проблема находится в этой части кода:

foreach($parcialP1 as $fila => $valor) {

где foreach пробеги array $parcialP1, распределяя каждую стоимость в $valor. Внутри цикла, $valor уже это статья array. Следовательно $valor[0] это первый характер статьи, и $valor[1] это второй характер.

Когда у статьи array нет по крайней мере двух символов, взрывается ошибка.



Я думаю, что было бы более простым отделять замечания и отсутствие в 2 arrays отличные. Однако, мы можем решать это также как и будь.

Понимая, что получается стоимость внутри array 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

Этот код вероятно мог бы быть осуществленным по-другому, но я это делаю так для того, чтобы он был проще понимания.

Пример в rextester.com

2
ответ дан 24.11.2019, 12:49
  • 1
    если у него есть весь raz и # 243; n схвати и # 237; быть должным и # 237; чтобы быть, update может идти despu и # 233; s внутри цикла? –  Armando Arellano 01.11.2016, 23:16
  • 2
    Ясно. В примере, s и # 243; я это печатаю, чтобы показывать c и # 243; mo быть и # 237; в, но возможно реализовывать UPDATE в цикле. Так или иначе, сначала пытаться и # 237; чтобы иметь всю правильную стоимость. Особенно, id ученика, который у меня не остается ясным c и # 243; mo est и # 225; s получая и не s и # 233; если est и # 225; хорошо. Ответ был направлен на то, чтобы объяснить цикл, где имей, и # 237; схвати ошибку, но я верю в то, что todav и # 237; в hay, который продолжать отлаживать. Любая вещь, pod и # 233; s вновь задавать другой вопрос с c и # 243; я говорю обновленный. –  Mariano 01.11.2016, 23:19
  • 3
    договора, idAlumno и idGrupo - чужеземные ключи таблицы alumno_grupo, что, где я ввожу квалификации и отсутствие в компьютер, поэтому ввело их в компьютер с update, потому что он ищет, где была ученик и группа. –  Armando Arellano 01.11.2016, 23:24
  • 4
    S и # 237; это est и # 225; ясно. Но если идентификация ученика est и # 225; s получая формуляра, я верю в то, что habr и # 237; которого видеть, правильный ли это для каждого iteraci и # 243; n цикла. Просто печатая что-то как echo "alumno $alumno grupo $grupo nota $p1" достигать и # 237; чтобы для видеть, если est и # 225; хорошо –  Mariano 01.11.2016, 23:27
  • 5
    если, он приходит из формуляра, только, что этот hidden, –  Armando Arellano 01.11.2016, 23:34

Я оставляю тебе более простое решение.

Сначала ты должен меняться в твоем 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 array 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);
        }
    }
}
2
ответ дан 24.11.2019, 12:49
  • 1
    это пытаться и # 233; большое спасибо, привет –  Armando Arellano 02.11.2016, 03:13

Теги

Похожие вопросы