You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.02 21:31:08