数据库:
表:新闻
使用列:唯一和主键,自动递增称为ID,内容和标题
代码:
- >创建一个带有文本字段的表单,用户可以在其中输入ID的值以及项目的位置
$form->textField("Position of the item item", "id", false, 30, false, getIfExists("id", $originalValues));
- >将新ID作为查询发布到数据库
$queryvalues["id"] = $_POST[ "id" ];
当我发布未被其他项目使用的ID时,它会起作用。但是,如果我尝试覆盖ID,它会给我一个错误,并且不会改变任何内容。显然,我需要更新ID,以便它会增加所有冲突的ID,从而允许发布已编辑的ID。
我对如何做到这一点感到有点恼火。我有想法添加一个定义位置的索引号,然后切换到使用数据库ID对列表进行排序,并且只要CMS的用户愿意,更改CMS中的ID就能够更新。
但是,我不太清楚如何处理这个以及是否有更好的选择/解决方案。
有没有人有任何想法/提示/提示?
我尝试使用ON DUPLICATE KEY UPDATE,但到目前为止我没有运气。
修改
好的,现在订购工作。我创建了一个名为Position的新列,只是使用它来订购项目,它工作正常。
但是,如果我添加一个具有相同位置的新项目,它会将其置于另一个位置。所以基本上新的“0”列在旧的“0”下,同时共享相同的密钥。对于如何解决这个问题,有任何的建议吗?我在考虑增加旧的重复键。但不知道这将如何运作。
答案 0 :(得分:3)
请勿触摸id列,保持原样。创建一个名为“position”的新列并使用它,然后它将允许非唯一值。
您的ID设置为始终唯一,原因是自动增加也无济于事。当您删除内容时,您的id列将不可避免地存在空白,但这不是问题。
答案 1 :(得分:1)
“主键”被强制为唯一且永久保留。它是实体的标识符,不打算用作排序/排序。
要满足您的要求,只需添加int或datetime / timestamp字段,然后添加SELECT * FROM yoour_table ORDER BY field_name
答案 2 :(得分:0)
我了解您要使用该ID来订购商品:请勿这样做。
而是添加名为“ordering”的新列: