Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/53.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 根据用户偏好在表中排序项目,正确的方法是什么?_Php_Mysql - Fatal编程技术网

Php 根据用户偏好在表中排序项目,正确的方法是什么?

Php 根据用户偏好在表中排序项目,正确的方法是什么?,php,mysql,Php,Mysql,在看到joomla使用箭头来排序项目(文章、菜单条目等)的方法后,我想知道在表中移动元素的最佳实践是什么 显然,表中必须有一个字段,其中包含数字、字母或任何您可能想要用来定义顺序的内容,然后您必须更改此顺序,我想不出任何优雅的方法来实现这一点,您能帮助我吗 多谢各位 编辑: 阅读答案后,我意识到我可能不太清楚,我不需要根据标准参数(如我不知道、日期、id等)订购商品。我需要自己决定一个订单。像这样: id - name - order 1 one 2 2 two 1 3

在看到joomla使用箭头来排序项目(文章、菜单条目等)的方法后,我想知道在表中移动元素的最佳实践是什么

显然,表中必须有一个字段,其中包含数字、字母或任何您可能想要用来定义顺序的内容,然后您必须更改此顺序,我想不出任何优雅的方法来实现这一点,您能帮助我吗

多谢各位

编辑: 阅读答案后,我意识到我可能不太清楚,我不需要根据标准参数(如我不知道、日期、id等)订购商品。我需要自己决定一个订单。像这样:

id - name - order
1    one    2
2    two    1
3    three  3
我想知道更改项目顺序的正确方法(例如,如果我想让一个进入第一个位置,我需要将顺序值2更改为“2”,将顺序值1更改为“1”)


希望我能正确地解释我自己

如果你有一张小桌子,你可以在客户端完成 使用jquery插件

链接到演示:

您需要为另一个表中的每个用户保存字段排序的首选项, 比如说名字,年龄

之后,您只需要在js部分中在

$(document).ready(function()     {         $("#myTable").tablesorter( {sortList: [[0,0], [1,0]]} );     } );

在这个解决方案中,您不需要更改查询,最简单的方法是在用于生成表的语句中有一个“order by”子句,并通过每个标题单元格中的链接符号来控制,如Joomla中的箭头

…因此,当有人单击箭头(或您使用的任何东西)时,它是返回页面的超链接,只有一个“orderby”CGI变量,如“`”

然后修改查询以使用该变量:

$sql = 'select col1, col2, col3 from table where col2 = somevalue';
if ($_REQUEST['orderby']) $sql .= " order by ' . $_REQUEST['orderby'];
您将需要处理引号等。如果它是一个字符串值,并且如果表首先是用CGI变量生成的,那么您也必须处理该状态


使用Ajax或jquery或其他方法(如另一个答案所示)在页面内处理表的重新生成会更好(但要困难得多!),以避免使用状态重新加载整个页面。

使用大数字进行排序:

id - name - order
1    one    200000
2    two    100000
3    three  300000

当你需要在2到1之间移动3时,只需在100000到200000:150000之间改变它的顺序值。


最后,您需要在两个相邻的数字之间插入元素。如果发生这种情况,只需先重写所有行的顺序列,再次使用100000步。请仔细选择步骤,这样不会使类型溢出,也不必太频繁地重写整个表。

看到您所做的编辑,我明白至少,您正在尝试。我以与您提到的类似的方式实现了一个解决方案,使用and Order列,然后在Order BY子句中使用Order列


一个最佳实践技巧是使用10、20、30等数字,而不是1、2、3。这使我能够灵活地在10和20之间插入一个新的订单值行,例如15,用于以后出现的新数据。

将数据保留为链接列表:

id parent name -- ------ ----- 1 2 one 2 0 two 3 1 three 这将按正确顺序返回列表:

id parent name -- ------ ----- 2 0 two 1 2 one 3 1 three id父名称 -- ------ ----- 202 1.2.1 313 在这样的设计中,移动一个项目甚至一个项目块最多只需要更新三行

有关在列表上移动项目的存储过程,请参见我的博客中的以下条目:


这必须在服务器端完成,我将在菜单系统中使用它,我希望能够更改菜单中项目的顺序。我只是想补充一点,您应该清理输入。否则,人们可以自由地将查询插入到您的数据库中,而且由于不是每个人都是好人,您可能会有一个糟糕的结果,因为当然,想象一下“post”表 id parent name -- ------ ----- 2 0 two 1 2 one 3 1 three