Php MySQL表中行的更改顺序

Php MySQL表中行的更改顺序,php,mysql,Php,Mysql,我有一段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"].'"&g

我有一段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>';
    }
$sql=“按菜单顺序从页面选择*;
$rs=mysql\u query($sql,$conn)或die(mysql\u error());
而($result=mysql\u fetch\u数组($rs))
{
回声'-|

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

使用此代码的:

$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());
}
$page\u order=$\u GET['page\u order'];
如果($_GET['do']=='up')
{
$sql=“更新页面集菜单顺序='$page\u order'+1 WHERE sequence!='”$\u GET[“seq”]。“'和菜单顺序<'$page\u order';
$rs=mysql\u query($sql,$conn)或die(mysql\u error());
$sql=“更新页面集菜单\u顺序=菜单\u顺序-1,其中顺序=”。$\u GET[“seq”]。“”;
$rs=mysql\u query($sql,$conn)或die(mysql\u error());
}
elseif($\u GET['do']=='down')
{
$sql=“更新页面集菜单\u顺序=”$page\u顺序“-1 WHERE sequence!=”“$\u GET[“seq”]。””;
$rs=mysql\u query($sql,$conn)或die(mysql\u error());
$sql=“更新页面集菜单\u顺序=菜单\u顺序+1,其中顺序=”。$\u GET[“seq”]。“”;
$rs=mysql\u query($sql,$conn)或die(mysql\u 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());
}
$current=$\u GET[“菜单顺序”];
$prev=$current-1;
$next=$current;
如果($_GET['do']=='up')
{
$sql2=“更新页面集菜单顺序=”($prev)。“'WHERE sequence=”。$\u GET[“seq”]。”;
echo$sql2.“
”; $rs2=mysql\u query($sql2,$conn)或die(mysql\u error()); $sql2=“更新页面集菜单顺序=”($next)。“'WHERE sequence=”($\u GET[“seq”]-1)。”; echo$sql2; $rs2=mysql\u query($sql2,$conn)或die(mysql\u error()); } elseif($\u GET['do']=='down') { $sql2=“更新页面集菜单顺序=”($next)。“'WHERE sequence=”。$\u GET[“seq”]。”; echo$sql2.“
”; $rs2=mysql\u query($sql2,$conn)或die(mysql\u error()); $sql2=“更新页面集菜单顺序=”($prev)。“'WHERE sequence=”($\u GET[“seq”]+1)。”; echo$sql2; $rs2=mysql\u query($sql2,$conn)或die(mysql\u error()); }
在我的一个应用程序中,我有一个类似的设置,其中有一个站点上的页面列表,用户可以单击向上/向下箭头重新排序页面。当他们单击向上/向下箭头时,它会发送他们单击的页面id,然后发送“向上”或“向下”

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

第一步是获取要移动的页面的父\u 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);
现在,我们将获取要交换的页面的显示顺序。如果单击向下移动,则将获取下一页的页面id和显示顺序。如果单击向上移动,则将获取上一页的页面id和显示顺序:

$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']
));
我在这里做的是:

  • 获取我们单击的页面的父项id,以便我们只在父项id内移动页面,而不移动其他父项的子项。如果您正在排序的是没有分层的平面列表,则可以跳过此步骤
  • 获取当前页面的显示顺序。由于显示顺序是按顺序存储的,例如1、2、3等,了解当前页面的显示顺序将告诉我需要交换哪个页面。如果当前页面的显示顺序为3,则要交换的页面为2或4,具体取决于我是否单击了“向上”分别为“向下”或“向下”
  • 获取要交换的页面的页面id。如果我们点击“向上”,那么它就是当前页面的显示顺序-1。如果单击“向下”,则是当前页面的显示顺序+1
  • 执行交换,这意味着根据“向上”或“向下”将当前的交换更改为disp_order+1或disp_order-1,然后对正在交换的页面执行相反的操作

请提供所需的结果集和SqlFiddle这很难说,因为我不知道“序列”列在您的设置中是什么意思。在顶部指定“$prev”和“$next”值似乎还为时过早,因为这取决于$\u GET['do']是“向上”还是“向下”“。您是否尝试过使用我发布的代码(当然是为了您的模式而修改它)?这是我在项目中用来做同样事情的工作代码。序列只是一个id列,每个id列都有一个唯一的编号。我尝试过使用你的代码,但是,它的PDO我以前从未使用过,我无法理解它-好吧,我必须仔细研究一下它,因为我以前从未使用过PDO,除非你有一个不使用PDO的例子?最好现在就开始使用PDO,因为
mysql\uquo;
函数是@charlie:PDO被推荐,但不是完成这项任务所必需的。我只是在回复中提到它,因为我使用的是PDO,而你没有,所以我想确保格式的差异是清楚的。