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

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();

?>

解决方案

核心问题分析

  1. 跳转优先级高于输出内容:header("Location: ...")会让浏览器立即执行跳转,此时echo的JS代码根本不会被浏览器解析,直接跳转到目标页面,自然看不到弹窗。
  2. 异常捕获无效:如果你的Dbh类基于mysqli实现,query()方法不会抛出PDOException,只会返回false,所以catch块永远不会触发。
  3. 存在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.01 11:25:30