You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

添加删除功能后Admin系统异常:无法登录/新增、删除失效求助

修复Admin系统删除功能失效问题

嘿,我仔细看了你的问题和代码,能帮你找出几个可能导致删除功能失效的点,咱们一步步来排查修复:

问题背景

我正在Udemy平台学习Web开发课程,发现课程提供的Admin系统代码存在错误(并非我一人遇到)。该代码用于实现Admin区域登录、管理员的创建、编辑与删除功能,原本运行正常,但添加eliminar(删除)功能后出现问题:

  • 点击删除会弹出提示,但MySQL中的数据并未删除;
  • 删除删除功能代码后,登录和新增管理员功能恢复正常。

我已向课程导师求助一个多月未获回应,其他学员也大多束手无策,且已过退款期,现附上相关代码请求协助修复。

相关代码

Model代码(PHP)

<?php include_once 'funciones/funciones.php'; $usuario=$_POST['usuario']; $nombre=$_POST['nombre']; $password=$_POST['password']; $id_registro =$_POST['id_registro']; if($_POST['registro'] == 'nuevo') { $opciones=array( 'cost'=>12 ); $password_hashed=password_hash($password, PASSWORD_BCRYPT, $opciones); try { $stmt=$conn->prepare("INSERT INTO admins(usuario, nombre, password) VALUES (?,?,?)"); $stmt->bind_param("sss", $usuario, $nombre, $password_hashed); $stmt->execute(); $id_registro=$stmt->insert_id; if ($id_registro > 0) { $respuesta=array( 'respuesta'=>'exito', 'id_admin'=>$id_registro ); } else { $respuesta=array( 'respuesta'=>'error', ); } $stmt->close(); $conn->close(); } catch (\Exception $e) { echo "Error: " . $e->getMessage(); } die(json_encode($respuesta)); } if($_POST['registro'] == 'actualizar') { try { if (empty($_POST['password']) ) { $stmt = $conn->prepare("UPDATE admins SET usuario = ?, nombre = ?, editado = NOW() WHERE id_admin = ? "); $stmt->bind_param("ssi", $usuario, $nombre, $id_registro); } else { $opciones = array( 'cost' => 12 ); $hash_password = password_hash($password, PASSWORD_BCRYPT, $opciones ); $stmt = $conn->prepare('UPDATE admins SET usuario = ?, nombre = ?, password = ?, editado = NOW() WHERE id_admin = ? '); $stmt->bind_param("sssi", $usuario, $nombre, $hash_password, $id_registro); } $stmt->execute(); if ($stmt->affected_rows) { $respuesta = array( 'respuesta' => 'exito', 'id_actualizado' => $stmt->insert_id ); }else { $respuesta = array( 'respuesta' => 'error' ); } $stmt->close(); $conn->close(); } catch (\Exception $e) { $respuesta = array( 'respuesta' => $e->getMessage() ); } die(json_encode($respuesta)); } if($_POST['registro'] == 'eliminar') { //die(json_encode($_POST)); $id_borrar = $_POST['id']; try { $stmt = $conn->prepare('DELETE FROM admins WHERE id_admin = ? '); $stmt->bind_param('i', $id_borrar); $stmt->execute(); if($stmt->affected_rows){ $respuesta = array( 'respuesta' => 'correcto', 'id_eliminado' => $id_borrar ); } else { $respuesta = array( 'respuesta' => 'cancel' ); } } catch (\Exception $e) { $respuesta = array( 'respuesta' => $e->getMessage() ); } die(json_encode($respuesta)); } if(isset($_POST['login-admin'])) { $usuario=$_POST['usuario']; $password=$_POST['password']; //die(json_encode($_POST)); try { include_once 'funciones/funciones.php'; $stmt=$conn->prepare("SELECT * FROM admins WHERE usuario = ?;"); $stmt->bind_param("s", $usuario); $stmt->execute(); $stmt->bind_result($id_admin, $usuario_admin, $nombre_admin, $password_admin, $editado); if ($stmt->affected_rows) { $existe=$stmt->fetch(); if ($existe) { if(password_verify($password, $password_admin)){ session_start(); $_SESSION['usuario']=$usuario_admin; $_SESSION['nombre']=$nombre_admin; $respuesta=array( 'respuesta'=>'exitoso', 'usuario'=>$nombre_admin ); } else { $respuesta=array( 'respuesta'=>'error' ); } } else { $respuesta=array( 'respuesta'=>'error' ); } } $stmt->close(); $conn->close(); } catch(Exception $e){ echo "Error: " . $e->getMessage(); } die(json_encode($respuesta)); } ?>

Admin-Ajax代码(jQuery)

$(document).ready(function(){ $('#guardar-registro').on('submit', function (e) { e.preventDefault(); var datos = $(this).serializeArray(); $.ajax({ type: $(this).attr('method'), data: datos, url: $(this).attr('action'), dataType: 'json', success: function(data){ console.log(data); var resultado = data; if(resultado.respuesta == 'exito'){ Swal.fire( 'Correcto!', 'El administrador se creo correctamente!', 'success' ) }else { Swal.fire( 'Error!', 'Hubo un error!', 'Error' ) } } }) }); // eliminar registros $('.borrar-registro').on('click', function (e) { e.preventDefault(); let id = $(this).attr('data-id'); let tipo = $(this).attr('data-tipo'); Swal.fire({ title: '¿Estás seguro?', text: "Un registro eliminado no se puede recuperar", type: 'warning', showCancelButton: true, confirmButtonColor: '#3085d6', cancelButtonColor: '#d33', confirmButtonText: 'Si, Eliminar!', cancelButtonText: 'Cancelar' }).then((result) => { if (result.value) { $.ajax({ type: 'post', data: { 'id': id, 'registro': 'eliminar' }, url: 'modelo-' + tipo + '.php', success: function (data) { var resultado = JSON.parse(data); if (resultado.respuesta == 'correcto') { Swal.fire( 'Eliminado!', 'Se eliminó el registro de la dase de datos.', 'success' ) jQuery('[data-id="' + resultado.id_eliminado + '"]').parents('tr').remove(); } } }) } else if (result.dismiss === 'cancel') { Swal.fire( 'Cancelado', 'No se eliminó el registro', 'error' ) } }) }); $('#login-admin').on('submit', function (e) { e.preventDefault(); var datos = $(this).serializeArray(); $.ajax({ type: $(this).attr('method'), data: datos, url: $(this).attr('action'), dataType: 'json', success: function(data) { console.log(data); var resultado = data; if(resultado.respuesta == 'exitoso'){ Swal.fire( 'Login Correcto!', 'Bienvenido '+resultado.usuario+' !!', 'success' ) setTimeout(function(){ window.location.href = 'admin-area.php'; }, 2000); }else { Swal.fire( 'Error!', 'Usuario o Password Incorrecto! !', 'Error' ) } } }) }); });

问题排查与修复方案

1. PHP代码中遗漏数据库连接关闭操作

eliminar分支里,你没有像nuevoactualizar分支那样关闭$stmt$conn连接!这可能导致数据库操作无法正确提交,或者连接占用引发异常。

修复方法: 在删除分支的try块末尾添加关闭语句:

$stmt->close();
$conn->close();

修改后的删除分支代码片段:

if($_POST['registro'] == 'eliminar') { 
    //die(json_encode($_POST)); 
    $id_borrar = $_POST['id']; 
    try { 
        $stmt = $conn->prepare('DELETE FROM admins WHERE id_admin = ? '); 
        $stmt->bind_param('i', $id_borrar); 
        $stmt->execute(); 
        if($stmt->affected_rows){ 
            $respuesta = array( 
                'respuesta' => 'correcto', 
                'id_eliminado' => $id_borrar 
            ); 
        } else { 
            $respuesta = array( 
                'respuesta' => 'cancel' 
            ); 
        }
        // 新增关闭连接语句
        $stmt->close();
        $conn->close();
    } catch (\Exception $e) { 
        $respuesta = array( 
            'respuesta' => $e->getMessage() 
        ); 
    } 
    die(json_encode($respuesta)); 
}

2. 验证AJAX请求的URL正确性

你的AJAX删除请求URL是'modelo-' + tipo + '.php',这里的tipo来自元素的data-tipo属性。你需要确认这个属性值是否正确对应你的PHP文件名(比如如果是管理员删除,应该对应modelo-admin.php)。如果URL错误,AJAX会访问不存在的文件,自然无法执行删除操作。

验证方式:

  • 打开浏览器开发者工具(F12),切换到Network标签,点击删除按钮,查看AJAX请求的URL是否返回200状态码;
  • 在AJAX的success函数里添加console.log(data),查看返回内容,如果是404页面,说明URL路径错误。

3. 确认数据库主键字段名

检查你的admins表主键是否确实是id_admin,如果主键字段名是id或者其他名字,DELETE语句会找不到对应记录,导致删除失败。

4. 调试参数传递

暂时取消删除分支里的//die(json_encode($_POST));注释,点击删除按钮后会直接输出POST参数,确认idregistro参数是否正确传递到了PHP端,快速定位是前端参数问题还是后端处理问题。


按照上面的步骤修改后,应该能解决删除功能失效的问题。如果还是不行,建议检查数据库用户是否拥有DELETE权限。

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

火山引擎 最新活动