我无法使用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! ';
}
}
它会正确创建请求的位置更改,但范围中的所有其他数字都会更改为不正确的值。这可能是一个简单的错误..
答案 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) {
}