PHP HTML表单如何告知用户何时添加新条目


PHP HTML form how to tell when a user adds a new entry

我为标题的模糊性道歉,但我发现这很难用语言表达。

我有一个包含key:value对的表单,这些对从数据库中读取,作为值放入输入中,然后再次读取(可能被编辑、删除或添加到)。在服务器端,我需要弄清楚用户做了什么来破坏我的数据。

示例:

<input type='text' name='keyID[]' value='1'/>
<input type='text' name='key[]' value='someKey'/>
<input type='text' name='value[]' value='someValue'/>
<input type='text' name='keyID[]' value='2'/>
<input type='text' name='key[]' value='someOtherKey'/>
<input type='text' name='value[]' value='someOtherValue'/>
<input type='text' name='keyID[]' value='3'/>
<input type='text' name='key[]' value='yetAnotherKey'/>
<input type='text' name='value[]' value='yetAnotherValue'/>
<input type='text' name='key[]' value='aCompletelyNewKey'/>
<input type='text' name='value[]' value='aCompletelyNewValue'/>

提交表单时,我删除原始数据,通过键执行foreach循环(将其他数组的第n个值作为我的新数据),并将其添加到数据库中。

直到我在更新的数据库设计中遇到了一个障碍——现在我需要能够说出哪些内容没有提交(在页面上删除),哪些内容仍然存在(更改或保持原样),以及哪些内容是新的(不会有keyID[])。

我一直在对当前存储的keyID[]列表使用array_diff()来确定要删除和更新什么,但如果新输入没有keyID[](但同时有key[]value[]),我该如何确定添加了什么?

此外,我不能保证数组值的提交顺序,所以我不认为每次计算到keyID[]数组的末尾,然后检查其他数组的额外值会给我正确的值。

有什么想法吗?

一个想法是稍微更改最后一个块,如下所示:

...
<input type='hidden' name='keyID[]' value='NEW'/>
<input type='text' name='key[]' value='aCompletelyNewKey'/>
<input type='text' name='value[]' value='aCompletelyNewValue'/>

这样,所有三个数组都将具有相同数量的元素。此外,现在看东西是不是新的也很琐碎。

我认为您可能有点过于复杂了。您可以在字段的名称中传递ID,这样您就可以直接识别它。通常,这将是数据库中的记录ID,或其他一些唯一标识符。假设复选框打开/关闭一个"特色"标志,那么你可以做的事情类似于:

<input name="featured[<?php echo $record['id']; ?>]" value="<?php echo $record['value']; ?>">

$record['value']总是会保存一些数据(可能只是一个空白字符串),这些数据将在提交时更新/处理。

提交时,您需要以$key=>$value的形式遍历$_POST['featured']数组,并将记录的值设置为$value,其中记录id等于$key。如果不存在要更新的记录,可以使用INSERT ON DUPLICATE KEY update sql命令创建一个新记录。

我希望这能有所帮助!

如果将keyID放在每个记录[]中,则可以在数据库中查看更新了哪个记录以及如何更新。

例如:

<input type='text' name='key[1]' value='someKey'/>
<input type='text' name='value[1]' value='someValue'/>
<input type='text' name='key[2]' value='someOtherKey'/>
<input type='text' name='value[2]' value='someOtherValue'/>
<input type='text' name='key[3]' value='yetAnotherKey'/>
<input type='text' name='value[3]' value='yetAnotherValue'/>
<input type='text' name='key[n]' value='aCompletelyNewKey'/>
<input type='text' name='value[n]' value='aCompletelyNewValue'/>

注意,如果通过javascript生成[n],则需要自动递增。

另一个建议是颠倒keyID和key|value名称,这样您就可以接收每个数组元素并将其与数据库进行比较。但这需要一个前缀(比如表名):

<input type='text' name='tablename[1][key]' value='someKey'/>
<input type='text' name='tablename[1][value]' value='someValue'/>