Хорошо, так что это общий сценарий.
У вас есть html-форма, которая включает в себя редактирование информации. Исходная информация поступает из базы данных. Когда вы публикуете форму, она может не сохранять информацию немедленно, потому что что-то может потребоваться при проверке данных, возможно, одно из обязательных полей остается пустым. В результате вы хотите повторно отобразить поле формы, но если есть данные для публикации, отобразите данные сообщения, если нет, отобразите исходные данные из базы данных.
Поэтому я создал функцию проверки сообщения, а затем по умолчанию некоторые произвольные данные (в данном случае из базы данных).
Но в целом, подход чувствует себя неэлегантным, данные POST невидимо выводятся внутри функции из глобального, но если я передаю данные post, я должен передать его для каждого вызова функции, и это почти так же многословно, как просто делать это от руки каждый раз, поэтому я специально ищу альтернативы этому подходу, и обычно мне бы хотелось получить советы по лучшим способам решения этого сценария формы, с которым я работаю каждый раз, когда я редактирую html-формы.
// Pull from post or get, or else use data, eg from the database, to populate a form. function in_or_data($index, $data, $trim=false){ return $_POST[$index]? ($trim ? trim($_POST[$index]) : $_POST[$index]) : $data[$index]; } <?php $item_name = in_or_data('item_name', $data_from_database_somewhere); // Pull post data, with defaults coming from the ?> // ..... Later, some example html that just escapes & echoes out the data. ..... <td id='item-name'><input name="item_name" type="text" id="item_name" value="<?php echo escape($item_name); ?>" size="47" maxlength="100" tabindex="9"></td>
Как я могу улучшить работу с формами, которые получают свои данные либо из базы данных изначально, либо из должности после того, как выполняется какое-либо представление?
<input type="text" name="abc" value="<?php array_key_exists('abc', $_REQUEST) ? $_REQUEST['abc'] : "default value goes here" ?>" />
Более элегантное решение, хотя и серьезное количество работ, будет включать использование ajax (jquery и т. Д.) Для выполнения проверки на стороне сервера в форме, перед отправкой.
То, что вы делаете, кажется мне прекрасным. В основном то, что я делаю в той же ситуации, есть скрытое поле в форме что-то вроде
<input name="is_edit"` ... />
и на моем PHP просто проверьте для $_POST['is_edit']
чтобы я ничего не $_POST['is_edit']
из базы данных. Одна из проблем, связанных с выполнением каждого поля в отдельности, как и вы, заключается в том, что для определенных вещей (например, флажков), если пользователь не проверяет флажок, $_POST['checkbox_data']
не будет установлен, поэтому я верю вы в конечном итоге вытащили бы это из базы данных, используя функцию, указанную выше. Это должно быть либо все, либо ничего, что вытаскивается БД. Поэтому я делаю что-то вроде этого:
<?php if (isset($_POST['is_edit'])) { $var1 = $_POST['var1']; $var2 = $_POST['var2']; // etc } else { $data = do_db_query_and_get_data(); $var1 = $data['var1']; $var2 = $data['var2']; // etc } ?> <input type="something" value="<?php echo $var1; ?>" /> <input type="something" value="<?php echo $var2; ?>" /> <input type="hidden" name="is_edit" value="1" />
Выполнение этого так же имеет другое преимущество, заключающееся в том, что вам не нужно делать запрос к базе данных, если это необходимо.
В дополнение к моему первоначальному php-коду я начал использовать атрибуты html5, как требуется, и установил типы форм html5, такие как число, адрес электронной почты и т. Д. Это действительно действительно улучшило мои формы для браузеров, которые поддерживают аспекты формы html5, и это ухудшает в стандартные текстовые поля и игнорирует требуемый атрибут в браузерах, которые не поддерживают html5.