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

如何将PHP购物车SESSION数组的值插入MySQL的order items表

问题修正及正确实现代码

现有代码核心错误点

  • case分支语法错误:case "Placeorder"; 末尾应为冒号:而非分号;
  • SESSION数组键名拼写错误:你写的$_SESSION["cart-item"]应为$_SESSION["cart_item"](下划线而非横杠)
  • 带空格的表名未用反引号包裹:order items 必须写为 `order items`
  • 字符串类型字段值未加单引号包裹,直接插入会触发SQL语法错误
  • 仅构造了SQL语句未调用runQuery()执行,且foreach循环缺少执行逻辑的包裹范围
  • 原Placeorder分支中,你在foreach语句后直接清空了购物车SESSION,遍历插入逻辑根本没有执行

修正后的完整代码

这里采用批量多行插入的方式实现,比循环单条插入性能更高:

<?php
$db_handle= new dbcontroller();
if(!empty($_GET["action"])) 
{
    switch($_GET["action"]) 
    {
        case "add":
            if(!empty($_POST["quantity"])) 
            {
                $productByCode = $db_handle->runQuery("SELECT * FROM products WHERE code='" . $_GET["code"] . "'");
                $itemArray = array($productByCode[0]["code"]=>array('name'=>$productByCode[0]["name"], 'code'=>$productByCode[0]["code"], 'quantity'=>$_POST["quantity"], 'price'=>$productByCode[0]["price"], 'image'=>$productByCode[0]["image"]));
                
                if(!empty($_SESSION["cart_item"])) 
                {
                    if(in_array($productByCode[0]["code"],array_keys($_SESSION["cart_item"]))) 
                    {
                        foreach($_SESSION["cart_item"] as $k => $v) 
                        {
                                if($productByCode[0]["code"] == $k) 
                                {
                                    if(empty($_SESSION["cart_item"][$k]["quantity"])) 
                                    {
                                        $_SESSION["cart_item"][$k]["quantity"] = 0;
                                    }
                                    $_SESSION["cart_item"][$k]["quantity"] += $_POST["quantity"];
                                }
                        }
                    } else 
                    {
                        $_SESSION["cart_item"] = array_merge($_SESSION["cart_item"],$itemArray);
                    }
                } else 
                {
                    $_SESSION["cart_item"] = $itemArray;
                }
            }
        break;
        case "remove":
            if(!empty($_SESSION["cart_item"])) 
            {
                foreach($_SESSION["cart_item"] as $k => $v) 
                {
                    
                    if($_GET["code"] == $_SESSION["cart_item"] [$k]['code'])
                        unset($_SESSION["cart_item"][$k]);              
                    if(empty($_SESSION["cart_item"]))
                        unset($_SESSION["cart_item"]);                  
              
                }
            }
        break;
        case "empty":
            unset($_SESSION["cart_item"]);
          
        break;
        case "Placeorder":
            if(!empty($_SESSION["cart_item"])) 
                {       
                    $insertOrder = $db_handle->runQuery("INSERT INTO `orders`(`Order ID`,`Order Date`) VALUES('$S','$Todaysdate')");
                    
                    // 构造批量插入的数值集合
                    $valueArr = [];
                    foreach ($_SESSION["cart_item"] as $item) {
                        // 基础数据格式处理,避免SQL语法错误
                        $name = addslashes($item['name']);
                        $code = addslashes($item['code']);
                        $quantity = intval($item['quantity']);
                        $price = floatval($item['price']);
                        $image = addslashes($item['image']);
                        $valueArr[] = "('$name', '$code', $quantity, $price, '$image', '$S')";
                    }
                    // 拼接SQL并执行
                    $insertItemSql = "INSERT INTO `order items`(`Item Name`, `Item Code`, `Item Quantity`, `Item Price`, `Item Image`, `Order ID`) VALUES ".implode(',', $valueArr);
                    $db_handle->runQuery($insertItemSql);

                    unset($_SESSION["cart_item"]);           
                    if (ini_get("session.use_cookies")) {
                        $params = session_get_cookie_params();
                        setcookie(session_name(), '', time() - 42000,
                            $params["path"], $params["domain"],
                            $params["secure"], $params["httponly"]
                        );
                    }                    
                    session_destroy();
                }  
        break;    
    }
}
?>

注意:如果你的dbcontroller类支持预处理语句,建议改用预处理方式传参,彻底避免SQL注入风险。

内容的提问来源于stack exchange,提问作者Pedro Morales Serrano

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 03:36:03