我正在处理一个多字段表单来注册问题,但是当提交数据到mysql数据库时,它错放了复选标记值。第一次提交得到1值,其余的得到0和下面的错误消息:
警告:第97行的C:\xampp\htdocs\panel_gastos\v1.3\ingreso_problemas.php中的数组键1未定义**
屏幕显示如下:
下面是在mySQL中提交的结果:第一个元素应该具有“recurrente=1”和“resuelto=0”
代码如下所示:
<?php
session_start();
?>
<!DOCTYPE html>
<html lang="es">
<head>
<meta charset="UTF-8">
<meta name="viewport", content="width=device-width, initial-scale=1.0">
<title>Portal gastos - ingreso de problemas</title>
<!---Bootstrap-->
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap@5.2.3/dist/css/bootstrap.min.css" integrity="sha384-rbsA2VBKQhggwzxH7pPCaAqO46MgnOM80zW1RWuH61DGLwZJEdK2Kadq2F9CUG65" crossorigin="anonymous">
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.2.3/dist/js/bootstrap.min.js" integrity="sha384-cuYeSxntonz0PPNlHhBs68uyIAVpIIOZZ5JqeqvYYIcEL727kskC66kF92t6Xl2V" crossorigin="anonymous"></script>
<!---JQuery-->
<script src="https://code.jquery.com/jquery-3.6.3.min.js" integrity="sha256-pvPw+upLPUjgMXY0G+8O0xUf+/Im1MZjXxxgOcBQBXU=" crossorigin="anonymous"></script>
<!---añadir filas--->
<script type="text/javascript">
$(document).ready(function(){
var html = '
<tr>
<td>
<input class="form-control" type="text" name="Prob[]" required="">
</td>
<td><!---<input type="hidden" name="Recurrente[]" value="0"/>--->
<input class="primary" type="checkbox" name="Recurrente[]" value="1">
</td>
<td>
<input class="form-control" type="text" name="KPI[]" >
</td>
<td>
<input type="date" name="Fecha[]" required="">
</td>
<td>
<input type="hidden" name="Solucionado" value="0">
<input type="checkbox" name="Solucionado[]" value="1">
</td>
<td>
<input class="btn btn-danger" type="button" name="remove" id="remove" value="remove">
</td>
</tr>';
var max = 15;
var x = 1;
$('#add').click(function(){
if(x < max){
$("#table-field").append(html);
x++;
}
});
$('#table-field').on('click','#remove' ,function(){
$(this).closest('tr').remove();
x--;
});
});
</script>
</head>
<body>
<div class="container">
<form class="insert-form" id="insertform" method="post" action="">
<hr>
<h1 class="text-center">input field</h1>
<hr>
<div class="input-field">
<table class="table table-bordered" id="table-field">
<!---encabezados--->
<tr>
<th>Prob</th>
<th>Rec</th>
<th>KPI</th>
<th>fecha suceso</th>
<th>solucionado</th>
<th>add/remove</th>
</tr>
<!---enviar data--->
<?php
$bdd= new PDO("mysql:host=localhost;dbname=test_usuarios; charset=utf8mb4", "root", "");
$bdd->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_WARNING);
if (isset($_POST['save'])){
$createtime = date('Y-d-m');
$usr = $_SESSION["username"];
$ceco = $_SESSION['ceco'];
$problema = $_POST['Prob'];
$recurrente = $_POST['Recurrente'];
$kpi_sol = $_POST['KPI'];
$fecha_sol = $_POST['Fecha'];
$solucionado = $_POST['Solucionado'];
foreach($problema as $key=>$value){
$save= <<<SQL
INSERT INTO incidentes_cecos(fecha_creacion, usr, ceco, problema, recurrente, KPI_sol, fecha_evento, resuelto)
VALUES('$createtime','$usr', '$ceco','$value','$recurrente[$key]','$kpi_sol[$key]','$fecha_sol[$key]','$solucionado[$key]');
SQL;
$query = $bdd->query($save);
};
}
?>
<!---campos--->
<tr>
<td><input class="form-control" type="text" name="Prob[]" required=""></td>
<td><!---<input type="hidden" name="Recurrente[]" value="0"/>---><input class="primary" type="checkbox" name="Recurrente[]" value="1"></td>
<td><input class="form-control" type="text" name="KPI[]" ></td>
<td><input type="date" name="Fecha[]" required=""></td>
<td><input type="hidden" name="Solucionado" value="0"><input type="checkbox" name="Solucionado[]" value="1"></td>
<td><input class="btn btn-warning" type="button" name="add" id="add" value="add"></td>
</tr>
</table>
<center>
<input class="btn btn-success" type="submit" name="save" id="add" value="save data">
</center>
</div>
</form>
</div>
</body>
</html>
到目前为止,我已经尝试了一些解决方案,如果复选框被选中,发送1,如果没有,发送0。我不知道发生了什么,最有可能的是我的数组使用不当。
1条答案
按热度按时间sdnqo3pr1#
即使隐藏字段的名称已修复,以便与复选框的名称匹配,但当您有多个同名复选框时,也不能使用此解决方案。
如果你有
则此解决方案有效-因为PHP会覆盖具有相同名称的参数,所以
$_POST['Foobar']
将包含隐藏字段提交的0
(如果未选中复选框),以及1
(如果选中复选框)(因为0
和1
将以相同名称提交,并且后一个1
将覆盖前一个0
)。但是如果你的字段名中有
[]
,PHP不会覆盖它,而是用所有提交的值创建一个数组。这当然是你想要的文本字段的行为--但是它会阻止这个复选框的工作。因为,如果你有上面的隐藏输入加复选框,比如说,三次,但你只选中其中一个复选框-那么仍然会导致 * 四 * 值被提交:三个隐藏的输入都提交了它们的
0
,而一个选中的复选框提交了它的1
,所以,你又一次不能正确地将它与你的文本字段值关联起来。这里唯一可行的解决方案是,你先显式地指定该值在结果数组中的索引,你的第一个文本输入将命名为
name="Prob[0]"
,复选框为name="Solucionado[0]"
,下一组字段为[1]
,依此类推,隐藏字段将被完全删除。由于使用JavaScript动态地追加表单字段,因此需要修改该部分以保留计数器,并相应地修改相关位置的输出。
然后可以循环
$_POST['Prob']
,然后对于每个条目检查$_POST['Solucionado']
中是否存在具有相同索引的条目。但是,由于您需要对表单的创建方式进行修改,因此将字段名更改为
name="data[0][Prob]"
和name="data[0][Solucionado]"
之类的名称可能更有意义,然后您将首先获得按数字索引组织的$_POST['data']
中的所有数据,然后获得Prob
、Solucionado
、等等,在那下面-与Solucionado
仍然只存在,如果相应的复选框被选中。但数据分组更合乎逻辑的开始。