购物车按p_id单独更新商品数量的SQL问题及解决
购物车商品单条数量更新问题:排查与解决
问题背景
我在开发购物车页面时,碰到了个头疼的问题:想要根据商品的p_id单独更新对应商品的数量,不是批量改全部商品,但最初写的核心代码怎么都跑不起来。当时的代码片段是这样的:
<th><input type="text" name="abcd" size="1" value="<?php echo $_COOKIE['abcd']; ?>"/></th> <?php if(isset($_POST['update_cart'])){ $abcd = $_POST['abcd']; $update_qty = "UPDATE cart SET abcd = '$abcd' WHERE p_id = '$pro_id_t'"; $run_u_qty = mysqli_query($connect, $update_qty); $_COOKIE['abcd'] = $abcd; $total = $total*$abcd; } ?> <input type="submit" name="update_cart" value="update cart"/>
原代码里的几个坑
先说说你最初代码里可能导致失效的几个点:
- SQL注入隐患+语法风险:直接把用户输入的
$abcd和$pro_id_t拼进SQL,不仅不安全,万一变量里有特殊字符(比如单引号),直接就会导致SQL语法错误,执行失败。 - Cookie设置错误:PHP里直接给
$_COOKIE赋值是没用的,这个超全局数组是请求开始时生成的,要真正设置Cookie得用setcookie()函数,不然刷新页面后Cookie值还是旧的。 - 总价计算逻辑错了:
$total = $total*$abcd这行,原总价乘以新数量?这明显不对啊,应该是商品的单价乘以新数量才对,这样算出来的总价肯定是错的。
你找到的自增方案优化
后来你找到的实现“添加商品时数量在原有值上加1”的SQL思路是对的,但要注意不要给abcd + 1加单引号,不然数据库会把它当成字符串处理,而不是数值运算,正确的写法应该是:
$query = "UPDATE cart SET abcd = abcd + 1 WHERE p_id = '$pro_id'";
更稳妥的写法:用预处理语句防注入
如果是手动输入数量更新的场景,或者要让代码更安全,强烈推荐用mysqli的预处理语句,既能避免SQL注入,也能减少语法错误,示例代码如下:
if(isset($_POST['update_cart'])){ // 先把输入转成整数,确保是合法的数量值 $new_qty = intval($_POST['abcd']); $target_pro_id = intval($pro_id_t); // 预处理SQL,绑定参数 $stmt = mysqli_prepare($connect, "UPDATE cart SET abcd = ? WHERE p_id = ?"); mysqli_stmt_bind_param($stmt, "ii", $new_qty, $target_pro_id); mysqli_stmt_execute($stmt); // 正确设置Cookie,给个有效期比如7天 setcookie('abcd', $new_qty, time() + 7*24*3600); // 重新计算总价:得先从数据库拿商品单价,再乘新数量 $price_stmt = mysqli_prepare($connect, "SELECT price FROM cart WHERE p_id = ?"); mysqli_stmt_bind_param($price_stmt, "i", $target_pro_id); mysqli_stmt_execute($price_stmt); mysqli_stmt_bind_result($price_stmt, $pro_price); mysqli_stmt_fetch($price_stmt); $total = $pro_price * $new_qty; }
这样改完,不仅能正常实现单商品数量更新,代码的安全性和健壮性也提升了不少。
内容的提问来源于stack exchange,提问作者Abd Alkader
相关产品推荐
相关产品推荐

