Сохранение значений в полях форм при сбое проверки данных - PullRequest
2 голосов
/ 08 февраля 2010

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

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

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

<?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>




 }

Ответы [ 5 ]

2 голосов
/ 08 февраля 2010

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

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

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

UPDATE

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

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

1 голос
/ 08 февраля 2010

EDIT

Вивин заметил, что мое предположение относительно header было неверным, и он был прав в этом. Более того, похоже, что OP делает то, что я изложил ниже, хотя и менее структурированно. Далее Вивин - поймал, что, скорее всего, является реальной проблемой здесь - имя 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;

     } 
   }

так что это предполагает, что ваш 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> 
0 голосов
/ 08 февраля 2010

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

<?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> 
0 голосов
/ 08 февраля 2010

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

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

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

0 голосов
/ 08 февраля 2010

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

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

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