如何将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
相关产品推荐
相关产品推荐

