使用isset()检查数据库存储值判断Stripe支付状态的代码不生效问题
问题原因
- 逻辑分支完全错位:你把付费状态查询、
$status_notpaid变量定义的逻辑写在了「用户未登录」的分支(if(!isset($_SESSION["username"])))里,这个分支下$_SESSION["username"]本身就不存在,不仅查库逻辑完全无效,$status_notpaid变量也只有在未登录时才会被定义,后续elseif判断登录用户的付费状态时,根本拿不到这个变量,所以判断永远不生效。 - 变量未初始化:
$status_notpaid没有提前声明默认值,就算逻辑分支正确,只要用户付费状态为ok,这个变量不会被创建,isset()判断依然会返回false。 - 预处理查询写法错误:你调用了
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
相关产品推荐
相关产品推荐

