0

我在一个页面上有一堆照片并使用 jQuery UI 的 Sortable 插件,以允许对它们进行重新排序。

当我的可排序函数触发时,它会写入一个新的顺序序列:

1030:0,1031:1,1032:2,1040:3,1033:4

逗号分隔字符串的每个项目,由照片 ID 和订单位置组成,以冒号分隔。当用户完全完成重新排序后,我将通过 AJAX 将此订单序列发布到 PHP 页面,以将更改存储在数据库中。这就是我遇到麻烦的地方。

我让我的脚本正常工作没有问题,但我很确定这是实现我想要的不正确的方法,并且会在性能和资源方面遭受巨大损失 - 我希望有人能告诉我什么是最好的方法。

这是我处理序列的 PHP 脚本:

if ($sorted_order) {
    $exploded_order = explode(',',$sorted_order);
    foreach ($exploded_order as $order_part) {
        $exploded_part = explode(':',$order_part);
        $part_count = 0;
        foreach ($exploded_part as $part) {
            $part_count++;
            if ($part_count == 1) {
                $photo_id = $part;
            } elseif ($part_count == 2) {
                $order = $part;
            }
            $SQL = "UPDATE article_photos ";
            $SQL .= "SET order_pos = :order_pos ";
            $SQL .= "WHERE photo_id = :photo_id;";
            ... rest of PDO stuff ...
        }
    }
}

我的担忧来自嵌套foreach函数以及运行如此多的数据库更新。如果给定的序列包含 150 个项目,这个脚本会寻求帮助吗?如果会,我该如何改进它?

** 这是一个管理页面,所以它不会被严重滥用 **

4

3 回答 3

1

您可以使用一个更新,使用一些像这样的切割器代码:

在循环中创建数组 $data['order'] 然后:

$q = "UPDATE article_photos SET order_pos = (CASE photo_id ";
    foreach($data['order'] as $sort => $id){
        $q .= " WHEN {$id} THEN {$sort}";
    }
    $q .= " END ) WHERE photo_id IN (".implode(",",$data['order']).")";

也许更清楚一点

UPDATE article_photos SET order_pos = (CASE photo_id
    WHEN id = 1 THEN 999
    WHEN id = 2 THEN 1000
    WHEN id = 3 THEN 1001
    END)
WHERE photo_id IN (1,2,3)

我将这种方法用于您正在做的事情,更新排序顺序

于 2013-09-11T22:33:13.280 回答
1

我建议让你的脚本更简单,并更改变量的名称,这样代码就会更具可读性。

$parts = explode(',',$sorted_order);

foreach ($parts as $part) {
    list($id, $position) = explode(':',$order_part);
    //Now you can work with $id and $position ;
}

更多信息list: http: //php.net/manual/en/function.list.php

此外,关于性能和您的数据结构:

您存储数据的方式并不完美。但是这样你就不会遇到任何性能问题,你需要发送更少的数据,减少整体开销。

然而,您的数据结构的缺点是您很可能无法在表之间建立关系并以正确的方式进行连接或更改表结构。

于 2013-09-11T22:03:06.190 回答
1

不需要第二个 foreach:您知道如果您的数据通过验证,它将分为两部分(我假设您验证了这一点。如果没有:您应该 =)所以就这样做:

if (count($exploded_part) == 2) {
  $id = $exploded_part[0];
  $seq = $exploded_part[1];
  /* rest of code */
} else {
  /* error - data does not conform despite validation */
}

至于更新锤击:在事务中进行数据库更新。您的数据库将对操作进行排队,但在您提交事务之前不会将它们提交到主数据库,此时它会很高兴地以闪电般的速度“真正地”进行更新。

于 2013-09-11T22:03:42.580 回答