2010-02-08 2 views
2

У меня возникают проблемы с поиском, как сохранить данные пользователей при неудачной проверке. Я несколько новичок в 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> 




} 
+0

Можете ли вы предложить некоторые особенности о том, как он не работает? –

ответ

2

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

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

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

UPDATE

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

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

+0

+1 - хороший улов на html -> несоответствие php в именах полей. – prodigitalson

+0

Перемешивание имени UserName было просто мной, когда я что-то выбрасывал. Но вы, как и большинство из этих комментариев, ответили на мой вопрос. – brad

1

EDIT:

Vivin прокомментировал, что мое предположение относительно 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; 

    } 
    } 

так это предполагает, что ваш 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

Могли бы сделать что-то подобное, если не удалось, то значение = $ _ POST [ «значение»]

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

0

ОК, во-первых, 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(), заключается в том, что в противном случае пользователь может вводить вредоносный код на страницу.

0

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

<?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> 
Смежные вопросы