4

我有这个列出表中行的 PHP 代码:

$sql="SELECT * from pages order by menu_order ASC ";
    $rs=mysql_query($sql,$conn) or die(mysql_error());
    while($result=mysql_fetch_array($rs))
    {
        echo '<a href="edit_page.php?pagename='.$result["pagename"].'">'.$result["title"].'</a> - <a href="edit_page.php?do=up&page_order='.$result["menu_order"].'&seq='.$result["sequence"].'">Move Up</a> | <a href="edit_page.php?do=down&page_order='.$result["menu_order"].'&seq='.$result["sequence"].'">Move Down</a><br><br>';
    }

他们有上下链接来改变顺序

使用此代码:

$page_order = $_GET['page_order'];
if ($_GET['do'] == 'up')
{
    $sql="UPDATE pages SET menu_order = '$page_order' +1 WHERE sequence != '".$_GET["seq"]."' AND menu_order < '$page_order' ";
    $rs=mysql_query($sql,$conn) or die(mysql_error());

    $sql="UPDATE pages SET menu_order = menu_order -1 WHERE sequence = '".$_GET["seq"]."' ";
    $rs=mysql_query($sql,$conn) or die(mysql_error());
}
elseif($_GET['do'] == 'down')
{
    $sql="UPDATE pages SET menu_order = '$page_order' -1 WHERE sequence != '".$_GET["seq"]."' ";
    $rs=mysql_query($sql,$conn) or die(mysql_error());

    $sql="UPDATE pages SET menu_order = menu_order +1 WHERE sequence = '".$_GET["seq"]."' ";
    $rs=mysql_query($sql,$conn) or die(mysql_error());
}

但它不起作用 - 它随机更改数字,就像将它们全部更改为 0 或负数

正确执行此操作的最佳方法是什么?

编辑:新代码...

我已经尝试过这段代码,但它不能很好地工作 - 如果我将底行向右移动到顶部,它每次都会更改数字 -1 但最终会出现重复的订单号?

$current = $_GET["menu_order"];
$prev = $current-1;
$next = $current;

if($_GET['do'] == 'up')
{
    $sql2="UPDATE pages SET menu_order = '".($prev)."' WHERE sequence = '".$_GET["seq"]."' ";
    echo $sql2.'<br>';
    $rs2=mysql_query($sql2,$conn) or die(mysql_error());

    $sql2="UPDATE pages SET menu_order = '".($next)."' WHERE sequence = '".($_GET["seq"]-1)."' ";
    echo $sql2;
    $rs2=mysql_query($sql2,$conn) or die(mysql_error());
}
elseif($_GET['do'] == 'down')
{
    $sql2="UPDATE pages SET menu_order = '".($next)."' WHERE sequence = '".$_GET["seq"]."' ";
    echo $sql2.'<br>';
    $rs2=mysql_query($sql2,$conn) or die(mysql_error());

    $sql2="UPDATE pages SET menu_order = '".($prev)."' WHERE sequence = '".($_GET["seq"]+1)."' ";
    echo $sql2;
    $rs2=mysql_query($sql2,$conn) or die(mysql_error());
}
4

1 回答 1

1

我在我的一个应用程序中有一个类似的设置,其中我有一个站点上的页面列表,用户可以单击向上/向下箭头来重新排序页面。当他们单击向上/向下箭头时,它会发送他们单击的 page_id,然后是“向上”或“向下”。

我使用的是 PDO,所以我的格式看起来和你的有点不同。此外,我网站上的页面可以分层(即下拉导航),因此它们也有父 ID。当我更改它们的顺序时,我希望它们在父级的子级中更改顺序,而不是在整个页面集中。如果您要订购的东西是平的,您可以删除其中的一些。

第一步是获取我们要移动的页面的 parent_id:

$parent_query  = "SELECT parent_id FROM page WHERE page_id = :page_id";
$parent_result = $db_mysql->prepare( $parent_query );
$parent_result->execute( array(
    ":page_id" => $_GET['page_id']
));

$parent_row = $parent_result->fetch( PDO::FETCH_ASSOC );

接下来我们获取当前页面的显示顺序:

$page_query = "SELECT disp_order FROM page WHERE page_id   = :page_id AND parent_id = :parent_id";
$page_result = $db_mysql->prepare( $page_query );
$page_result->execute( array(
    ":page_id"   => $_GET['page_id'],
    ":parent_id" => $parent_row['parent_id']
));

$page_row = $page_result->fetch( PDO::FETCH_ASSOC);

现在我们将获取我们正在交换的页面的显示顺序。如果我们点击向下移动,那么我们会得到下一页的page_id和disp_order。如果我们点击向上移动,我们会得到上一页的page_id和disp_order:

$swappage_query = "SELECT page_id, disp_order FROM page WHERE disp_order = :disp_order AND parent_id  = :parent_id";
$swappage_result = $db_mysql->prepare( $swappage_query );

if( $_GET['move'] == "up" ) {
    $swappage_result->execute( array(
        ":disp_order" => $page_row['disp_order'] - 1,
        ":parent_id"  => $parent_row['parent_id']
    ));
} else {
    $swappage_result->execute( array(
        ":disp_order" => $page_row['disp_order'] + 1,
        ":parent_id"  => $parent_row['parent_id']
    ));
}

$swappage_row = $swappage_result->fetch( PDO::FETCH_ASSOC );

最后,我们将通过更改我们单击的页面和我们正在交换的页面旁边的页面的显示顺序来执行交换:

$neworder_query = "UPDATE page SET disp_order = :disp_order WHERE page_id = :page_id";

$neworder_result = $db_mysql->prepare( $neworder_query );
$neworder_result->execute( array(
    ":disp_order" => $swappage_row['disp_order'],
    ":page_id"    => $_GET['page_id']
));

$neworder_result->execute( array(
    ":disp_order" => $page_row['disp_order'],
    ":page_id"    => $swappage_row['page_id']
));

我在这里做的是:

  • 获取我们点击的页面的 parent_id,这样我们只在 parent_id 内移动页面,而不是其他父级的子级。如果您订购的是没有分层的平面列表,您可以跳过此步骤。
  • 获取当前页面的显示顺序。由于显示顺序是按顺序存储的,比如 1、2、3 等,知道当前页面的显示顺序就可以告诉我需要与哪个页面进行交换。如果当前页面的显示顺序为 3,则要交换的页面为 2 或 4,具体取决于我分别单击“向上”还是“向下”。
  • 获取我们要交换的页面的 page_id。如果我们点击“up”,那么它是当前页面的disp_order - 1。如果我们点击“down”,那么它是当前页面的disp_order + 1。
  • 执行交换,这意味着根据“up”或“down”将当前的更改为 disp_order + 1 或 disp_order - 1,然后对我们正在交换的页面执行相反的操作。
于 2013-07-28T17:11:51.540 回答