使用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
相关产品推荐
相关产品推荐

