php - 如何在数据库表中保存订单?
问题描述
也许很奇怪,但我在 SO 中找不到关于我的问题的(好)帖子。
我有一些菜单项,我想让用户以自定义顺序将它们保存在数据库表中。我正在使用 jquery UI 让他们以良好的顺序放置项目(在 tbody 元素上可排序)。我现在的情况真的很简单,但是以后会更复杂(子菜单,特殊页面,...)..
<table>
<thead>
<tr>
<th>#</th>
<th>Item</th>
<th>ID</th>
</tr>
</thead>
<tbody>
<tr>
<td>1</td>
<td>Title</td>
<td>2</td>
</tr>
<tr>
<td>2</td>
<td>Title</td>
<td>4</td>
</tr>
<tr>
<td>3</td>
<td>Title</td>
<td>6</td>
</tr>
</table>
我的问题: 我有什么可能将项目的顺序保存在数据库表中。这种可能性的缺点是什么?
我正在考虑将其保存在带有页面(id)和权重的数据库表中。越高,它就越不重要(数据库表必须微调)..
CREATE TABLE `pageweight` (
`id` int(11) NOT NULL,
`page` int(11) NOT NULL,
`weight` int(11) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
我看到的可能性:
我可以将它保存在 jQuery 中,方法是在我的 tablebody 中选择 tablerows。对于每个表行,我都有一个 Ajaxrequest.. 更新/在数据库中创建一行..
我可以使用表单中的隐藏字段。id/name-attribute 可以包含 menuitemid,值是权重。jQuery 每次有变化都可以更新吗?然后在PHP中我处理每个字段并让它保存..
或者还有其他方法吗?尤其是变大的时候..
解决方案
最基本的方法是迭代每一行并将每个单元格组合成一个对象,保存到一个数组中。
function getTableData(tObj){
var keys = [];
$("thead tr th").each(function(i, el){
keys.push($(el).text().trim());
});
var rows = [];
$("tbody tr", tObj).each(function(i, el){
var r = {};
$.each(keys, function(k, v){
if(v == "#"){
r["id"] = parseInt($("td", el).eq(k).text().trim());
} else {
r[v] = $("td", el).eq(k).text().trim();
}
});
rows.push(r);
});
}
var pageWeights = getTableData($("table"));
此函数将读取标题行和创建的键。假设它们是id
、page
和weight
或任何其他值,它将收集它们。然后它将捕获每个正文行的关联数据。如果您执行console.log(pageWeights)
,您会看到如下内容:
[{
id: 1,
page: "Title",
weight: "2"
},{
id: 2,
page: "Title",
weight: "4"
},{
id: 3,
page: "Title",
weight: "6"
}];
然后,您可以将其发布到服务器端脚本:
$.post("savetable.php", {
data: JSON.stringify(pageWeights)
}, function(result){
console.log(result);
});
如果您的表更复杂,这可能不是最佳解决方案。例如,如果表包含 100 或 1000 行,这可能会创建大量无法通过 POST 传递的数据,或者可能导致浏览器性能不佳。考虑改变函数:
- 收集特定数量的行
- 仅查找更改的数据并仅发送那些更新
- 减少表格中显示的数据量
您可能还想查看使用DataTables库。这对您可能想做的很多事情都有帮助。
希望有帮助。
推荐阅读
- python - 相当于 Python getattr,但用于索引或键
- angular - Angular 9延迟加载模块的每个组件
- kotlin - Why sealed modifier cannot be used with object in Kotlin?
- javascript - fullcalendar.js v4 - 如何在列表视图的标题中设置 html?
- r - 如何更改axis.line.y的限制
- c++ - 在将数字转换为三进制基数时收集余数(C++)
- c++ - 如何使用 boost::spirit 解析两个字符串?
- kubernetes - K8S:使用 Istio 路由返回 404
- php - FOSUserBundle 不断将密码保存为明文
- python-3.x - Python 3 脚本占用过多内存