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

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

  • vasa_c

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

    Spritz 9 января 2008 г. 1: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 г. 5:14, спустя 4 часа 12 минут 13 секунд

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

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

    <html>
    <body>
    <form>
    <input type="text" name="login" <?php print ($check&1)?("value='".$_POST['login]."'"):(NULL) ?> />
    <input type="text" name="password" <?php print ($check&2)?("value='".$_POST['password']."'"):(NULL) ?> />
    <textarea name='info'>
    <?php print ($check&4)?($_POST['info']):(NULL) ?>
    </textarea>
    </form>
    </body>
    </html>
    [/php]
    Сделано с помощью тернарных операторов. Конечно, пример корявый получился, но красиво оформлять времени нет… если интересно будет, потом покрасивее пример напиуш ;)
  • adw0rd

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

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

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

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

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

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

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

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


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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    if(!empty($_POST['go'])){


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



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

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

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

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

    }

    if(!$a){
    print '<form action="contacts.html" method="post"><table width=400 cellpadding="0" cellspacing="0" id="formcontact">

    <tr>

    <td width="79" height="30" >Имя</td>



    <td width="691" style="padding-left:20px"><input type="text" name="name" value="'.$value_name.'" class="inputwhite" ></td>

    </tr>



    <tr>

    <td height="30" >E-mail</td>



    <td style="padding-left:20px" ><input type="text" name="email" value="'.$value_mail.'" class="inputwhite" ></td>

    </tr>



    <tr>

    <td height="30" >Телефон</td>



    <td style="padding-left:20px" ><input type="text" name="phone" value="'.$value_phone.'" class="inputwhite" ></td>

    </tr>



    <tr>

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



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

    </tr>



    <tr>

    <td height="50" ></td>



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

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

    </tr>

    </table></form>';

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

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

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

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

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

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

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

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

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

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

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


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

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

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

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

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

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

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

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

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

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

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

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