PHP类中echo不生效:添加SweetAlert弹窗无显示
问题:PHP删除操作后SweetAlert弹窗不显示
我在DeleteProgram类中编写了deleteProgram()删除方法,原本功能正常。为添加JavaScript弹窗提示,我在方法的if判断内加入try/catch块,通过echo输出SweetAlert相关样式和脚本代码,但弹窗完全不显示,求解决办法。
初始代码
<?php include_once 'db.inc.php'; class DeleteProgram extends Dbh{ public function deleteProgram(){ if(isset($_GET['deleteid'])){ $id = $_GET['deleteid']; $sql = "DELETE FROM tblprogram WHERE id='$id';"; $result = $this->connect()->query($sql); header("Location: ../php/program.php"); exit(); } } } $delete = new DeleteProgram; $delete->deleteProgram(); ?>
修改后代码
<?php echo '<script src="https://unpkg.com/sweetalert/dist/sweetalert.min.js"></script>'; include_once 'db.inc.php'; class DeleteProgram extends Dbh{ public function deleteProgram(){ if(isset($_GET['deleteid'])){ $id = $_GET['deleteid']; $sql = "DELETE FROM tblprogram WHERE id='$id';"; try{ $result = $this->connect()->query($sql); echo '<style>.swal-text{ text-align: center; }</style>'; echo '<script>swal("Deleted Successfully!", "Program has been deleted", "success");</script>'; header("Location: ../php/program.php"); exit(); }catch(PDOException $e){ echo '<style>.swal-text{ text-align: center; }</style>'; echo '<script>swal ( "Delete failed!" , "'.$e->getMessage().'" , "error" );</script>'; exit(); } } } } $delete = new DeleteProgram; $delete->deleteProgram(); ?>
解决方案
核心问题分析
- 跳转优先级高于输出内容:
header("Location: ...")会让浏览器立即执行跳转,此时echo的JS代码根本不会被浏览器解析,直接跳转到目标页面,自然看不到弹窗。 - 异常捕获无效:如果你的
Dbh类基于mysqli实现,query()方法不会抛出PDOException,只会返回false,所以catch块永远不会触发。 - 存在SQL注入风险:直接把
$_GET['deleteid']拼进SQL语句,属于高危写法,容易被恶意攻击。
修复步骤
1. 用Session存储提示信息,在目标页面触发弹窗
不在删除操作页面输出JS代码,而是将弹窗需要的提示内容存在Session中,跳转到program.php后再读取Session并触发弹窗。
2. 修正数据库操作的异常处理逻辑
如果用mysqli,通过判断execute()的返回值来处理成功/失败;如果用PDO,确保开启异常模式,同时使用预处理语句避免注入。
3. 修复SQL注入漏洞
使用预处理语句(prepared statement)替代直接拼接SQL语句。
修改后的完整代码
删除处理代码(DeleteProgram类文件)
<?php session_start(); include_once 'db.inc.php'; class DeleteProgram extends Dbh{ public function deleteProgram(){ if(isset($_GET['deleteid'])){ $id = $_GET['deleteid']; // 用预处理语句防注入 $sql = "DELETE FROM tblprogram WHERE id = ?"; $stmt = $this->connect()->prepare($sql); $stmt->bind_param("i", $id); // i表示整数类型,根据你的id字段类型调整 if($stmt->execute()){ $_SESSION['alert'] = [ 'type' => 'success', 'title' => '删除成功!', 'text' => '项目已被删除' ]; }else{ $_SESSION['alert'] = [ 'type' => 'error', 'title' => '删除失败!', 'text' => $this->connect()->error ]; } $stmt->close(); header("Location: ../php/program.php"); exit(); } } } $delete = new DeleteProgram; $delete->deleteProgram(); ?>
目标页面(program.php)
在页面头部加入以下代码(确保已引入SweetAlert):
<?php session_start(); ?> <!DOCTYPE html> <html> <head> <!-- 引入SweetAlert --> <script src="https://unpkg.com/sweetalert/dist/sweetalert.min.js"></script> <style> .swal-text{ text-align: center; } </style> </head> <body> <!-- 页面原有内容 --> <?php // 检查是否有提示信息 if(isset($_SESSION['alert'])){ $alert = $_SESSION['alert']; echo "<script>swal('{$alert['title']}', '{$alert['text']}', '{$alert['type']}');</script>"; // 用完后销毁Session,避免重复弹窗 unset($_SESSION['alert']); } ?> </body> </html>
内容的提问来源于stack exchange,提问作者user19012336
相关产品推荐
相关产品推荐

