Что-то не так с моей формой? - PullRequest
0 голосов
/ 14 декабря 2010

Моя форма работает, все ошибки и все работает.Но если у вас есть ошибка, она обновляет страницу и удаляет любой текст, который был вставлен до нажатия кнопки «Отправить», и вам необходимо повторно ввести всю информацию.В любом случае, чтобы это исправить?

Я думаю, это как-то связано с неиспользованием $ _SERVER ["PHP_SELF"] в действии формы.Вместо этого у меня есть action = ""

. Я делаю это, потому что страница, которая должна быть обновлена ​​с той же самой информацией, имеет переменную в своем URL-адресе (month_specials_info.php? Date = Dec10), которая была помещена туда изПоследняя страница.

Я попытался использовать

<form method="post" action="'.$_SERVER["PHP_SELF"].'?date='.$date.'">

, и он дал правильный URL.но текст все равно был удален при отправке формы (с ошибками) .. какие-либо идеи?

Код формы:

echo '    <div id="specialsForm"><h3>Interested in this coupon? Email us! </h3>
                                            <form method="post" action="'.$_SERVER["PHP_SELF"].'?date='.$date.'">
                                              Name: <input name="name" type="text" /><br />
                                              Email: <input name="email" type="text" /><br />
                                              Phone Number: <input name="phone" type="text" /><br /><br />
                                              Comment: <br/>
                                              <textarea name="comment" rows="5" cols="30"></textarea><br /><br />
                                              <input type="submit" name="submit" value="Submit Email"/>
                                            </form></div>
                                            <div style="clear:both;"></div><br /><br />';

и vaildator:

if(isset($_POST['submit'])) {

                                                $errors = array();
                                                if (empty($name)) {
                                                    $errors[] = '<span class="error">ERROR: Missing Name </span><br/>';
                                                }
                                                if (empty($phone) || empty($email)) {
                                                    $errors[] = '<span class="error">ERROR: You must insert a phone number or email</span><br/>';
                                                }
                                                if (!is_numeric($phone)) {
                                                    $errors[] = '<span class="error">ERROR: You must insert a phone number or email</span><br/>';
                                                }
                                                if (!preg_match('/[A-Z0-9._%+-]+@[A-Z0-9.-]+\.[A-Z]{2,4}/', strtoupper($email))) {
                                                    $errors[] = '<span class="error">ERROR: Please Insert a valid Email</span><br/>';
                                                }
                                                if ($errors) {
                                                    echo '<p style="font-weight:bold;text-align:center;">There were some errors:</p> ';
                                                    echo '<ul><li>', implode('</li><li>', $errors), '</li></ul><br/>';
                                                } else {
                                                    mail( "email@hotmail.com", "Monthly Specials Email",
                                                        "Name: $name\n".
                                                        "Email: $email\n".
                                                        "Phone Number: $phone\n".
                                                        "Comment: $comment", "From: $email");
                                                    echo'<span id="valid">Message has been sent</span><br/>';
                                                }
}

Ответы [ 6 ]

1 голос
/ 14 декабря 2010

Браузер не обязан (p) заполнять форму. Некоторые делают для удобства, но вы не можете полагаться на это.

Если вы снова отобразите форму, вы можете установить значения входов следующим образом:

$value = isset($_POST['foo']) : $_POST['foo'] : '';
echo '<input type="text" value="'. $value .'" name="foo" />';

Конечно, вы должны проверить и санировать POST-данные, прежде чем включать их в ваш HTML, чтобы не открывать какие-либо уязвимости XSS.

1 голос
/ 14 декабря 2010

Во-первых: вы не можете доверять '. $ _ SERVER его можно изменить.Будьте осторожны с этим!

Второе: вы могли бы (должны?) Использовать скрытое поле вместо указания его в действии?

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

Вы можете использовать ajax , чтобы исправить это (я полагаю, что у старого старого HTML есть этот побочный эффект?).

0 голосов
/ 14 декабря 2010

Браузеры не будут повторно заполнять форму для вас, особенно при выполнении POST. Поскольку вы не строите форму с полями, заполненными value="" чанками, браузеры просто отобразят для вас пустые поля.

Очень простой скрипт обработки формы будет выглядеть примерно так:

<?php

if ($_SERVER['REQUEST_METHOD'] = 'POST') {
    # do this only if actually handling a POST
    $field1 = $_POST['field1'];
    $field2 = $_POSt['field2'];
    ...etc...

    if ($field1 = '...') {
       // validate $field1
    }
    if ($field2 = '...') {
       // validate $field2
    }
    ... etc...

    if (everything_ok) {
        // do whatever you want with the data. insert into database?
        redirect('elsewhere.php?status=success')
    } else {
       // handle error condition(s)
    }
} // if the script gets here, then the form has to be displayed

<form method="POST" action="<?php echo $_SERVER['SCRIPT_NAME'] ?>">
<input type="text" name="field1" value="<?php echo htmlspecialchars($field1) ?>" />
<br />
<input type="text" name="field2" value="<?php echo htmlspecialchars($field2) ?>" />
etc...
<input type="submit" />
</form>

?>

Обратите внимание на использование htmlspecialchars() в последнем бите, где выводятся поля формы. Рассмотрим случай, когда кто-то вводит метасимвол html (", <, >) в поле. Если по какой-либо причине необходимо отобразить форму, эти символы будут выведены в html и «сломают» форму. И каждый браузер будет «ломаться» по-своему. Некоторых это не волнует, некоторые (* кашель * IE * кашель *) будут ломать биты по всему полу. При использовании htmlspecialchars() эти метасимволы будут «экранированы», чтобы они отображались правильно и не ломали форму.

Кроме того, если вы собираетесь выводить большие куски HTML и, возможно, встраивать в них переменные PHP, вам стоит прочитать HEREDOC s. Это специальная конструкция, которая действует как многострочная строка в двойных кавычках, но освобождает вас от необходимости экранировать кавычки. Они делают код более читабельным, и вам не нужно беспокоиться о выборе правильного типа кавычек или правильного количества кавычек, когда вы переходите в / из «строкового режима» для вывода переменных.

0 голосов
/ 14 декабря 2010

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

По сути, ничего не зная о вашем проекте, куда отправляются отправленные строки, если они хранятся в базе данных или где-то еще, что означает эта страница в контексте вашего проекта, я не могу написать специальный скрипт, который делает отправленную строку запоминающейся в будущая перезагрузка страницы, но для уточнения некоторых вещей:

Если есть форма, которая определена как <form></form> и отправлена ​​с <input type="submit"/> (что должно быть достаточно, без указания имени name="submit"), страница обновляется, и она не автоматически запоминает введенные вами ранее данные. Для этого у вас есть 2 варианта:

  1. Используйте Ajax (отметьте Jquery как хорошую основу для ajax), что позволит вам отправлять формы без обновления страницы. Я выбрал его в качестве первого способа, потому что он используется всеми, и он будет все больше и больше использоваться, потому что он новый и работает без сбоев.
  2. Создайте php-скрипт, который позволит вам проверить, были ли введенные данные уже отправлены; если ответ true, восстановите значения и получите их следующим образом: <input type="text" value="<?php echo $value ?>"/>.

Также обратите внимание, что вам не нужно '.$_SERVER["PHP_SELF"].'?date='.$date.', поскольку достаточно ?date='.$date.'.

0 голосов
/ 14 декабря 2010

сначала несколько общих изменений:

изменение

<form method="post" action="'.$_SERVER["PHP_SELF"].'?date='.$date.'">

до

<form method="post" action="'.$_SERVER["PHP_SELF"].'">
    <input type="hidden" name="data" value="'.$date.'" />

ответ на ваш оригинальный вопрос:

установить каждый атрибут input elements value с $_POST['whatever'], если array_key_exists('whatever', $_POST);

Например: поле имени

<input type="text" name="name" value="<?php echo array_key_exists('name', $_POST) ? $_POST['name'] : ''; ?>" />
0 голосов
/ 14 декабря 2010

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

<input type="hidden" name="date" value="'.$date.'"/>
...