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

使用PHP结合数组选中值更新数据库表失败,求解决方案

问题:PHP无法将选中选项的数组值更新到数据库表

问题描述

我尝试使用PHP将选中选项保存的数组值更新到数据库表,但功能无法实现。当前需要用数组中的对应值,更新数据库表中满足特定条件的行。

生成带选中选项表格的代码

<div class="centro">
    <table class="tabla" style="width:100%">
        <thead>
            <tr>
                <th>Numero</th>
                <th>Coste</th>
                <th>Usuario</th>
                <th>Estado</th>
                <th>Confirmar</th>
            </tr>
        </thead>

        <tbody>
            <tr>
                <?php
                    //Variable para el nombre de usuario
                    $x = $user_data['usuar_nom'];
                    $conexion = mysqli_connect("localhost", "root", "", "llanoponte");
                    $sql = "SELECT * FROM carro";
                    $resultado = $conexion->query($sql);
                    $id = 0;

                    if($resultado->num_rows > 0){
                        while($row = $resultado-> fetch_assoc()) {   
                            echo"
                            <tr>
                                <td>",$row['numero'],"</td>
                                <td>",$row['coste'],"</td>
                                <td>",$row['usuario'],"</td>
                                <td>",$row["estado"],"</td>
                                <td>
                                    <select id='$id' name='estados'>
                                        <option value='Por confirmar'>Selecciona estado</option>
                                        <option value='Cancelada'>Cancelada</option>
                                        <option value='En entrega'>En entrega</option>
                                    </select>
                                </td>
                            </tr>
                            ";
                           $id++;
                        }
                    }
                    else {
                        echo "Sin resultados";
                    }
                    $conexion-> close();
                ?>
            </tr>
        </tbody>
    </table>
</div>

提交按钮及AJAX提交数组的代码

<input type="submit" id="cambios" name="cambios" class="cambios" onclick="cambios()" value="Cambiar">

<script type="text/javascript">
    function cambios()
    {
        //array para ver length de select lists
        let lista = [];

        //Pasar variable del php para hacer bucle for
        var veces = '<?php echo $id?>';
        
        //Bucle que pasa por los select
        for(var i=0; i< veces; i++)
        {
            var e = document.getElementById(i);
            var value  = e.value;
            lista.push(value);
        }

        $.ajax({
            url:'modificando.php',
            type:'post',
            data:{lista:lista},
            success:function(respuesta)
            {
                alert("Se han realizado los cambios");
            }
        });
    }
</script>

数据库更新脚本modificando.php代码

<?php
    $servername = "localhost";
    $username = "root";
    $password = "";
    $dbname = "llanoponte";

    $lista = $_POST['lista'];

    // Create connection
    $conn = new mysqli($servername, $username, $password, $dbname);
    // Check connection
    if ($conn->connect_error) {
      die("Connection failed: " . $conn->connect_error);
    }

    $sql = "UPDATE carro SET estado='.$lista[1].' WHERE id=2";

    mysqli_query($conn, $sql);

    $conn->close();
?>

问题排查与解决方案

1. SQL语句拼接错误

你的modificando.php中SQL语句的变量拼接语法错误,单引号包裹的字符串里无法直接解析PHP变量,导致执行的SQL是无效的。修改为:

// 方法一:用双引号解析变量
$sql = "UPDATE carro SET estado='$lista[1]' WHERE id=2";
// 方法二:用花括号明确变量范围
$sql = "UPDATE carro SET estado='{$lista[1]}' WHERE id=2";

2. 缺少下拉框与数据库行的关联

当前代码仅更新id=2的固定行,且下拉框的ID是自增的$id,无法对应到数据库的行ID,导致无法批量更新对应行。

修复步骤:

  • 生成下拉框时,绑定数据库行的ID,同时设置初始选中状态:
    <select id='select_<?php echo $row['id']; ?>' data-id='<?php echo $row['id']; ?>' name='estados'>
        <option value='Por confirmar' <?php echo $row['estado'] == 'Por confirmar' ? 'selected' : ''; ?>>Selecciona estado</option>
        <option value='Cancelada' <?php echo $row['estado'] == 'Cancelada' ? 'selected' : ''; ?>>Cancelada</option>
        <option value='En entrega' <?php echo $row['estado'] == 'En entrega' ? 'selected' : ''; ?>>En entrega</option>
    </select>
    
  • 修改JS收集数据逻辑,同时获取行ID和选中值:
    function cambios() {
        let lista = [];
        // 遍历所有下拉框
        document.querySelectorAll('select[name="estados"]').forEach(select => {
            let rowId = select.dataset.id;
            let estado = select.value;
            lista.push({id: rowId, estado: estado});
        });
    
        $.ajax({
            url:'modificando.php',
            type:'post',
            data: {lista: lista},
            success:function(respuesta) {
                alert("Se han realizado los cambios");
            },
            error: function(xhr) {
                alert("Error: " + xhr.responseText);
            }
        });
    }
    
  • 修改modificando.php批量更新数据,同时引入预处理语句避免SQL注入:
    <?php
        $servername = "localhost";
        $username = "root";
        $password = "";
        $dbname = "llanoponte";
    
        $conn = new mysqli($servername, $username, $password, $dbname);
        if ($conn->connect_error) {
          die("Connection failed: " . $conn->connect_error);
        }
    
        $lista = $_POST['lista'];
        // 预处理语句模板
        $sql = "UPDATE carro SET estado=? WHERE id=?";
        $stmt = $conn->prepare($sql);
        foreach($lista as $item) {
            $estado = $item['estado'];
            $id = $item['id'];
            $stmt->bind_param("si", $estado, $id);
            $stmt->execute();
        }
        $stmt->close();
        $conn->close();
        echo "Actualización completada";
    ?>
    

3. 增加错误处理

在AJAX中添加错误回调,便于排查请求失败的原因;同时在PHP中输出执行结果,方便前端调试。


内容的提问来源于stack exchange,提问作者Paul

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.21 23:37:02