PHP MySql交换两行中的值

PHP MySql交换两行中的值,php,mysql,sql-update,Php,Mysql,Sql Update,我看到了这方面的一些变化,但主要是交换整行,而不是该行中的一个值,而且不是动态交换 问题是: 我有三行,每行有以下单元格(id、标题、内容、显示顺序、可见)。 id是自动递增的。标题和内容是手动输入的,可见是一个切换。显示顺序在创建每行时设置,并自动设置为最高整数并设置在堆栈底部 我这样设置,以便如果手动删除这些记录中的任何一条,我可以自动重新排序堆栈(如果有4条记录,并且我删除了#2,则新的顺序重置为1,2,3,而不是1,3,4) 每行都有一组向上和向下箭头按钮,用于调用move.php,查询

我看到了这方面的一些变化,但主要是交换整行,而不是该行中的一个值,而且不是动态交换

问题是:

我有三行,每行有以下单元格(id、标题、内容、显示顺序、可见)。 id是自动递增的。标题和内容是手动输入的,可见是一个切换。显示顺序在创建每行时设置,并自动设置为最高整数并设置在堆栈底部

我这样设置,以便如果手动删除这些记录中的任何一条,我可以自动重新排序堆栈(如果有4条记录,并且我删除了#2,则新的顺序重置为1,2,3,而不是1,3,4)

每行都有一组向上和向下箭头按钮,用于调用move.php,查询id(id)、display_order(pos)和dir(dir)

在move.php中,它使用一个条件来决定是向上还是向下移动记录,这取决于方向变量的设置

我需要编写什么PHP代码来获取这三个变量(id、pos、dir)并交换表单元格显示顺序中的值:下面是一个可视化表示

首字母:

id   title   pos   
-----------------
 1   slide1   1
 2   slide2   2
 3   slide3   3
单击记录ID#3的向上按钮后:

请注意,ID和POS并不总是相同的整数

根据davidethell的建议,我创建了以下内容:


以下是我创建的内容,但我得到的只是echo$newPos,而不是返回admin.php:

require ("connection.php");
    $id = $_GET['id'];
    $pos = $_GET['pos'];
    $dir = $_GET['dir'];

    if ($dir == 'up') {
        $newPos = $pos-1;
    } else {
        $newPos = $pos+1;
    }

    $fromRow = "SELECT * FROM pages WHERE display_order = ".$pos."";
    $toRow = "SELECT * FROM pages WHERE display_order = ".$newPos."";

    $reord = mysqli_query($conn, "UPDATE pages SET display_order = " . $toRow['display_order'] . " WHERE id = " . $fromRow['id']."; UPDATE pages SET display_order = " . $fromRow['display_order'] . " WHERE id = " . $toRow['id']);

    if ($reord){
        header("Location: admin.php");
    }else{
        echo $newPos;
    }
我遇到的问题是,它只响应$newPos

更新代码:

require ("connection.php");

    $fromArray = array();
    $toArray = array();

    $id = $_GET['id'];
    $pos = $_GET['pos'];
    $dir = $_GET['dir'];

    if ($dir == 'up') {
        $newPos = $pos-1;
    } else {
        $newPos = $pos+1;
    }

    $fromRow = mysql_query("SELECT * FROM pages WHERE display_order = ".$pos."");

    $toRow = mysql_query("SELECT * FROM pages WHERE display_order = ".$newPos."");


    $reord = mysqli_query($conn, "UPDATE pages SET display_order = " . $toRow['display_order'] . " WHERE id = " . $fromRow['id']);
    $reord = mysqli_query($conn, "UPDATE pages SET display_order = " . $fromRow['display_order'] . " WHERE id = " . $toRow['id']);

    if ($reord){
        header("Location: admin.php");
    }else{
        echo $newPos;
    }

结果:回显$newPos,而不是返回admin.php

假设每行数据都是$row对象,只需执行以下操作:

if ($dir == 'up') {
    $fromRow = $row2;
    $toRow = $row1;
}
else {
    $fromRow = $row1;
    $toRow = $row2;
}
$sql = "UPDATE mytable SET pos = " . $toRow['pos'] . " WHERE id = " . $fromRow['id'];
// now execute your SQL however you want in your framework
$sql = "UPDATE mytable SET pos = " . $fromRow['pos'] . " WHERE id = " . $toRow['id'];
// now execute your SQL however you want in your framework
将其放入某种函数或类中以使其可重用

编辑: 根据您的编辑,您的查询中似乎没有获取足够的信息。它们应该是:

$fromRow = mysql_query("SELECT * FROM pages WHERE display_order = ".$pos."");

$toRow = mysql_query("SELECT * FROM pages WHERE display_order = ".$newPos."");

您只选择了id字段,然后尝试使用显示顺序字段。

假设每行数据都有$row对象,只需执行以下操作:

if ($dir == 'up') {
    $fromRow = $row2;
    $toRow = $row1;
}
else {
    $fromRow = $row1;
    $toRow = $row2;
}
$sql = "UPDATE mytable SET pos = " . $toRow['pos'] . " WHERE id = " . $fromRow['id'];
// now execute your SQL however you want in your framework
$sql = "UPDATE mytable SET pos = " . $fromRow['pos'] . " WHERE id = " . $toRow['id'];
// now execute your SQL however you want in your framework
将其放入某种函数或类中以使其可重用

编辑: 根据您的编辑,您的查询中似乎没有获取足够的信息。它们应该是:

$fromRow = mysql_query("SELECT * FROM pages WHERE display_order = ".$pos."");

$toRow = mysql_query("SELECT * FROM pages WHERE display_order = ".$newPos."");

您只选择了id字段,但随后尝试使用display\u order字段。

我不会为您编写PHP代码。但我会给你SQL:

假设如果滑块位置升高1,$delta为+1,或者如果滑块位置降低1,$delta为-1。 $id是幻灯片的id。哦,让我们假设这个表叫做slides\u table

您将需要2个查询:

update slides_table set pos = pos + $delta where id = $id;
update slides_table set pos = pos - $delta where pos = (select pos from slides_table where id=$id) and id != $id

我不会为您编写PHP代码。但我会给你SQL:

假设如果滑块位置升高1,$delta为+1,或者如果滑块位置降低1,$delta为-1。 $id是幻灯片的id。哦,让我们假设这个表叫做slides\u table

您将需要2个查询:

update slides_table set pos = pos + $delta where id = $id;
update slides_table set pos = pos - $delta where pos = (select pos from slides_table where id=$id) and id != $id

您可以使用以下查询:

UPDATE
  yourtable INNER JOIN (
    SELECT
      MAX(yourtable.pos) pos_prec,
      curr.pos pos_curr
    FROM
      yourtable INNER JOIN
      (SELECT pos FROM yourtable WHERE id=3) curr
      ON yourtable.pos<curr.pos
    GROUP BY
      curr.pos) cp ON yourtable.pos IN (cp.pos_prec, cp.pos_curr)
SET
  pos = CASE WHEN pos=cp.pos_curr
             THEN pos_prec ELSE pos_curr END
只需使用+1而不是-1来下移(如果需要,可以在一个查询中组合上移和下移)

PHP代码

这是使用PHP和mysqli,并假设给出了位置:

<?php
$mysqli = new mysqli("localhost", "username", "password", "test");

$pos = 3;
$dir = 'down';

if ($dir == 'up') { $newPos = $pos-1; } else { $newPos = $pos+1; }

if ($stmt = $mysqli->prepare("
  UPDATE
    yourtable
  SET
    pos = CASE WHEN yourtable.pos=?
               THEN ?
               ELSE ? END
  WHERE
    pos IN (?, ?)
    AND (SELECT * FROM (
         SELECT COUNT(*) FROM yourtable WHERE pos IN (?,?)) s )=2;"))
{

    $stmt->bind_param("iiiiiii", $pos, $newPos, $pos, $pos, $newPos, $pos, $newPos); 
    $stmt->execute();
    printf("%d Row affected.\n", $stmt->affected_rows);

    $stmt->close();
}
$mysqli->close();
?>


(我还添加了一个复选框,如果尝试向上移动第一个pos,或向下移动最后一个pos,则不会执行任何操作)。

您可以使用此查询:

UPDATE
  yourtable INNER JOIN (
    SELECT
      MAX(yourtable.pos) pos_prec,
      curr.pos pos_curr
    FROM
      yourtable INNER JOIN
      (SELECT pos FROM yourtable WHERE id=3) curr
      ON yourtable.pos<curr.pos
    GROUP BY
      curr.pos) cp ON yourtable.pos IN (cp.pos_prec, cp.pos_curr)
SET
  pos = CASE WHEN pos=cp.pos_curr
             THEN pos_prec ELSE pos_curr END
只需使用+1而不是-1来下移(如果需要,可以在一个查询中组合上移和下移)

PHP代码

这是使用PHP和mysqli,并假设给出了位置:

<?php
$mysqli = new mysqli("localhost", "username", "password", "test");

$pos = 3;
$dir = 'down';

if ($dir == 'up') { $newPos = $pos-1; } else { $newPos = $pos+1; }

if ($stmt = $mysqli->prepare("
  UPDATE
    yourtable
  SET
    pos = CASE WHEN yourtable.pos=?
               THEN ?
               ELSE ? END
  WHERE
    pos IN (?, ?)
    AND (SELECT * FROM (
         SELECT COUNT(*) FROM yourtable WHERE pos IN (?,?)) s )=2;"))
{

    $stmt->bind_param("iiiiiii", $pos, $newPos, $pos, $pos, $newPos, $pos, $newPos); 
    $stmt->execute();
    printf("%d Row affected.\n", $stmt->affected_rows);

    $stmt->close();
}
$mysqli->close();
?>


(我还添加了一个检查,如果尝试向上移动第一个pos,或向下移动最后一个pos,则不会有任何效果)。

以下是我创建的内容,但我得到的只是echo$newPos,而不是返回到admin。php:好的,您的MySQL调用中出现了一个错误。mysqli_错误的输出是什么?您的错误是试图在同一个查询调用中运行两个UPDATE语句。将它们拆分为两个调用或使用mysqli_multi_查询。我删除了mysqli_查询($conn,$fromRow和$toRow的部分,每行的内容如下:
$fromRow=“SELECT*FROM pages WHERE display_order=”.$pos.”;$toRow=“SELECT*FROM pages WHERE display_order=.$newPos.”
我更新了代码的第二部分以反映这一点。没有返回admin.php的页面,而是显示echo$newPos。我可以看到,当我回显$fromRow和$toRow时,它们只是返回查询,而不是查询的值。下面是我创建的,但我得到的是echo$newPos,而不是返回admin.php:好的,您的MySQL调用中出现错误。mysqli_错误的输出是什么?您的错误是尝试在同一个查询调用中运行两个UPDATE语句。将它们拆分为两个调用或使用mysqli_多_查询。我删除了mysqli_查询($conn,$fromRow和$toRow的每一行的部分内容如下:
$fromRow=“从显示顺序的页面选择*”.$pos.;$toRow=“从显示顺序的页面选择*”.$newPos.);
我更新了代码的第二部分以反映这一点。没有返回admin.php的页面,而是显示echo$newPos。我可以看到,当我回显$fromRow和$toRow时,它们只是返回查询,而不是查询的值。是给定了ID还是给定了位置?我的答案假设是ID,如果是的话当display\u order=$pos然后$newPos ELSE$pos结束display\u order($pos,$newPos)时,您可以使用
UPDATE pages SET display\u order=CASE的位置
但最好使用mysqli,也最好检查我们是在项目的开始阶段还是结束阶段table@fthiella“向上”和“向下”按钮是带有HREF的锚。php?id=XXX&posXXX&dirXXX。move.php是包含此脚本的页面。id是数据库表中的行id。pos是变量B