十年网站开发经验 + 多家企业客户 + 靠谱的建站团队
量身定制 + 运营维护+专业推广+无忧售后,网站问题一站解决
首先俩表即可 即 商品表 + 商品属性表
成都创新互联公司是一家集网站建设,泗阳企业网站建设,泗阳品牌网站建设,网站定制,泗阳网站建设报价,网络营销,网络优化,泗阳网站推广为一体的创新建站企业,帮助传统企业提升企业形象加强企业竞争力。可充分满足这一群体相比中小企业更为丰富、高端、多元的互联网需求。同时我们时刻保持专业、时尚、前沿,时刻以成就客户成长自我,坚持不断学习、思考、沉淀、净化自己,让我们为更多的企业打造出实用型网站。
商品表和属性表是1对多的关系
所以商品表保存一些固定属性 比如商品名字 总库存 剩余库存之类等等 具体情况而定 比如你说的裤子外套等
属性表则保存比如你说的颜色 尺码 当前属性下的库存之类的
metA http-equiv="Content-Type" content="text/html; chArset=utf-8"
?php
$skuattr= Array
(
'7' = Array
(
'6' = '22x33',
'9' = '44x55'
),
'8' = Array
(
'12' = '大小号'
),
'9' = Array
(
'8' = '金属质',
'13' = '塑料',
),
'16' = Array
(
'14' = '圆形'
)
);
/*
主要思路:
这个商品有4种参数,参数不同的商品算作一种类型
那么这个商品有2x1x2x1=4 种不同类型,要全部列出这个商品类型需要4行
第一个参数只有2种,那么每种需要显示2次
第二个参数只有1种,那么每种需要显示4次
第三个参数只有2种,那么每种需要显示2次
第四个参数只有1种,那么每种需要显示4次
这样排列组合的新二维数组每一行就是商品的一种类型了
这个问题类似一个四位数
千位可选2个不同的数,百位只能选1个数字,十位只能选2个数,个位只能选1个数
有多少个不同的数字。
这里就用函数getRows()算出了,然后从每一列下手,把参数出现的次数填入即可
PS:
抛砖引玉了,期待更好的解法~
发现问题比较好理解,只是毕竟是索引数组显示还是不太好弄的。
不然四位数用for循环四次,表示我想不出来
*/
showTypes($skuattr);
function showTypes($Arrs){
$rows=getRows($Arrs);//获取行数 即商品的不同规格组合数
echo $rows;
$newA=array();//结果数组
$col=0;
foreach($Arrs as $key=$value){
$row=0;
foreach($value as $key2=$value2){//竖直填充
$times=count($value);
for($i=0;$i($rows/$times);$i++){//重复次数
$newA[$row][$col]=$key.':'.$key2;
$row++;
}
}
$col++;
}
/* echo 'pre';
print_r($newA);
echo '/pre'; */
foreach($newA as $value){//显示结果
foreach($value as $value){
echo $value.';';
}
echo '/br';
}
}
function getRows($Arrs){
$num=1;
foreach($Arrs as $value){
$num=$num*count($value);
}
return $num;
}
?
看你这个数据库字段名,应该是打一个用户一次产生的订单全部放在这一条记录里了,所以有total字段,那么就需要存用户买的商品的id(或与sku匹配的相关id),和购买商品的数量。我觉得可以组合成类似这样的字符串存进去:
1,1;2,1;3,2
其中分号分隔的不同商品,逗号分隔的是一个商品的商品id和购买数量
PHP连接MYSQL数据库代码
2015-03-04 275人 1页
3.8分
- ?php $mysl_server_name='localhost'; //改成自己的mysl数据库服务器 $mysl_username='root'; //改成自己的mysl数据库用户名 $mysl_password='12345678'; //改成自己的mysl数据库密码 $mysl_database='mycounter'; //改成自己的mysl数据库名 $conn=mysl_connect($mysl_server_name,$mysl_username,$mysl_password,$mysl_database); $sl='CREATE DATABASE mycounter DEFAULT CHARACTER SET gbk COLLATE gbk_chinese_ci; '; mysl_uery($sl); $sl='CREATE TABLE `counter` (`id` INT(255) UNSIGNED NOT NULL AUTO_INCREMENT ,`count` INT(255) UNSIGNED NOT NULL DEFAULT 0,PRIMARY KEY ( `id` ) ) TYPE = innodb;'; mysl_select_db($mysl_database,$conn); $result=mysl_uery($sl); //echo $sl; mysl_close($conn); echo uot;Hello!数据库mycounter已经成功建立!uot;; ? PHP连
还有不会的可以看看后盾人的视频
这个问题的核心点在于:不同商品类别差异很大,如何设计通用的存储方案?简单来说,用数据库去存储所有信息,不管横表还是纵表,都有明显的缺陷:横表:同一个字段对不同商品含义不一样,这到了后面开发和维护是很蛋疼的纵表:一个商品的属性分布到很多行记录中,业务处理很麻烦,而且纵表的记录数会非常多,性能会有问题所以不要尝试只用数据库去统一解决这个问题,思路扩散一些其实就简单了:公共表:提炼商品公共的信息放到数据库,例如商品id、名称、发布的商家、发布日期、上架状态扩展表:将变化的信息放到另外一个表,可以是数据库表,例如电脑商品一个表、服装一个表;也可以将信息放到MongoDB或者ElasticSearch这类文档数据库。搜索组件:扩展表在全文搜索的时候不好实现,因此需要独立的组件负责搜索,可以用Elastic Search或者Solr来冗余一份数据,用于搜索。表结构不算复杂,因为项目关系只有SPU,没有涉及到SKU,但是可以做参考,更多的还是要根据项目实际情况设计。重点说明一下产品表的SPU,Keyword字段。本来之前设计了关系表,但是发现在做SQL查询时太痛苦,所以约定了一种数据存储结构(数据结构的重要性)基于上面的基础,可以实现URL规则变化的查询,类似京东的产品查询URL变化c=1,3 指分类层次关系ev=3_1+4_18 指SPU查询 按约定规则转换成字符串再进行查询。
!DOCTYPE html
html
head
meta charset="utf-8"
title/title
link rel="stylesheet" href="---.css"
script src="---.js"/script
/head
body
div class="container"
div class="shop"
div class="header"
input type="checkbox" class="shop-checkbox"
span class="shop-icon"/span
span class="shop-name"---/span
span class="wangwang-icon"/span
/div
div class="items"
div class="item"
divinput class="item-checkbox" type="checkbox" name="" id=""/div
div
span class="item-img"/span
/div
div class="item-name"
div----/div
div class="promotion-icons"span/spanspan/spanspan/span/div
/div
div class="sku"---/div
div class="price"
div class="price-1"---/div
div class="price-2" data-price="---"----/div
/div
div class="num-control"
span class="num-minus"-/span
input class="num" type="text" value="1"
span class="num-plus"+/span
/div
div class="item-price-total"
span¥50.13/span
/div
div class="operation"
div---/div
div---/div
/div
/div
/div
/div
div class="shop"
div class="header"
input type="checkbox" class="shop-checkbox"
span class="shop-icon"/span
span class="shop-name"---/span
span class="wangwang-icon"/span
/div
div class="items"
div class="item"
divinput class="item-checkbox" type="checkbox" name="" id=""/div
div
span class="item-img"/span
/div
div class="item-name"
div----/div
div class="promotion-icons"span/spanspan/spanspan/span/div
/div
div class="sku"---/div
div class="price"
div class="price-1"---/div
div class="price-2" data-price="---"---/div
/div
div class="num-control"
span class="num-minus"-/span
input class="num" type="text" value="1"
span class="num-plus"+/span
/div
div class="item-price-total"
span¥9.90/span
/div
div class="operation"
div移入收藏夹/div
div删除/div
/div
/div
div class="item"
divinput class="item-checkbox" type="checkbox" name="" id=""/div
div
span class="item-img"/span
/div
div class="item-name"
div---/div
div class="promotion-icons"span/spanspan/spanspan/span/div
/div
div class="sku"---/div
div class="price"
div class="price-1"---/div
div class="price-2" data-price="---"---/div
/div
div class="num-control"
span class="num-minus"-/span
input class="num" type="text" value="1"
span class="num-plus"+/span
/div
div class="item-price-total"
span¥19.9/span
/div
div class="operation"
div移入收藏夹/div
div删除/div
/div
/div
/div
/body
/html
.container{
width: 1000px;
margin-left: auto;
margin-right: auto;
color: #444444;
}
.header{
margin: 8px;
}
.shop-icon, .wangwang-icon, .promotion-icons span{
display:inline-block;
width: 15px;
height: 15px;
background-color: rgb(117,192,241);
}
.promotion-icons span{
margin-right: 4px;
}
.items{
border: 1px solid #ebe9e9;
}
.item{
display: flex;
margin: 8px;
}
.item-img{
width:100px;
height: 100px;
display: inline-block;
background-color: aquamarine;
margin-left: 6px;
margin-right: 6px;
}
.item-name
{
display: flex;
flex-direction: column;
justify-content: space-between;
}
.sku, .price,.item-price-total,.operation,.num-control{
margin-left: 18px;
}
.num{
width: 18px;
height: 15px;
}
.num-control{
display: flex;
align-items: baseline;
}
.num-minus,.num-plus{
width: 18px;
height: 22px;
display: inline-block;
background-color: #ebe9e9;
}
.checkout{
display: flex;
justify-content: space-between;
}
.shop{
margin-bottom: 20px;
margin-top: 30px;
}
.goods,.freight,.checkout-button{
margin-left: 15px;
}
.price-1{
text-decoration: line-through;
color: gray;
}
.check-num ,.total-price{
font-size: large;
color: red;
margin-left: 3px;
margin-right: 3px;
}
.checkout-button{
height: 30px;
width: 50px;
background-color: beige;
}
.checkout{
margin-top: 15px;
}
.item-name{
width: 25%;
}
.item-price-total{
width: 5%;
}
.sku{
width: 20%;
}
function updatePrice(){
let items = document.querySelectorAll('.item');
let totalNum = 0;
let totalPrice = 0;
items.forEach(function(item){
if(item.querySelector('.item-checkbox').checked){
let num = item.querySelector('.num').value;
totalNum = totalNum + parseInt(num);
let price = item.querySelector('.price-2').getAttribute('data-price');
totalPrice = totalPrice + parseFloat(price) * num;
}
});
document.querySelector('.check-num').innerText= totalNum;
document.querySelector('.total-price').innerText = totalPrice;
}
window.onload=function(){
let itemCheckboxes = document.querySelectorAll('.item-checkbox');
itemCheckboxes.forEach(function(itemCheckbox){
itemCheckbox.onchange = function(){
updatePrice();
}
});
let minuses = document.querySelectorAll('.num-minus');
minuses.forEach(function(minus){
minus.onclick = function(event){
let num=minus.parentElement.querySelector('.num').value;
if(parseInt(num)1)
{
minus.parentElement.querySelector('.num').value=parseInt(num)-1;
updatePrice();
}
};
});
let pluses = document.querySelectorAll('.num-plus');
pluses.forEach(function(plus){
plus.onclick = function(event){
let num=plus.parentElement.querySelector('.num').value;
plus.parentElement.querySelector('.num').value=parseInt(num)+1;
updatePrice();
}
});
}