【问题标题】:Reorder rows within groups对组内的行重新排序
【发布时间】:2015-03-18 18:40:20
【问题描述】:

我正在为一个拥有大量图片库的网站制作一个管理系统。该界面将允许用户在每个图库中添加、删除或重新排序图像。

我有一个包含所有画廊中所有图像的表格,“id”自动递增,并且 sort_order 的默认设置为 0。

+----+-----------+------------+------------+
| id |gallery_id | sort_order |
+----+-----------+------------+------------+
| 1  | 1         |         1  |
| 2  | 1         |         0  |
| 3  | 1         |         2  |
| 4  | 1         |         3  |
| 5  | 1         |         4  |
| 6  | 1         |         5  |
| 7  | 1         |         6  |
| 8  | 2         |         0  |
| 9  | 2         |         1  |
| 10 | 2         |         2  |
| 11 | 2         |         3  |
| 12 | 2         |         4  |
| 13 | 2         |         5  |
| 14 | 2         |         6  |
+----+-----------+------------+------------+

这是重新排序查询,通过 ajax 使用序列化数组:

if($_POST['item']) {
$order = 0;

foreach ($_POST['item'] as $id) {

$rearrange = $db->query
("UPDATE images SET sort_order = '".$order."' WHERE id = '".$id."'");
    $order++;

它根据传入的数组的长度来限制sort_order,然后默认为0代表下一个组。我可以重新排序、添加、删除,并且它始终限制对我正在编辑的 gallery_id 组的更改。

(作为一个实验,我在所有画廊中按升序插入了 sort_order 值,如下所示:

+----+-----------+------------+------------+
| id |gallery_id | sort_order |
+----+-----------+------------+------------+
| 1  | 1         |         0  |
| 1  | 1         |         1  |
| 2  | 1         |         2  |
| 3  | 1         |         3  |
| 4  | 1         |         4  |
| 5  | 1         |         5  |
| 6  | 1         |         6  |
| 7  | 1         |         7  |
| 8  | 2         |         8  |
| 9  | 2         |         9  |
| 10 | 2         |         10 |
| 11 | 2         |         11 |
| 12 | 2         |         12 |
| 13 | 2         |         13 |
| 14 | 2         |         14 |
+----+-----------+------------+------------+     

当我使用我的界面对行重新排序时,它限制了 gallery_id 组中的 sort_order,完全如第一个表所示)。

我正在寻找这种方法的注意事项。有人这样做过吗?

【问题讨论】:

    标签: php mysql ajax


    【解决方案1】:
    UPDATE images
    SET
        sort_order = FIELD(id, A, B, C, D, E)
    WHERE gallery_id = N
        AND id IN(A, B, C, D, E)
    

    【讨论】:

      【解决方案2】:

      我也是这样做的,但实际上我是通过计算每个图库中的行数来放置最后插入的图像。当用户想要订购时,他必须先过滤特定图库的列表,然后才能对图库中的图像进行排序。

      我不得不指出您的代码存在严重的安全问题。我真的,真的,真的希望您实际上并没有编写这样的查询,因为任何人都可以轻松地对您的数据库做任何他们想做的事情。

      http://xkcd.com/327/ 浮现在脑海。如果我提交像0'; drop table images; 这样的项目,您的整个表格都消失了。

      【讨论】:

      • 感谢您的好建议。我确实对所有东西都进行了消毒。请问在重新排序之前如何过滤特定画廊的列表?
      • 我使用了一个框架,它向我显示了带有过滤选项的列表,其中一个过滤器是 gallery_id。我不允许他们排序,直到他们过滤特定的画廊。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-07-18
      • 2022-01-08
      • 2021-04-13
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多