PHP HTML массивы форм - как определить, когда пользователь добавляет новую запись - PullRequest
1 голос
/ 13 февраля 2012

Я прошу прощения за неопределенность названия, но мне трудно это выразить словами.

У меня есть форма, которая содержит 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[]).

Я использовал array_diff() для списка сохраненных в данный момент keyID[] s, чтобы выяснить, что нужно удалить и обновить, но как мне выяснить, что было добавлено, когда не будет keyID[] для новых входов (но будет и key[] и value[])?

Также я не могу гарантировать порядок, в котором будут передаваться значения массивов, поэтому я не думаю, что подсчет до конца массива keyID[], а затем проверка остальных на наличие дополнительных значений даст мне правильный значения каждый раз.

Есть идеи?

Ответы [ 3 ]

2 голосов
/ 13 февраля 2012

Идея состоит в том, чтобы немного изменить последний блок, например:

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

Таким образом, все три массива будут иметь одинаковое количество элементов.Кроме того, теперь легко увидеть, является ли что-то новым или нет.

1 голос
/ 13 февраля 2012

Если вы поместите идентификатор ключа в каждую запись [], вы можете проверить в своей базе данных, какая из них была обновлена ​​и как.

Например:

<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'/>

Обратите внимание, что [n], если оно генерируется с помощью javascript, должно автоматически увеличиваться.

Другим предложением будет инвертировать keyID и имена key|value, чтобы вы могли получать и сравнивать каждый элемент массива с базой данных. Но для этого нужен префикс (например, имя таблицы):

<input type='text' name='tablename[1][key]' value='someKey'/>
<input type='text' name='tablename[1][value]' value='someValue'/>
1 голос
/ 13 февраля 2012

Я думаю, вы можете немного усложнить это. Вы можете передать идентификатор в названии своего поля, чтобы вы могли идентифицировать его напрямую. Обычно это будет идентификатор записи из базы данных или какой-то другой уникальный идентификатор. Предположим, что флажки включают / выключают флаг «Featured» - так что вы можете сделать что-то похожее на это:

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

$ record ['value'] всегда будет содержать некоторые данные (это может быть просто пустая строка), которые будут обновляться / обрабатываться при отправке.

Когда вы отправляете, вам нужно будет перебрать свой массив $ _POST ['featured'] как $ key => $ value и установить значение записи равным $ value, где идентификатор записи равен $ key. Если запись не существует для обновления, вы можете создать новую, используя команду INSERT ON DUPLICATE KEY UPDATE sql.

Надеюсь, это поможет!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...