ФорумПрограммированиеПыхнуть хотите?F.A.Q. → Сохранение введенных полей формы

Сохранение введенных полей формы

  • vasa_c

    Сообщения: 3127 Репутация: N Группа: в ухо

    Spritz 9 января 2008 г. 4:02

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


    <?php

    $selectValues = Array(
    0 => '[Выберите что-нибудь]',
    1 => 'Раз',
    2 => 'Два',
    3 => 'Три',
    15 => 'Пятнадцать',
    );

    if ((isSet($_POST['add'])) && (is_array($_POST['add']))) {

    $add = $_POST['add'];

    $errorMessages = Array();

    $add['name'] = isSet($add['name']) ? trim($add['name']) : '';
    if (strLen($add['name']) == 0) {
    $errorMessages[] = 'Вы не ввели имя';
    }

    $add['email'] = isSet($add['email']) ? trim($add['email']) : '';
    if (strLen($add['email']) == 0) {
    $errorMessages[] = 'Вы не ввели e-mail';
    } elseif (!preg_match('/^[^\[email protected]][email protected][^\[email protected]]+$/', $add['email'])) {
    $errorMessages[] = 'e-mail имеет неверный формат';
    $add['email'] = '';
    }

    $add['ta'] = isSet($add['ta']) ? $add['ta'] : '';
    if (strLen($add['ta']) > 1000) {
    $errorMessages[] = 'Что-то вы слишком много понаписали';
    $add['ta'] = '';
    }

    $add['select'] = isSet($add['select']) ? intVal($add['select']) : 0;
    if (!isSet($selectValues[$add['select']])) {
    $add['select'] = 0;
    }
    if ($add['select'] == 0) {
    $errorMessages[] = 'Вы ничего не выбрали из селекта';
    }

    $add['enable'] = isSet($add['enable']);

    $add['site'] = isSet($add['site']) ? trim($add['site']) : '';

    if (sizeOf($errorMessages) == 0) {
    /* Выполнение нужных действий с формой */
    header('Location: http://'.$_SERVER['HTTP_HOST'].$_SERVER['REQUEST_URI']);
    exit();
    }

    } else {
    $add = Array(
    'name' => '',
    'email' => '',
    'ta' => '',
    'select' => 0,
    'enable' => false,
    'site' => 'http://',
    );
    }

    ?>
    <html>
    <head>
    <title>Отправка формы</title>
    <meta http-equiv="content-type" content="text/html; charset=windows-1251" />
    <style type="text/css">
    ul.error {
    width: 500px;
    border: 2px solid #990000;
    background-color: #ffbbbb;
    padding-left: 20px;
    }
    </style>
    </head>
    <body>
    <h1>Отправка формы</h1>
    <?php
    if (isSet($errorMessages)) {
    print '<ul class="error">';
    foreach ($errorMessages as $message) {
    print '<li>'.$message.'</li>';
    }
    print "</ul>\r\n";
    }
    ?>
    <form method="post">
    <table border="0">
    <tr>
    <td>Ваше имя*:</td>
    <td><input type="text" name="add[name]" value="<?php print htmlSpecialChars($add['name']); ?>" style="width:500px" /></td>
    </tr>
    <tr>
    <td>E-mail*:</td>
    <td><input type="text" name="add[email]" value="<?php print htmlSpecialChars($add['email']); ?>" style="width:500px" /></td>
    </tr>
    <tr valign="top">
    <td>Необязательная писанина:</td>
    <td><textarea name="add[ta]" rows="5" style="width:500px"><?php print htmlSpecialChars($add['ta']); ?></textarea></td>
    </tr>
    <tr>
    <td>Выберите что-нибудь*:</td>
    <td>
    <select name="add[select]">
    <?php
    foreach ($selectValues as $value => $text) {
    print '<option value="'.$value.'"'.(($value == $add['select']) ? ' selected="selected"' : '').'>'.$text."</option>\r\n";
    }
    ?>
    </select>
    </td>
    </tr>
    <tr>
    <td>Вкл/выкл:</td>
    <td><input type="checkbox" name="add[enable]" value="1"<?php if ($add['enable']) print ' checked="checked"'; ?> /></td>
    </tr>
    <tr>
    <td>Сайт:</td>
    <td><input type="text" name="add[site]" value="<?php print htmlSpecialChars($add['site']); ?>" style="width:500px" /></td>
    </tr>
    <tr>
    <td> </td>
    <td><input type="submit" value="Отправить данные" /></td>
    </tr>
    </table>
    </form>
    <p>* — поля обязательны для заполнения.</p>
    </body>
    </html>
  • kendo

    Сообщения: 446 Репутация: N Группа: Адекваты

    Spritz 9 января 2008 г. 8:14, спустя 4 часа 12 минут 13 секунд

    Я обычно делаю так (прошу прощения, что на своем примере, некогда в Ваш вникать).

    примерно такой код обработчика:
    <?php
    $error=0;
    if (check_login($_POST[&#39;login&#39;])) $check+=1;
    if (check_password($_POST[&#39;password&#39;])) $check+=2;
    if (check_info($_POST[&#39;info&#39;])) $check+=4;
    // и т.д.
    // В итоге у нас будет число, где каждый бит означает какую-либо ошибку
    ?>
    а вот это код страницы

    <html>
    <body>
    <form>
    <input type=&quot;text&quot; name=&quot;login&quot; <?php print ($check&amp;1)?(&quot;value=&#39;&quot;.$_POST[&#39;login].&quot;&#39;&quot;):(NULL) ?> />
    <input type=&quot;text&quot; name=&quot;password&quot; <?php print ($check&amp;2)?(&quot;value=&#39;&quot;.$_POST[&#39;password&#39;].&quot;&#39;&quot;):(NULL) ?> />
    <textarea name=&#39;info&#39;>
    <?php print ($check&amp;4)?($_POST[&#39;info&#39;]):(NULL) ?>
    </textarea>
    </form>
    </body>
    </html>

    Сделано с помощью тернарных операторов. Конечно, пример корявый получился, но красиво оформлять времени нет… если интересно будет, потом покрасивее пример напиуш ;)
  • adw0rd

    Сообщения: 22902 Репутация: N Группа: в ухо

    Spritz 9 января 2008 г. 9:22, спустя 1 час 8 минут 11 секунд

    KENDO, а что за &quot;check_login&quot;, &quot;check_password&quot; и т.д.???
    adw/0
  • adw0rd

    Сообщения: 22902 Репутация: N Группа: в ухо

    Spritz 9 января 2008 г. 9:26, спустя 3 минуты 29 секунд

    vasa_c, я примерно также делаю.

    Но ИМХО такое:

        $add[&#39;ta&#39;] = isSet($add[&#39;ta&#39;]) ? $add[&#39;ta&#39;] : &#39;&#39;;
    if (strLen($add[&#39;ta&#39;]) > 1000) {
    $errorMessages[] = &#39;Что-то вы слишком много понаписали&#39;;
    $add[&#39;ta&#39;] = &#39;&#39;;
    }


    надо предварительно проверять на JavaScipt (юзабильнее), естественно проверять надо и на стороне серверной части, чтобы всякие умники не подменяли значения.
    adw/0
  • adw0rd

    Сообщения: 22902 Репутация: N Группа: в ухо

    Spritz 9 января 2008 г. 9:27, спустя 1 минуту 20 секунд

    А вот так я не делал еще… Но это мы уже обсуждали :)

        if (sizeOf($errorMessages) == 0) {
    /* Выполнение нужных действий с формой */
    header(&#39;Location: http://&#39;.$_SERVER[&#39;HTTP_HOST&#39;].$_SERVER[&#39;REQUEST_URI&#39;]);
    exit();
    }
    adw/0
  • kendo

    Сообщения: 446 Репутация: N Группа: Адекваты

    Spritz 10 января 2008 г. 4:52, спустя 19 часов 24 минуты 23 секунды

    Мне кажется, или пропало сообщение г-на vasa_c? =)
    А check_login(), check_passw() - функции, которыми проверяем логин, пароль и сообщение. Впринципе можно было сразу в условии проверять длинну, через регулялку прогонять и т.п., просто писать некогда было :)
    Что по поводу ява-скрипта, то согласен сокращает время для пользователей, хотя я уже не раз встречал кривые сайты, где надеются только на яву =)
    И еще, можно я немного попридираюсь? =)

    $add[&#39;ta&#39;] = isSet($add[&#39;ta&#39;]) ? $add[&#39;ta&#39;] : &#39;&#39;;
    // на мой взгляд корректнее бы было написать вот так:
    (!isset($add[&#39;ta&#39;])?($add[&#39;ta&#39;]=&#39;&#39;):(NULL);
    // ибо в Вашем примере просто делается пустая операция - присвоение значения переменной самой себе
  • vasa_c

    Сообщения: 3127 Репутация: N Группа: в ухо

    Spritz 10 января 2008 г. 4:57, спустя 5 минут 36 секунд

    Тернарный оператор, это всё-таки операция имеющая результат и он удобен при вычислении выражений, как простая же замена ифу он несколько кривоват, тогда уж лучше:
    if (!isSet($add[&#39;ta&#39;])) $add[&#39;ta&#39;] = &#39;&#39;;

    Однако у меня при такой форме в других местах происходит первоначальное приведение к нужному виду (trim, intVal) и для однообразия и здесь оставил такую.
    Хотя это не столь существенно.

    Что пропало то, куда?
  • kendo

    Сообщения: 446 Репутация: N Группа: Адекваты

    Spritz 11 января 2008 г. 5:15, спустя 1 день 18 минут

    По поводу пропажи, прошу прощения. Недопонял =)
  • pasha

    Сообщения: 1047 Репутация: N Группа: Адекваты

    Spritz 11 января 2008 г. 12:23, спустя 7 часов 7 минут 38 секунд

    Ну вот мой способ…возможно старый…но проверенный (:

    if(!empty($_POST[&#39;go&#39;])){


    if(strlen($_POST[&#39;name&#39;]) < 3){
    $value_name = &#39;&#39;;
    $error = &#39;&amp;raquo; Вы забыли указать имя имя<br />&#39;;
    }else{
    $value_name = $_POST[&#39;name&#39;];
    }



    if(!preg_match(&#39;|([a-z0-9_\.\-]{1,20})@([a-z0-9\.\-]{1,20})\.([a-z]{2,4})|is&#39;,$_POST[&#39;email&#39;])){
    $value_mail = &#39;&#39;;
    $error .= &#39;&amp;raquo; Вы забыли указать E-mail, или указали его неверно<br />&#39;;
    }else{
    $value_mail = $_POST[&#39;email&#39;];
    }

    if(!preg_match(&#39;([0-9])&#39;,$_POST[&#39;phone&#39;])){
    $value_phone = &#39;&#39;;
    $error .= &#39;&amp;raquo; Вы забыли указать телефон, или указали его неверно<br />&#39;;
    }else{
    $value_phone = $_POST[&#39;phone&#39;];
    }

    if(strlen($_POST[&#39;text&#39;]) < 3){
    $value_text = &#39;&#39;;
    $error .= &#39;&amp;raquo; Вы забыли заполнить текст<br />&#39;;
    }else{
    $value_text = $_POST[&#39;text&#39;];
    }

    if(!$error){
    $a = 1;
    }else{
    print &#39;Допущены ошибки : &#39;.$error.&#39;<br />&#39;;
    }

    }

    if(!$a){
    print &#39;<form action=&quot;contacts.html&quot; method=&quot;post&quot;><table width=400 cellpadding=&quot;0&quot; cellspacing=&quot;0&quot; id=&quot;formcontact&quot;>

    <tr>

    <td width=&quot;79&quot; height=&quot;30&quot; >Имя</td>



    <td width=&quot;691&quot; style=&quot;padding-left:20px&quot;><input type=&quot;text&quot; name=&quot;name&quot; value=&quot;&#39;.$value_name.&#39;&quot; class=&quot;inputwhite&quot; ></td>

    </tr>



    <tr>

    <td height=&quot;30&quot; >E-mail</td>



    <td style=&quot;padding-left:20px&quot; ><input type=&quot;text&quot; name=&quot;email&quot; value=&quot;&#39;.$value_mail.&#39;&quot; class=&quot;inputwhite&quot; ></td>

    </tr>



    <tr>

    <td height=&quot;30&quot; >Телефон</td>



    <td style=&quot;padding-left:20px&quot; ><input type=&quot;text&quot; name=&quot;phone&quot; value=&quot;&#39;.$value_phone.&#39;&quot; class=&quot;inputwhite&quot; ></td>

    </tr>



    <tr>

    <td valign=&quot;top&quot; height=&quot;150&quot; style=&quot;padding: 6px 0px 0px 0px;&quot;>Вопрос</td>



    <td style=&quot;padding: 6px 20px 11px 20px;&quot;><textarea name=&quot;text&quot; rows=&quot;5&quot; cols=&quot;35&quot; class=&quot;inputwhite&quot; >&#39;.htmlspecialchars($value_text).&#39;</textarea></td>

    </tr>



    <tr>

    <td height=&quot;50&quot; ></td>



    <td style=&quot;padding-left:20px&quot;><input type=&quot;submit&quot; name=&quot;go&quot; value=&quot;Отправить&quot; style=&quot;width:120px&quot; class=&quot;button&quot;>

    &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;<input type=&quot;reset&quot; class=&quot;button&quot; style=&quot;width:120px&quot; value=&quot;Очистить&quot; ></td>

    </tr>

    </table></form>&#39;;

    }else{
    /* Отправляем */
    }
  • NRG

    Сообщения: 4761 Репутация: N Группа: в ухо

    Spritz 11 января 2008 г. 12:48, спустя 25 минут 11 секунд

    Лично я придерживаюсь того же мнения, что и adw0rd.
    Потому что сам так делаю… =)
    Написать джаваскриптовую ф-ию и проверять валидность всех данных у клиента (естессно на сервере тоже проверять).
    Просто таким способом чуть уменьшится трафик, а на сервер в основном будут поступать только валидные даныые.
    И еще один &quot;минус&quot; выполнения всех проверок сервером, это то, что пользователям с низкоскоросным инетом приходится неизвестно сколько ожидать, а в ответ получить (к примеру) месаг, о том что не совпали введенные им пароли.

    т.е. таким простым ходом убиваецо несколько зайцев. =)
  • vasa_c

    Сообщения: 3127 Репутация: N Группа: в ухо

    Spritz 11 января 2008 г. 12:51, спустя 2 минуты 21 секунду

    Проверка на JS нисколько не отменяет всего вышесказанного.
    Тем более многое на JS по простому не проверишь. Уникальность имени, например.
  • NRG

    Сообщения: 4761 Репутация: N Группа: в ухо

    Spritz 11 января 2008 г. 13:04, спустя 13 минут 17 секунд

    Тем более многое на JS по простому не проверишь. Уникальность имени, например.


    можно.
    в фоновом режиме делать запрос к серверу…
    правда это АЯКСом называецо….
    но все равно ж JS.
  • vasa_c

    Сообщения: 3127 Репутация: N Группа: в ухо

    Spritz 11 января 2008 г. 13:06, спустя 2 минуты 33 секунды

    ключевое словосочетание &quot;по простому&quot;.
  • NRG

    Сообщения: 4761 Репутация: N Группа: в ухо

    Spritz 11 января 2008 г. 13:09, спустя 2 минуты 40 секунд

    согласен, не слишком просто…
    но и не сложно…
  • NRG

    Сообщения: 4761 Репутация: N Группа: в ухо

    Spritz 11 января 2008 г. 13:30, спустя 20 минут 35 секунд

    кстати вот пример регистрации которую использую я.
    давно уже хотел выложить , но чето никак руки не доходили…

    кому интересно, гляньте…
    критика приветствуется. =)
    1. my.zip (204)

Пожалуйста, авторизуйтесь, чтобы написать комментарий!