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

在线杂货店项目购物车添加功能故障:无法写入数据库

我来帮你排查并修复这个购物车添加功能的问题,咱们一步步来拆解:

1. 核心变量名错误(导致插入失败的直接原因)

你获取商品ID时用的是$pro_id = $_GET['add_cart'];,但插入数据库的SQL语句里却写了'$p_id'——这个$p_id变量根本没定义!如果你的cart表中p_id是必填字段,这种空值插入会直接失败,数据库自然不会新增记录。

修复:把SQL里的$p_id改成$pro_id即可。

2. 缺失错误检测,无法定位问题

你执行mysqli_query后完全没检查是否成功,哪怕插入失败也直接跳转页面,导致你看不到任何错误提示。

修复:在执行插入后添加错误判断:

$run_pro = mysqli_query($con, $insert_pro);
if (!$run_pro) {
    die("添加失败:" . mysqli_error($con)); // 直接输出数据库返回的错误信息,方便排查
}

3. SQL注入风险+潜在语法错误

直接把用户输入和IP拼进SQL语句里,不仅有安全风险,还可能因为特殊字符导致SQL语法错误。建议改用预处理语句:

$insert_pro = "INSERT INTO cart (p_id, ip_add) VALUES (?, ?)";
$stmt = mysqli_prepare($con, $insert_pro);
// 如果p_id是整数类型,把第二个参数改成"is"(i代表整数,s代表字符串)
mysqli_stmt_bind_param($stmt, "ss", $pro_id, $ip);
$run_pro = mysqli_stmt_execute($stmt);

if (mysqli_stmt_affected_rows($stmt) === 0) {
    echo "添加购物车失败,请检查数据";
}
mysqli_stmt_close($stmt);

4. HTML实体转义错误

你代码里的>是HTML实体,PHP中要直接写>,否则这个判断条件会失效,导致逻辑出错:

// 错误写法
if(mysqli_num_rows($run_check)>0) 
// 正确写法
if(mysqli_num_rows($run_check) > 0)

5. 页面跳转时机不合理

应该确认插入成功后再跳转页面,否则哪怕操作失败,用户也会被跳走,误以为操作成功。

修复后的完整代码参考

function cart() { 
    if(isset($_GET['add_cart'])) { 
        global $con; 
        $ip = getIp(); 
        $pro_id = $_GET['add_cart']; 

        // 检查商品是否已在购物车
        $check_pro = "SELECT * FROM cart WHERE ip_add='$ip' AND p_id='$pro_id'"; 
        $run_check = mysqli_query($con, $check_pro); 

        if(mysqli_num_rows($run_check) > 0) { 
            // 可选:这里可以提示用户"该商品已在购物车中"
        } else { 
            // 使用预处理语句插入数据
            $insert_pro = "INSERT INTO cart (p_id, ip_add) VALUES (?, ?)";
            $stmt = mysqli_prepare($con, $insert_pro);
            mysqli_stmt_bind_param($stmt, "ss", $pro_id, $ip);
            $run_pro = mysqli_stmt_execute($stmt);

            if ($run_pro) {
                echo "<script>window.open('index.php','_self')</script>"; 
            } else {
                die("添加购物车失败:" . mysqli_error($con));
            }
            mysqli_stmt_close($stmt);
        } 
    } 
}

额外排查建议

  • 检查getIp()函数是否正确获取到用户IP,确保$ip不是空值;
  • 查看cart表的结构,确认p_idip_add字段是否允许为空,或者是否有外键关联(比如p_id必须对应商品表中存在的ID);
  • 开启PHP错误提示:在代码开头添加error_reporting(E_ALL); ini_set('display_errors', 1);,能快速发现语法错误或警告。

内容的提问来源于stack exchange,提问作者Gayathri G. B

火山引擎 最新活动