PHP表单提交丢失选中变量,如何实现无需重复选择的部门切换?
解决方案:保留选中的DNI值避免重复选择
问题核心是表单提交后页面重新加载,原选中的DNI状态未被保留,且当前部门的输出逻辑错误,导致DNI值在后续提交时丢失。以下是具体修复步骤和代码:
1. 修复DNI下拉框的选中状态
表单提交后需要手动保留下拉框的选中值,修改DNI下拉框的生成逻辑,在匹配到已提交的DNI时给对应选项添加selected属性:
// 页面中生成DNI下拉框的部分 $selectedDni = isset($_POST['todos']) ? $_POST['todos'] : ''; crearSelectDni($dnis, $selectedDni);
对应的crearSelectDni函数修改:
function crearSelectDni($dnis, $selected = '') { echo '<select name="todos">'; foreach ($dnis as $dni => $salario) { $selectedAttr = ($dni == $selected) ? 'selected' : ''; echo "<option value=\"$dni\" $selectedAttr>$dni - $salario</option>"; } echo '</select>'; }
2. 修复当前部门输入框的赋值逻辑
原代码直接在input的value属性中调用函数输出内容,会导致部门名称显示在input外部。修改dptoActual函数返回部门名称,再赋值给input:
修改后的dptoActual函数:
function dptoActual($conn, $dni_emple) { try { $stmt = $conn->prepare("SELECT dpto.NOMBRE FROM dpto,emple,emple_dpto WHERE emple_dpto.ID_DPTO = dpto.ID AND emple_dpto.DNI_EMPLE=emple.DNI AND emple.DNI=:dni_emple and FECHA_FIN IS NULL"); $stmt->bindParam(':dni_emple', $dni_emple); $stmt->execute(); $stmt->setFetchMode(PDO::FETCH_ASSOC); $result = $stmt->fetchAll(); foreach ($result as $key => $dptos) { return $dptos["NOMBRE"]; } return ''; } catch (PDOException $e) { echo $e->getMessage(); return ''; } }
页面中input的修改:
<label for="">DEPARTAMENTO ACTUAL</label> <?php $dni = isset($_POST['todos']) ? $_POST['todos'] : ''; $currentDpto = ''; if (isset($_POST['mostrar']) && $dni) { $currentDpto = dptoActual($conn, $dni); } ?> <input type="text" name="dpto_actual" value="<?php echo htmlspecialchars($currentDpto); ?>"> <input type="submit" name="mostrar" value="Mostrar Actual"><br><br>
3. 可选:添加隐藏字段确保DNI不丢失
为避免下拉框选中状态失效,可在表单中添加隐藏字段存储当前DNI:
<?php if ($dni): ?> <input type="hidden" name="todos" value="<?php echo htmlspecialchars($dni); ?>"> <?php endif; ?>
修改后的完整页面代码
<body> <h1>CAMBIO DEPARTAMENTO</h1> <form method="POST" name="alta_empleado" action="<?php echo htmlspecialchars($_SERVER["PHP_SELF"]); ?>"> <label for="">Elige el DNI en el desplegable</label> <?php include "funciones/funciones.php"; $conn = conexion(); $dnis = crearSelect($conn, "SELECT DNI, SALARIO FROM emple"); $selectedDni = isset($_POST['todos']) ? $_POST['todos'] : ''; crearSelectDni($dnis, $selectedDni); echo "<br><br>"; ?> <label for="">DEPARTAMENTO ACTUAL</label> <?php $dni = isset($_POST['todos']) ? $_POST['todos'] : ''; $currentDpto = ''; if (isset($_POST['mostrar']) && $dni) { $currentDpto = dptoActual($conn, $dni); } ?> <input type="text" name="dpto_actual" value="<?php echo htmlspecialchars($currentDpto); ?>"> <input type="submit" name="mostrar" value="Mostrar Actual"><br><br> <label for="">elige el departameno nuevo en el desplegable</label> <?php $resultado = crearSelect($conn, "SELECT NOMBRE from DPTO"); crearSelectDpto($resultado); ?> </br></br> <?php if ($dni): ?> <input type="hidden" name="todos" value="<?php echo htmlspecialchars($dni); ?>"> <?php endif; ?> <input type="submit" name="cambio" value="cambio"> </form> </body> <?php if (isset($_POST['cambio'])) { try { $conn = conexion(); cambioDpto($conn); echo "creado"; } catch (PDOException $e) { echo $e->getMessage(); } } ?>
修改后的相关函数代码
function dptoActual($conn, $dni_emple) { try { $stmt = $conn->prepare("SELECT dpto.NOMBRE FROM dpto,emple,emple_dpto WHERE emple_dpto.ID_DPTO = dpto.ID AND emple_dpto.DNI_EMPLE=emple.DNI AND emple.DNI=:dni_emple and FECHA_FIN IS NULL"); $stmt->bindParam(':dni_emple', $dni_emple); $stmt->execute(); $stmt->setFetchMode(PDO::FETCH_ASSOC); $result = $stmt->fetchAll(); foreach ($result as $key => $dptos) { return $dptos["NOMBRE"]; } return ''; } catch (PDOException $e) { echo $e->getMessage(); return ''; } } function cambioDpto($conn) { $dni = $_POST['todos']; $fecha_fin = date("Y-m-d"); $nombre_dpto = $_POST['departamentos']; try { $stmt = $conn->prepare("UPDATE emple_dpto SET emple_dpto.FECHA_FIN=:fecha_fin WHERE emple_dpto.DNI_EMPLE=:numero_dni AND emple_dpto.FECHA_FIN is null"); $stmt->bindParam(':fecha_fin', $fecha_fin); $stmt->bindParam(':numero_dni', $dni); $stmt->execute(); $stmt = $conn->prepare("SELECT dpto.ID FROM dpto WHERE dpto.NOMBRE=:nombre_dpto"); $stmt->bindParam(':nombre_dpto', $nombre_dpto); $stmt->execute(); $stmt->setFetchMode(PDO::FETCH_ASSOC); $result = $stmt->fetchAll(); $id_dpto = ""; foreach ($result as $key => $ids_dptos) { $id_dpto = $ids_dptos["ID"]; } $stmt = $conn->prepare("INSERT INTO emple_dpto (DNI_EMPLE,ID_DPTO,FECHA_INICIO,FECHA_FIN) VALUES (:numero_dni,:id_dpto,:fecha_fin,null)"); $stmt->bindParam(':fecha_fin', $fecha_fin); $stmt->bindParam(':id_dpto', $id_dpto); $stmt->bindParam(':numero_dni', $dni); $stmt->execute(); } catch (PDOException $e) { echo $e->getMessage(); } }
内容的提问来源于stack exchange,提问作者carlos luque
相关产品推荐
相关产品推荐

