Tengo algunas entradas de valores múltiples y hay algunas casillas de verificación entre ellas. Cuando envío el formulario, si una casilla de verificación no está marcada, desplaza el resto de los datos y extravía las entradas en otras filas.

enter image description here

Por ejemplo, si esas dos casillas de verificación no están marcadas en el medio, cuando uso un bucle foreach, usa la cuarta entrada hazardous en la segunda fila y los datos están mal ubicados en la base de datos.

Aquí está mi código:

<td>
    <input type="text" name="description_of_goods_fa[]"
           class="form-control">
</td>
<td>
    <input type="text" name="hs_code[]" required
           title="HS Code needs to be a 8 digit number"
           class="form-control" pattern="[0-9]{8}">
</td>
<td>
    <input type="checkbox" name="stackable[]" class="form-control"
           value="1" checked>
</td>
<td>
    <input type="checkbox" name="hazardous[]" class="form-control"
           onchange="check_hazardous(this);" value="1">
</td>
<td>
    <input type="number" name="un[]" min="0" max="9999" step="1"
           class="form-control" readonly>
</td>
<td>
    <input type="number" name="imco_class[]" min="1" max="9.9"
           step="0.1" class="form-control" readonly>
</td>

Y uso un bucle foreach para pasar por $_POST en php:

foreach($_POST['hs_code'] as $key => $hs_code)
{
    $description_of_goods_en = $mysqli->real_escape_string($_POST['description_of_goods_en'][$key]);
    $description_of_goods_fa = $mysqli->real_escape_string($_POST['description_of_goods_fa'][$key]);
    $hs_code = $mysqli->real_escape_string($_POST['hs_code'][$key]);
    $hs_code = $mysqli->real_escape_string($_POST['hs_code'][$key]);
    $stackable = (isset($_POST['stackable']) ? '1' : '0');
    $hazardous = (isset($_POST['hazardous'][$key]) ? '1' : '0');
    $un = (isset($_POST['un'][$key]) ? $mysqli->real_escape_string($_POST['un'][$key]) : "");
    $imco_class = (isset($_POST['imco_class'][$key]) ? $mysqli->real_escape_string($_POST['imco_class'][$key]) : "");
    $no_of_unit = $mysqli->real_escape_string($_POST['no_of_unit'][$key]);
    $unit_price = $mysqli->real_escape_string($_POST['unit_price'][$key]);
    $total_price = $mysqli->real_escape_string($_POST['total_price'][$key]);
    $no_of_packages = $mysqli->real_escape_string($_POST['no_of_packages'][$key]);
    $kind_of_packages = $mysqli->real_escape_string($_POST['kind_of_packages'][$key]);
    $pkg_length = $mysqli->real_escape_string($_POST['pkg_length'][$key]);
    $pkg_width = $mysqli->real_escape_string($_POST['pkg_width'][$key]);
    $pkg_height = $mysqli->real_escape_string($_POST['pkg_height'][$key]);
    $pkg_volume = $mysqli->real_escape_string($_POST['pkg_volume'][$key]);
    $total_volume = $mysqli->real_escape_string($_POST['total_volume'][$key]);
    $pkg_net_weight = $mysqli->real_escape_string($_POST['pkg_net_weight'][$key]);
    $pkg_gross_weight = $mysqli->real_escape_string($_POST['pkg_gross_weight'][$key]);
    $total_net_weight = $mysqli->real_escape_string($_POST['total_net_weight'][$key]);
    $total_gross_weight = $mysqli->real_escape_string($_POST['total_gross_weight'][$key]);
    $chargeable_weight = (isset($_POST['chargeable_weight'][$key]) ? $mysqli->real_escape_string($_POST['chargeable_weight'][$key]) : "");
    if($hs_code != '' || $no_of_packages != '' || $description_of_goods_en != '' || $volume != '')
    {
        $sql = "
            INSERT INTO `inquery_cargo` SET
                `id_inquery`='$id_inquiry',
                `description_of_goods_en`='$description_of_goods_en',
                `description_of_goods_fa`='$description_of_goods_fa',
                `hs_code`='$hs_code',
                `stackable`='$stackable',
                `hazardous`='$hazardous',
                `un`='$un',
                `imco_class`='$imco_class',
                `no_of_unit`='$no_of_unit',
                `unit_price`='$unit_price',
                `total_price` = '$total_price',
                `no_of_packages`='$no_of_packages',
                `kind_of_packages`='$kind_of_packages',
                `pkg_length`='$pkg_length',
                `pkg_width`='$pkg_width',
                `pkg_height`='$pkg_height',
                `pkg_volume`='$pkg_volume',
                `total_volume`='$total_volume',
                `pkg_net_weight`='$pkg_net_weight',
                `pkg_gross_weight`='$pkg_gross_weight',
                `total_net_weight`='$total_net_weight',
                `total_gross_weight`='$total_gross_weight',
                `chargeable_weight`='$chargeable_weight'
        ";

        $res = $mysqli->query($sql);
        if(!$res)
        {
            $text = "An error occurred during the process.";
            $error = true;
        }
    }
}

¿Cómo puedo enviar esas casillas de verificación que no están marcadas?

0
Alireza A2F 28 sep. 2019 a las 18:00

3 respuestas

La mejor respuesta

Hay al menos dos soluciones

1) Debe pasar un índice de fila para formar el nombre del campo para cada fila. Por ejemplo

<tr>
...
   <input type="text" name="description_of_goods_fa[1]"
       class="form-control">
...
</tr>

<tr>
...
   <input type="text" name="description_of_goods_fa[2]"
       class="form-control">
...
</tr>

Entonces, en el código PHP, puede verificar en el bucle la existencia de índice como

$hazardous = isset($_POST['hazardous'][$index]) ? $_POST['hazardous'][$index] : null;

2) Puede colocar una entrada oculta con nombre peligroso además de la casilla de verificación

<input type="checkbox" class="form-control hazardous-checkbox"
       onclick="changeHazardousInput(this)" value="1">
<input type="hidden" name="hazardous[]"
       onchange="check_hazardous(this);">

Entonces, solo necesita escribir una función 'changeHazardousInput' que cambie el valor de entrada oculta del hermano

Ejemplo de la función changeHazardousInput:

function changeHazardousInput(checkbox) {
    checkbox.nextElementSibling.value = checkbox.checked ? checkbox.value : '';
}
2
KusokBanana 28 sep. 2019 a las 15:46

Hay una buena manera de resolver su tarea y también mejorar la legibilidad del código. Simplemente cambie la estructura HTML para enraizar ambas casillas de verificación bajo el mismo número de fila. Todavía no recibe casillas de verificación sin marcar, pero como los datos están agrupados bajo el número de línea, ya no es un problema.

<tr>
    <td>
        <input type="text" name="line[1][description_of_goods_fa]" class="form-control">
    </td>
    <td>
        <input type="text" name="line[1][hs_code]">
    </td>
    <td>
        <input type="checkbox" name="line[1][stackable]" value="1" checked>
    </td>
    <td>
        <input type="checkbox" name="line[1][hazardous]" onchange="check_hazardous(this);" value="1">
    </td>
</tr>    
<tr>
    <td>
        <input type="text" name="line[2][description_of_goods_fa]" class="form-control">
    </td>
    <td>
        <input type="text" name="line[2][hs_code]">
    </td>
    <td>
        <input type="checkbox" name="line[2][stackable]" value="1" checked>
    </td>
    <td>
        <input type="checkbox" name="line[2][hazardous]" onchange="check_hazardous(this);" value="1">
    </td>
</tr>    
1
Denis O. 28 sep. 2019 a las 15:57

Consulte el código a continuación para html. para el valor de bucle de i será dinámico o su definido

<?php for($i=0;$i<5;$i++):?>
            <tr>

                <td>
                    <input type="checkbox" name="stackable[]" class="form-control"
                    value="1" checked>
                </td>
                <td>
                    <input type="checkbox" name="hazardous[]" class="form-control"
                    value="1">
                </td>

            </tr>
        <?php endfor;?>
            <input type="hidden" name="row" value="<?php echo $i?>">

Y vea el código a continuación para el archivo php donde envía datos

$row=$_POST['row'];
$stack=$_POST["stackable"];
$hazar=$_POST["hazardous"];
for($i=0;$i<$row;$i++){
    $stackable=(isset($stack[$i]))?1:0;
    $hazardous=(isset($hazar[$i]))?1:0; 
}

Será una ayuda completa para ti.

1
Akbor 28 sep. 2019 a las 18:18