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