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.
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?
3 respuestas
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 : '';
}
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.
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>
Preguntas relacionadas
Nuevas preguntas
php
PHP es un lenguaje de secuencias de comandos interpretado, dinámico, orientado a objetos y ampliamente utilizado, diseñado principalmente para el desarrollo web del lado del servidor. Se utiliza para preguntas sobre el lenguaje PHP.