Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/271.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/65.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 如何-sql在删除后更新排序顺序_Php_Mysql_Sql - Fatal编程技术网

Php 如何-sql在删除后更新排序顺序

Php 如何-sql在删除后更新排序顺序,php,mysql,sql,Php,Mysql,Sql,下面的代码工作得很好,但我想知道是否有其他方法来处理这个问题。基本上,删除条目后,我需要更新排序顺序 $sql = 'DELETE FROM `ee_blog_category` WHERE id = '.$category_id; mysqli_query($con,$sql); if(mysqli_error($con)){ echo mysqli_error($con); } // update cat sort $i = 1; $sql = 'SELECT * FROM `ee_

下面的代码工作得很好,但我想知道是否有其他方法来处理这个问题。基本上,删除条目后,我需要更新排序顺序

$sql = 'DELETE FROM `ee_blog_category` WHERE id = '.$category_id;
mysqli_query($con,$sql);
if(mysqli_error($con)){
    echo mysqli_error($con);
}
// update cat sort
$i = 1;
$sql = 'SELECT * FROM `ee_blog_category` ORDER BY `sort`';
$result = mysqli_query($con,$sql);
while ($row = mysqli_fetch_array($result)){
    $sql1 = 'UPDATE `ee_blog_category` SET `sort` = '.$i.' WHERE `id` = '.$row['id'];
    mysqli_query($con,$sql1);
    $i++;
}
是的,有一种不同的方式(我认为更好):

  • 获取已删除项目的排序值(当然,在删除之前)
  • 使用
    sort=sort-1
  • 在您的情况下,这将类似于:

    $sql = "Select sort from ee_blog_category where id=$category_id";
    // execute, fetch, catch errors...
    $sort_original = $row['sort'];
    
    // now update all the others
    $sql = "UPDATE ee_blog_category SET sort=sort-1 where sort > $sort_original"; // maybe add a filter here (by group f.e.)
    // execute, check for errors.
    
    注意:
    您可以接受sql注入。

    更好地使用事先准备好的语句

    使用变量并将其放在一条语句中:

    SET @s := 0;
    UPDATE `ee_blog_category`
        SET `sort` = (@s := @s + 1)
        ORDER BY sort;
    
    实际上,您只需要对大于已删除ID的ID执行此操作。如果只删除一行:

    UPDATE ee_bloc_cateory
        SET sort = sort - 1
        WHERE sort >= (SELECT MIN(sort) FROM ee_bloc_cateory WHERE id = $deleted_id);
    

    在执行删除操作之前,您可以查询
    $deleted\u id
    甚至
    $deleted\u sort

    您可以在更新中进行计算,如
    set sort=sort-1
    。这样就不需要循环。在更新
    sort
    列之前,您首先是如何确定它们的值的?您的更新只是将它们设置为与其
    id
    值相同。您只需按id进行排序,就可以结束了。除非你告诉他们,否则没有人会知道你的
    id
    值是不连续的——有些已经被
    DELETE
    d了。我更喜欢有一个单独的排序列,在插入时计算总行数并加上+1,使最新的条目成为排序中的最后一个。好的,谢谢,是的,$category_id是从一个准备好的语句中获得的。这个解决方案是否解释了一个类别刚刚被删除的事实,并且它现在正在更新剩余行的排序?它正在对被删除行“上方”的所有行进行排序。等等,我错过了。。。我编辑..我编辑了答案,因为我忘记添加
    where sort>$sort\u original
    。这看起来很混乱。。有点像保持事物简单易读,但这可能是一个很好的解决方案