更新mysql中的一系列列

时间:2012-07-02 05:59:38

标签: php mysql

我无法使用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!  ';
}
}

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

2 个答案:

答案 0 :(得分: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.'');

答案 1 :(得分: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) {
}