Упрощение форм PHP, которые предварительно заполняются данными базы данных и проверкой ошибок, поэтому активно перезаписывайте данные $ _POST - PullRequest
1 голос
/ 11 августа 2011

Хорошо, это обычный сценарий.

У вас есть HTML-форма, которая включает редактирование информации. Первоначальная информация поступает из базы данных. Когда вы публикуете форму, она может не сохранить информацию сразу, потому что, возможно, что-то нужно исправить, когда проверка данных будет выполнена, возможно, одно из обязательных полей оставлено пустым. В результате вы хотите снова отобразить поле формы, но если были данные публикации, отобразите данные публикации, если нет, отобразите исходные данные из базы данных.

Итак, я создал функцию для проверки сообщений, а затем по умолчанию для некоторых произвольных данных (в данном случае из базы данных).

Но в целом этот подход выглядит не элегантным, данные POST незаметно извлекаются из функции из глобальной функции, но если я передаю данные post, я должен передавать их для каждого вызова функции, и он почти такой же многословный, как просто делаю это каждый раз вручную, так что конкретно я ищу альтернативы этому подходу, и в целом я бы хотел получить совет о лучших способах решения этого сценария формы, с которым я сталкиваюсь каждый раз, когда редактирую HTML-формы.

// Pull from post or get, or else use data, e.g. 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>

Как мне улучшить работу с формами, которые получают свои данные либо из базы данных изначально, либо из почты после того, как делается какая-то отправка?

Ответы [ 3 ]

2 голосов
/ 11 августа 2011
<input type="text" name="abc" value="<?php array_key_exists('abc', $_REQUEST) ? $_REQUEST['abc'] : "default value goes here" ?>" />

Более элегантное решение, хотя и требует значительных усилий, предполагает использование ajax (jquery и т. Д.) Для проверки на стороне сервера в форме ДО фактической отправки.

1 голос
/ 11 августа 2011

То, что вы делаете, мне кажется нормальным. В основном то, что я делаю в той же ситуации, это скрытое поле в форме что-то вроде

<input name="is_edit"` ... />

и в моем PHP просто проверьте $_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" />

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

0 голосов
/ 01 сентября 2011

В дополнение к моему исходному php-коду я начал использовать атрибуты html5, как это требуется, и задавать типы форм html5, такие как число, электронная почта и т. Д. Это действительно значительно улучшило мои формы для браузеров, которые поддерживают аспекты форм html5, и он понижается до стандартных текстовых полей и игнорирует обязательный атрибут в браузерах, которые не поддерживают html5-формы.

...