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"].'">'.$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()); } 解决方法
我在我的一个应用程序中有类似的设置,我在网站上有一个页面列表,用户可以单击向上/向下箭头来重新排序页面.当他们点击向上/向下箭头时,它会发送他们点击的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.如果我们单击“向上”,那么它是当前页面的disp_order – 1.如果我们单击“向下”,那么它是当前页面的disp_order 1.>执行交换,这意味着将当前的一个更改为disp_order 1或disp_order – 1,具体取决于“向上”或“向下”,然后与我们交换的页面相反. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |