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

使用isset()检查数据库存储值判断Stripe支付状态的代码不生效问题

问题原因

  1. 逻辑分支完全错位:你把付费状态查询、$status_notpaid变量定义的逻辑写在了「用户未登录」的分支(if(!isset($_SESSION["username"])))里,这个分支下$_SESSION["username"]本身就不存在,不仅查库逻辑完全无效,$status_notpaid变量也只有在未登录时才会被定义,后续elseif判断登录用户的付费状态时,根本拿不到这个变量,所以判断永远不生效。
  2. 变量未初始化:$status_notpaid没有提前声明默认值,就算逻辑分支正确,只要用户付费状态为ok,这个变量不会被创建,isset()判断依然会返回false。
  3. 预处理查询写法错误:你调用了prepare()但直接拼接SQL字符串,没有做参数绑定,依然存在SQL注入风险,预处理完全失效。

修复方案

调整逻辑顺序:先判断登录状态,登录后再查询付费状态,再根据付费状态判断展示内容。修复后的代码如下:

<?php
// 先判断是否未登录
if(!isset($_SESSION["username"])) {
?>
    <a href="login.php">Login</a> to watch Satellite data.
<?php
} else {
    // 已登录,先查付费状态,初始化默认值为已付费
    $status_notpaid = false;
    // 用参数绑定的预处理查询,避免SQL注入
    $query = 'SELECT status FROM users WHERE username = ?';
    $stmt = $conn->prepare($query);
    $stmt->bind_param('s', $_SESSION["username"]);
    $stmt->execute();
    $result = $stmt->get_result();
    
    if ($row = $result->fetch_assoc()) { 
        $status = $row["status"]; 
        if ($status !== "ok") {
            $status_notpaid = true;
        } 
    }

    // 判断付费状态
    if ($status_notpaid) {
        include("notpaid.php");
    } else {
        // 付费用户正常展示内容
        $query = 'SELECT id FROM users WHERE username = ?';
        $stmt = $conn->prepare($query);
        $stmt->bind_param('s', $_SESSION["username"]);
        $stmt->execute();
        $result = $stmt->get_result();
?>
Hello <strong><?php echo $_SESSION["username"];?></strong> | 
<?php 
        while ($row = $result->fetch_assoc()) { 
            echo $row["id"]; 
        }
    }
}
?>

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 07:54:06