0

我在使用 mysql 更新一系列列时遇到了困难。我的总体目标是让用户能够更改列表项的位置,并让所有其他列表项移动位置以适应更改。因此,假设您有一个数字范围 1-6,并且您希望将位置 2 中的项目移动到位置 4,并让每个项目补偿更改,而每个项目仅占用一个位置编号。我已经为此工作了几个小时,我太累了,无法思考。我仍然是 mysql 的新手,但我几乎完成了我的第一个 cms,除了最后一个烦人的花絮。

有问题的代码是:

$newposition = $_POST['position'];
$oldposition = $_GET['oldposition'];
$id = $_GET['id'];

while ($work = mysql_fetch_array($workset)) {

if ($newposition>$oldposition) {
    mysql_query('UPDATE work SET position=position-1 WHERE position<='.$newposition.' AND position>'.$oldposition.'');
    mysql_query('UPDATE work SET position='.$newposition.' WHERE id='.$id.'');
}
elseif 
($newposition<$oldposition) {
    mysql_query('UPDATE work SET position=position+1 WHERE position<'.$oldposition.' AND position<='.$newposition.'');
    mysql_query('UPDATE work SET position='.$newposition.' WHERE id='.$id.'');
}
elseif 
($newposition==$oldposition) {
    echo 'same value!  ';
}
}

它正确创建请求的位置更改,但范围内的所有其他数字都更改为不正确的值。这可能是一个简单的错误..

4

2 回答 2

0

看到这一行 -

mysql_query('UPDATE work SET position=position+1 WHERE position<'.$oldposition.' AND position<='.$newposition.'');

你确定它正确吗?我认为应该是

mysql_query('UPDATE work SET position=position+1 WHERE position > '.$oldposition.' AND position <= '.$newposition.'');
于 2012-07-02T06:08:42.957 回答
0

所以,我想出了一个解决方案给任何有兴趣的人。这不是最干净的,但它似乎已经工作了..

if ($newposition>$oldposition) {
    for ($i=$oldposition+1; $i<=$newposition; $i++) {
        $workset = mysql_query('SELECT * FROM work WHERE position='.$i.' LIMIT 1', $connection);
        while ($work = mysql_fetch_array($workset)) {
            mysql_query('UPDATE work SET position='.$i.'-1 WHERE position='.$i.'');
            mysql_query('UPDATE work SET position='.$newposition.' WHERE id='.$id.'');
        }
    }
}
elseif 
($newposition<$oldposition) {
    for ($i=$oldposition-1; $i>=$newposition; $i--) {
        $workset = mysql_query('SELECT * FROM work WHERE position='.$i.' LIMIT 1', $connection);
        while ($work = mysql_fetch_array($workset)) {
            mysql_query('UPDATE work SET position='.$i.'+1 WHERE position='.$i.'');
            mysql_query('UPDATE work SET position='.$newposition.' WHERE id='.$id.'');
        }
    }
}
elseif 
($newposition==$oldposition) {
}
于 2012-07-02T20:01:09.750 回答