2012-07-02 33 views
0

我无法使用mysql更新一系列的列。我的总体目标是让用户能够更改列表项目的位置,并让所有其他列表项目改变位置以适应更改。所以说你有一系列的数字,1-6,你想将位置2的项目移动到位置4,并且每个项目都会对变化进行补偿,而每个项目只占用一个位置编号。我一直在为此工作了几个小时,而且我太累了,没法思考。我仍然是一个mysql的新手,但我几乎完成了我的第一个CMS,除了这最后一个恼人的消息。在mysql中更新列的范围

的代码中的问题是:

$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! '; 
} 
} 

它正确地创建要求的位置变化,但都在范围内的其他数字得到改变不正确的值。这可能是一个简单的错误..

+0

尝试输出您正在生成的SQL,并按照实际执行更新的逻辑进行操作。 – andrewsi

回答

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) { 
} 
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.''); 
+0

实际上它应该等于: \t \t mysql_query('UPDATE work SET position = position + 1 WHERE position <'。$ oldposition。'AND position> ='。$ newposition。''); 我想我只是在发布前改变了它(我不知道为什么)。但是,好的电话。但它并没有解决问题。我已经确定问题与“位置=位置+1”和“位置=位置-1”有关,但我不知道如何解决它。它不会像我期望的那样从原始位置向上或向下移动,但如果将其更改为“position = -1”,它会将所有适当的列更改为“-1”.. –