Сохранение значений в полях форм при неудачной проверке данных

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

В настоящее время, если проверка не удалась, все поля очищены и данные $ _Post также исчезли.

Вот некоторый код, предполагающий, что пользователь вводит неверный адрес электронной почты. Я хочу, чтобы поле Name было сохранено. Этот код не работает.

<?php if($_POST['doSubmit'] == 'Submit') { $usr_name = $data['Name']; $usr_email = $data['Email']; if (isEmail($usr_email)==FALSE){ $err = "Email is invalid."); header("Location: index.php?msg=$err"); exit(); } //do whatever with data } if (isset($_GET['msg'])) { $msg = mysql_real_escape_string($_GET['msg']); echo "<div class=\"msg\">$msg</div><hr />"; } if (isset ($_POST['Name'])){ $reusername = $_POST['Name'];} else{$reusername = "NOTHING";}//to test ?> <form action="index.php" method="post" > <input name="UserName" type="text" size="30" value="<?echo $reusername;?>"> <input name="Email" type="text" size="30"> <input name="doSubmit" type="submit" value="submit"> </form> } 

Вы можете использовать AJAX для отправки данных своей формы на свой PHP-скрипт и вернуть данные JSON, которые указывают, была ли проверка успешной или нет. Таким образом, ваши поля не будут очищены.

Другой способ – отправить обратно записанные параметры на страницу публикации, а на странице проводки заполнить поля с помощью PHP.

Однако, я думаю, первое решение лучше.

ОБНОВИТЬ

Редактирование делает ваш код более четким, и я заметил что-то. Ваше поле ввода называется UserName в HTML, но вы имеете в виду Name в PHP. Вероятно, поэтому он не работает. Всегда ли ваше поле заполнено значением NOTHING ? Убедитесь, что имя поля ввода и индекс, который вы используете в $_POST , совпадают.

Кроме того, нет необходимости перенаправлять на другую страницу (используя заголовок), если у вас есть ошибка. Ведите массив или переменную $errors чтобы печатать сообщения об ошибках на одной странице. Но, как я уже упоминал ранее, вероятно, лучше использовать подход JSON, так как вы можете отделить свой уровень представления (html) от PHP (уровня контроллера). Таким образом, вы помещаете свой HTML в один файл, а ваш PHP – в другой файл.

EDIT :

Вивин прокомментировал, что мое предположение относительно header было неправильным, и он был прав в этом. Более того, похоже, что то, что делает OP, – это то, что я выложил ниже, хотя и менее структурированным. Далее Vivin – поймал, что может быть актуальной проблемой здесь – имя html и ключ массива $ _POST не совпадают.


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

Например:

// myform.php

  if(strtolower($_SERVER['REQUEST_METHOD']) == 'get') { ob_start(); include('form.inc.php'); // we load the actual view - the html/php file $content = ob_get_clean(); print $content; // we print the contents of the view to the browser exit; } elseif(strtolower($_SERVER['REQUEST_METHOD']) == 'post') { $form = santize($_POST); // clean up the input... htmlentities, date format filters, etc.. if($data = is_valid($form)) { process_data($data); // this would insert it in the db, or email it, etc.. } else { $errors = get_errors(); // this would get our error messages associated with each form field indexed by the same key as $form ob_start(); include('form.inc.php'); // we load the actual view - the html/php file $content = ob_get_clean(); print $content; // we print the contents of the view to the browser exit; } } в  if(strtolower($_SERVER['REQUEST_METHOD']) == 'get') { ob_start(); include('form.inc.php'); // we load the actual view - the html/php file $content = ob_get_clean(); print $content; // we print the contents of the view to the browser exit; } elseif(strtolower($_SERVER['REQUEST_METHOD']) == 'post') { $form = santize($_POST); // clean up the input... htmlentities, date format filters, etc.. if($data = is_valid($form)) { process_data($data); // this would insert it in the db, or email it, etc.. } else { $errors = get_errors(); // this would get our error messages associated with each form field indexed by the same key as $form ob_start(); include('form.inc.php'); // we load the actual view - the html/php file $content = ob_get_clean(); print $content; // we print the contents of the view to the browser exit; } } в  if(strtolower($_SERVER['REQUEST_METHOD']) == 'get') { ob_start(); include('form.inc.php'); // we load the actual view - the html/php file $content = ob_get_clean(); print $content; // we print the contents of the view to the browser exit; } elseif(strtolower($_SERVER['REQUEST_METHOD']) == 'post') { $form = santize($_POST); // clean up the input... htmlentities, date format filters, etc.. if($data = is_valid($form)) { process_data($data); // this would insert it in the db, or email it, etc.. } else { $errors = get_errors(); // this would get our error messages associated with each form field indexed by the same key as $form ob_start(); include('form.inc.php'); // we load the actual view - the html/php file $content = ob_get_clean(); print $content; // we print the contents of the view to the browser exit; } } 

так что это предполагает, что ваш form.inc.php всегда имеет вывод сообщений об ошибках, закодированных в нем – он просто не отображает их. Поэтому в этом файле вы можете увидеть что-то вроде:

 <fieldset> <label for="item_1"> <?php echo isset($error['item_1']) ? $error['item_1'] : null; ?> Item 1: <input id="item_1" value="<?php echo $form['item_1'] ?>" /> </label> </fieldset> 

Может сделать что-то похожее, если не удалось, тогда значение = $ _ POST ['value']

Но ответ Вивина лучше всего. Я не очень разбираюсь в AJAX и не смогу справиться с этим.

Хорошо, сначала header("Location: index.php?msg=$err"); на самом деле не требуется. Лучше всего не переадресовывать это при ошибке, а отображать ошибки на одной странице. Кроме того, перенаправление таким образом означает, что вы потеряете все данные сообщения в форме, чтобы вы никогда не могли распечатать их обратно на входы.

Что вам нужно сделать, так это:

 <input name="Email" type="text" size="30" value="<?php print (!$err && $usr_email ? htmlentities($usr_email, ENT_QUOTES) : '') ?>"> 

Здесь я проверяю, существуют ли какие-либо ошибки, а также установлена ​​ли переменная $usr_email . Если оба эти условия совпадают, данные публикации печатаются в атрибуте value поля.

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

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

 <?php if( isset( $_POST['number'] ) ) { $number = $_POST['number']; // validate if( $number < 10 ) { // process it and then; header('Location: success_page.php'); } else { $err = 'Your number is too big'; } } else { $number = ''; $err = ''; } ?> <form method="POST"> Enter a number less than 10<br/> <?php echo $err ?><br/> <input name="number" value="<?php echo $number ?>"><br/> <input type="submit"> </form>